1 @SuppressWarnings({ "unchecked", "rawtypes" }) //注解 2 public class Demo1_Collection { 3 /* 4 * 引用数据类型数组中存的都是对象的地址值,而非对象中的属性值 5 *A:集合和数组的区别: 6 * 区别1: 7 * 数组可以存储基本数据类型(值),也可以存储引用数据类型(地址值) 8 * 集合只能存储引用数据类型,但是也可以存储基本数据类型,只不过是存储是会自动装箱变成对象 9 * 区别2: 10 * 数组的长度是固定的,不能自动增长 11 * 集合的长度是可变的,可以根据元素的增加而增加 12 * B:数组和集合何时使用对应的哪种: 13 * 1.当元素个数固定的时候推荐使用数组;固定元素个数的时候用数组效率更高,因为它是上来就创建好了 14 * 2.当元素个数变化时候推荐使用集合 15 * C:Collection中的成员方法 16 * boolean add(Object c) 增加元素 17 * boolean remove(Object c) 移除元素 18 * void clear() 清空集合 19 * boolean contains(Object o) 判断是否包含某个元素 20 * boolean isEmpty() 判断集合是否为空 21 * int size() 获取元素的个数 22 * D:注意 23 * add方法List集合一直都返回true,是因为List集合可以存储重复元素,但是如果是Set集合存储重复元素时是会返回false的 24 * ArrayList的父类的父类重写了toString方法,所以打印对象时输出的结果不是Object类中toString的结果 25 * 26 */ 27 public static void main(String[] args) { 28 29 //demo1(); 30 demo2(); 31 32 } 33 34 public static void demo2() { 35 Collection c = new ArrayList(); 36 c.add(new String("abc")); 37 c.add("b"); 38 c.add("c"); 39 c.add("d"); 40 c.add(new Student("adda", 19)); 41 System.out.println(c); //[a, b, c, d] 42 c.remove("c"); 43 System.out.println(c); //[a, b, d] 44 System.out.println(c.contains("a")); //true 45 System.out.println(c.isEmpty()); //false 46 System.out.println(c.size()); //3 47 c.clear(); 48 System.out.println(c); //[] 49 } 50 51 public static void demo1() { 52 Collection c = new ArrayList(); 53 boolean b = c.add("abc"); 54 c.add(true); //这里会自动装箱将基本数据类型true转换成包装类型存入 55 c.add(100); //同上,会自动装箱 56 System.out.println(b); 57 System.out.println(c); 58 } 59 }
1 public class Demo2_Collection { 2 3 /* 4 * a. 集合的遍历,其实就是依次获取集合中的元素 5 * b. 把集合转换成数组,就可以实现集合的遍历 6 * toArray() 7 * c.注意 8 * 自定义类中需要重写toString方法,否则打印出的对象c是打印的自定义类的地址 9 */ 10 public static void main(String[] args) { 11 //demo1(); 12 Collection c = new ArrayList(); 13 c.add(new Student("lisi", 18)); 14 c.add(new Student("zhangsan", 16)); 15 System.out.println(c); 16 Object[] arr = c.toArray(); 17 for (int i = 0; i < arr.length; i++) { 18 System.out.println(arr[i]); 19 Student s = (Student) arr[i]; //向下转型 20 System.out.println(s.getName() + "...." + s.getAge()); 21 } 22 23 } 24 25 public static void demo1() { 26 Collection c = new ArrayList(); 27 c.add("a"); 28 c.add("b"); 29 Object[] arr = c.toArray(); //将集合转换成数组 30 for (int i = 0; i < arr.length; i++) { 31 System.out.println(arr[i]); 32 } 33 } 34 35 }
1 public class Demo3_CollectionAll { 2 3 /* 4 * all相关的方法 5 * boolean addAll(Collection c) 6 * boolean removeAll(Collection c) 实质删除的是两个集合的交集 7 * boolean containsAll(Collection c) 判断c中的所有元素是否都在调用集合中存在 8 * boolean retainAll(Collection c) 取交集 9 */ 10 public static void main(String[] args) { 11 12 //demo1(); 13 //demo2(); 14 //demo3(); 15 Collection c1 = new ArrayList(); 16 c1.add("a"); 17 c1.add("b"); 18 c1.add("c"); 19 c1.add("d"); 20 21 /*Collection c2 = new ArrayList(); 22 c2.add("a"); 23 c2.add("b"); 24 c2.add("z"); 25 boolean b = c1.retainAll(c2); 26 System.out.println(b); //true 27 System.out.println(c1); //[a, b] 28 29 Collection c3 = new ArrayList(); 30 c3.add("aa"); 31 c3.add("bb"); 32 boolean b2 = c1.retainAll(c3); 33 System.out.println(b2); //true 34 System.out.println(c1); //[] 35 */ 36 //看调用集合是否改变(即交集是否和调用集合相同),不变则为false,改变则为true 37 Collection c4 = new ArrayList(); 38 c4.add("a"); 39 c4.add("b"); 40 c4.add("c"); 41 c4.add("d"); 42 boolean b3 = c1.retainAll(c4); 43 System.out.println(b3); //false 44 System.out.println(c1); //[a, b, c, d] 45 46 Collection c5 = new ArrayList(); 47 c5.add("a"); 48 c5.add("b"); 49 c5.add("c"); 50 c5.add("f"); 51 c5.add("e"); 52 boolean b4 = c1.retainAll(c5); 53 System.out.println(b4); //true 54 System.out.println(c1); //[a, b, c] 55 56 57 } 58 59 public static void demo3() { 60 Collection c1 = new ArrayList(); 61 c1.add("a"); 62 c1.add("b"); 63 c1.add("c"); 64 c1.add("d"); 65 66 Collection c2 = new ArrayList(); 67 c2.add("a"); 68 c2.add("b"); 69 c2.add("z"); 70 boolean b = c1.containsAll(c2); 71 System.out.println(b); //false 72 73 Collection c3 = new ArrayList(); 74 c3.add("a"); 75 c3.add("b"); 76 boolean b2 = c1.containsAll(c3); 77 System.out.println(b2); //true 78 } 79 80 public static void demo2() { 81 Collection c1 = new ArrayList(); 82 c1.add("a"); 83 c1.add("b"); 84 c1.add("c"); 85 c1.add("d"); 86 87 Collection c2 = new ArrayList(); 88 c2.add("a"); 89 c2.add("b"); 90 c2.add("z"); 91 boolean b = c1.removeAll(c2); 92 System.out.println(b); 93 System.out.println(c1); //[c, d] 94 } 95 96 public static void demo1() { 97 Collection c1 = new ArrayList(); 98 c1.add("a"); 99 c1.add("b"); 100 c1.add("c"); 101 c1.add("d"); 102 103 Collection c2 = new ArrayList(); 104 c2.add("a"); 105 c2.add("b"); 106 107 c1.addAll(c2); //会将c2当做一个对象添加到c1中 108 System.out.println(c1); //[a, b, c, d, a, b] 109 } 110 111 }
使用迭代器Iterator遍历集合:
1 public class Demo4_Iterator { 2 3 /* 4 * 迭代遍历集合 5 * 迭代器原理: 6 * 迭代器是对集合进行遍历,但是每个集合内部的存储结构都是不同的,所以每一个集合存和取都是不一样的, 7 * 那么就需要在每个类中定义hasNext()和next()方法,如果这样做会使集合体系过于臃肿,迭代器将这样的方法向上抽取出接口, 8 * 然后在每个类的内部定义自己迭代方式,这样做有两种好处:第一. 规定了整个集合体系的遍历方式都是hasNext()和next()方法, 9 * 第二. 代码由底层内部实现,使用者不用管是怎么实现的,只要会用即可 10 * 11 * 迭代器源码分析: 12 * 1. 在Eclipse中Ctrl + shift + t 找到ArrayList类 13 * 2. Ctrl + o 找到 iterator()方法 14 * 3. 查看返回值是 new itr() ,说明是Iterator类的子类对象 15 * 4. Itr这个类重写了Iterator中的所有抽象方法 16 */ 17 public static void main(String[] args) { 18 19 //demo1(); 20 Collection c = new ArrayList(); 21 c.add(new Student("张三", 18)); 22 c.add(new Student("李四", 19)); 23 c.add(new Student("王五", 20)); 24 c.add(new Student("赵六", 21)); 25 26 Iterator it = c.iterator(); 27 while (it.hasNext()) { 28 //System.out.println(it.next()); 29 Student s = (Student) it.next(); //向下转型 30 System.out.println(s.getName() + " " + s.getAge()); 31 } 32 33 } 34 35 public static void demo1() { 36 Collection c = new ArrayList(); 37 c.add("a"); 38 c.add("b"); 39 c.add("c"); 40 c.add("d"); 41 42 Iterator it = c.iterator(); // 获取迭代器 43 /* 44 * boolean b = it.hasNext(); //判断集合中是否有元素 System.out.println(b); 45 * System.out.println(it.next()); //通过next()方法获取元素值 46 */ 47 while (it.hasNext()) { 48 System.out.println(it.next()); 49 50 } 51 } 52 53 }