/**
* container容器 contain包含 Collection单例集合 Map双例集合
* Collection 集合中的元素是逐个存放的 Map集合中元素成对存储 KV对 key键value值对
* Collection根接口分List子接口和Set子接口 List接口为有序(可通过index索引查找)、元素可重复 Set接口为无序元素不可重复
* ArrayList为List接口的实现类
*/
public class TestArrayList1 {
public static void main(String[] args) {
List<String> s1 = new ArrayList<>();
//List<E>接口 E(element) ArrayList<E>泛型类implements实现List<E>泛型接口 写到等式中时两个E是同一个
//所以和ArrayList<String> s1 = new ArrayList<>();一样 new右侧的<>不填
//使用接口引用实现类的好处是不会受到实现类的修改的影响
s1.add(“a”);
//ArrayList实现在Collection接口中定义的方法.add(Object) 实现为向容器中添加一个元素 添加至末尾 返回boolean添加操作是否成功 在添加元素a后容器.size()长度变为1
s1.add(0,”b”);
//ArrayList实现在List接口中定义的方法.add(int index,Object) 向容器中指定位置index插入一个元素 该位置原元素及后面的元素全部后移 添加元素b后容器长度变为2
// s1.add(3,”c”);报错 Exception in thread “main” java.lang.IndexOutOfBoundsException: Index: 3, Size: 2
//bounds界限 index不能超出容器的.size()长度范围 s1当前长度为2 index只可以是0,1,2 已存在的元素下标是0,1 所以如果add(2,Object)即为向末尾添加元素
System.out.println(s1.get(0));
//ArrayList实现在List接口中定义的方法.get(int index) 返回index索引位的元素 因为b插入0位使得a变为1位 所以结果为b
for (int i=0;i<s1.size();i++){
//ArrayList实现在Collection接口中定义的.size()方法 返回容器列表中的元素总数int 如果超过Integer.MAX_VALUE则返回最大值MAX_VALUE
System.out.println(s1.get(i));
//遍历
}
for (String s:s1){
//for-each遍历容器
System.out.println(s);
}
System.out.println(s1.remove(0));
//ArrayList实现在List接口中定义的.remove(int index)方法 删除index索引位的元素 该位后面的元素全部前移 方法会返回被删除的元素 0位为b所以结果为b
System.out.println(s1.remove(“a”));
//ArrayList实现在Collection接口中定义的.remove(Object o)方法 删除传入的元素/对象 该方法只会删除1个元素 后面的元素全部前移 返回boolean删除操作是否成功
s1.add(“c”);
System.out.println(s1.set(0,”d”));
//List接口的.set(int index,Object o) 替换index索引位的元素为o 返回被替换掉的元素 结果为c
s1.clear();
//Collection接口的.clear() 清空容器 无返回 清空后.size()为0
System.out.println(s1.isEmpty());
//Collection接口的.isEmpty() 判断容器是否为空
s1.add(“e”);
s1.add(“f”);
System.out.println(s1.contains(“f”));
//Collection接口的.contains(Object o) 判断容器中是否包含o 结果为true
s1.add(“e”);
System.out.println(s1.indexOf(“e”));
//List接口的.indexOf(Object o) 在容器中查找o 存在则返回第一个index 不存在则返回-1
System.out.println(s1.lastIndexOf(“e”));
//.lastIndexOf(Object o)返回最后一个index 不存在则返回-1
Object[] o1 = s1.toArray();
//Collection的.toArray()将单例集合转换为数组array 返回类型固定Object[]
//String[] str1 = (String[])o1;报错[Ljava.lang.Object; cannot be cast to [Ljava.lang.String; Object[]数组不能强转为 String []
//当需要转为同泛型类型的数组时不能使用无参的.toArray()方法
for (Object o:o1){
System.out.println((String) o);
//强转只可以对单独元素进行 不能对集合强转
}
String[] str1 = new String[s1.size()];
s1.toArray(str1);
//Collection的.toArray(T[] a) 将容器中的元素放到实参指定的数组中 泛型 方法 根据传入实参的类型决定返回值类型
//传入的参数必须初始化 且不能为null会报空指针异常 需要创建好数组的长度 .toArray()方法会对传进的str1直接修改 方法执行后str1已经改变了 方法还会将str1返回
System.out.println(Arrays.toString(str1));
//str1已经被修改 结果为[e, f, e]
String[] str01 = s1.toArray(new String[0]);
System.out.println(str01.length);
//通过new数组赋值给引用变量 用一条语句执行
//当实参数组的长度小于容器.size()时 会生成一个新的数组 长度为.size()
List<String> s2 = new ArrayList<>();
s2.add(“1”);
s2.add(“2”);
s2.add(“1”);
//s1的内容为e,f,e s2的内容为1,2,1
System.out.println(s1.addAll(s2));
//Collection的.addAll(Collection<? extends E> c) 将c添加到this容器中 c的泛型类型必须是this的泛型类型的同类或子类 返回boolean操作是否成功 当s2为空时返回false
System.out.println(s1);
//ArrayList实现的.addAll() c会添加到this的末尾 结果为[e, f, e, 1, 2, 1] addAll即并集 s1为空也可以.addAll(s2)
s2.clear();
s2.add(“e”);
s2.add(“1”);
System.out.println(s1.retainAll(s2));
//Collection的.retainAll(Collection<?> c) retain保持保留 对s1中现有的元素进行操作 仅保留出现在s2中元素 即求交集 返回 boolean 因为是对this容器进行删减 形参c不需要限定extends E
System.out.println(s1);
//结果[e, e, 1, 1] 只要是符合的元素会保留所有数量 删减不符合的元素将后面的元素前移
s2.remove(“1”);
System.out.println(s1.removeAll(s2));
//Collection的.removeAll(Collection<?> c) 删除this中存在于c中的元素 即求差集 返回boolean 符合的元素会删除所有数量
System.out.println(s1);
//结果[1, 1]
ArrayList<String> s3 = new ArrayList<>();
s3.add(“1”);
}
}