集合(一)
集合是批量存储对象的,针对的是堆内存中的对象,包括自定义类对象,数组对象,系统类对象
数组存储批量数据,数组即可以存放引用数据类型,又可以存放基本数据类型
集合本身是只能直接在存放引用数据类型,但是可以存放包装类,间接存放基本数据类型
数组长度不可变,集合长度可变
-
集合在Java开发中相当于Python字典加集合,功能强大,所以地位很高。
二、集合框架
学习要点:
-
各种集合的增删改查(开发、应用)
-
底层数据结构的了解(面试)

三、Collection接口方法
add(Object o);放入任意的引用数据类型
size()返回一个集合的长度
集合是可以直接输出
addAll(Collection c);一个集合所有元素添加另一个集合,如果用add添加集合到集合就会变成二维集合
contains(参数);判断参数是否包含在集合中
isEmpty();集合是否为空
toArray();把集合转换为数组Object[],如果后期集合规定了类型,转换的数组就是规范的类型
remove();删除集合中的元素
如果自定义对象重写equals()方法,改变了比较规则,在数组中比较的时候,是按照自定义equals()比较
package com.JavaSE.homework.Day16.DemoCollection; import java.util.ArrayList; import java.util.Collection; public class Collection1 { public static void main(String[] args) { //使用Collection接口的方法 Collection c1 = new ArrayList();//Arrary实现类是Collection子接口List的实现类 boolean empty1 = c1.isEmpty(); System.out.println(empty1); System.out.println("集合没放入元素前:" + c1.size()); c1.add(10); c1.add("NBA"); Student stu1 = new Student("0x111", "曹操", 78); c1.add(stu1); System.out.println("集合放入元素之后:" + c1.size()); System.out.println(c1); System.out.println("----------------"); Collection c2 = new ArrayList(); c2.add(c1);//把c1 add System.out.println(c2); Collection c3 = new ArrayList(); c3.addAll(c1);//把c1中All元素add System.out.println(c3); System.out.println("----------------------"); c3.add("wowo"); System.out.println(c3); c3.remove("wowo"); System.out.println(c3); //转为数组时,要用Object接收返回值 c3.toArray(); System.out.println(c3); System.out.println("------------------------"); Object[] obj = c3.toArray(); for (Object i : obj) {//类似于for i in obj 只不过i要写类型 in换成了: System.out.println(i); } } }
iterator();迭代器方法,遍历方式
package com.JavaSE.homework.Day16.DemoCollection; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class Collection2 { public static void main(String[] args) { Collection c1 = new ArrayList(); c1.add("曹休"); c1.add("曹洪"); c1.add("曹真"); c1.add("曹爽"); c1.add("曹熊"); c1.add("曹宇"); Object[] obj = c1.toArray(); for (Object i : obj) { System.out.println(i); } System.out.println("-------------------------"); Iterator iterator = c1.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } } }
迭代器源码分析:
int cursor; // index of next element to return public Object next(){ //正序第一次要判断是否等于size //逆序第一次要判断是否等于0 int i =cursor;//i是输出的索引,cursor每次都赋值完i都+1,curse相当于下一个输出的索引(行号) cursor =cursor+1;//还要判断是否超过size, return elementData[i]; }
package com.JavaSE.homework.Day15.comparatordemo; import java.util.ArrayList; import java.util.Collection; public class Collection3 { public static void main(String[] args) { Collection c=new ArrayList(); c.add("abc"); Student stu1=new Student("0x115","张三",98); Student stu2=new Student("0x115","张三",98); c.add(stu1); c.remove("abc"); c.remove(stu2);//这里面的equals是object里的,所以即使值一样,我们也不会删除stu1 //但是如果我们在子类重写了equals就可以 System.out.println(c); } }
四、List接口
-
索引
-
add(index,element) 指定位置添加元素
-
add(index,Collection)指定位置添加整个集合的元素
-
package com.JavaSE.homework.Day16.DemoList; import java.util.ArrayList; import java.util.List; public class List1 { public static void main(String[] args) { List l1 = new ArrayList(); l1.add(0, "理解"); l1.add(1, "万岁"); System.out.println(l1); l1.add(0, "**");//插队 System.out.println(l1); List l2 = new ArrayList(); l2.add(0, "人民"); System.out.println("---------------------"); System.out.println(l2);//[人民] l2.add(0, l1); System.out.println(l2);//[[**, 理解, 万岁], 人民] l2.addAll(0, l1); System.out.println(l2);//[**, 理解, 万岁, [**, 理解, 万岁], 人民] //index顺序不能乱必须依次增加或不变 } }
remove(index)根据索引删除
set(index,element)替换
get(index) 根据索引,得到这个位置的值
package com.JavaSE.homework.Day16.DemoList; import java.util.ArrayList; import java.util.List; public class List1 { public static void main(String[] args) { List l1 = new ArrayList(); l1.add(0, "理解"); l1.add(1, "万岁"); System.out.println(l1); l1.add(0, "**");//插队 System.out.println(l1); List l2 = new ArrayList(); l2.add(0, "人民"); System.out.println("---------------------"); System.out.println(l2);//[人民] l2.add(0, l1); System.out.println(l2);//[[**, 理解, 万岁], 人民] l2.addAll(0, l1); System.out.println(l2);//[**, 理解, 万岁, [**, 理解, 万岁], 人民] System.out.println("---------------------------"); l2.remove(l1); System.out.println(l2);//[**, 理解, 万岁, 人民] l2.removeAll(l1);//会把l1里all元素挨个删除 System.out.println(l2);//[人民] l2.remove("人民"); System.out.println(l2);//[] l2.add("苦逼");//可以写也可以不写,Collection里不能写index l2.add(0,"苦逼"); l2.remove("苦逼");//删除第一个匹配到的值 System.out.println(l2); System.out.println("-----------------"); l2.set(0, "快乐"); System.out.println(l2);//[快乐] l2.add(1,"3w"); System.out.println(l2.get(1)); } }
listIterator(); list接口独有的遍历
总结List接口遍历方式:
package com.JavaSE.homework.Day16.DemoList; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.ListIterator; public class List2 { public static void main(String[] args) { List l1 = new ArrayList(); l1.add("曹休"); l1.add("曹洪"); l1.add("曹真"); l1.add("曹爽"); l1.add("曹熊"); l1.add("曹宇"); System.out.println(l1); //1.迭代器 //2.转换成数组遍历 //3.独有的ListIterator ListIterator listIt = l1.listIterator(); while (listIt.hasNext()) { System.out.println(listIt.next()); }//还可以逆序,必须共用一个迭代器 System.out.println("-------------------------"); while (listIt.hasPrevious()) { System.out.println(listIt.previous()); } //4.for循环遍历 System.out.println("-------------------------"); for (int i = 0; i < l1.size(); i++) { System.out.println(l1.get(i)); } //5.for增强 System.out.println("-----------------------"); for (Object obj : l1) { System.out.println(obj); } } }

这就是逆序必须共用一个迭代器的原因,不共用上来curse=0,直接报错
-
排序sort 1.8新特性
package com.JavaSE.homework.Day16.DemoList; import com.JavaSE.homework.Day16.DemoCollection.Student; import java.util.ArrayList; import java.util.Comparator; import java.util.List; public class List3 { public static void main(String[] args) { List l1 = new ArrayList(); l1.add(30); l1.add(10); l1.add(20); l1.add(40); l1.add(60); System.out.println(l1); l1.sort(new Comparator() { @Override public int compare(Object o1, Object o2) { int i=(Integer) o1; int j=(Integer) o2; return i-j; } }); System.out.println(l1); System.out.println("----------------"); List l2 = new ArrayList(); Student s1 = new Student("001", "秦始皇", 100); Student s2 = new Student("002", "汉武帝", 80); Student s3 = new Student("003", "唐太宗", 90); l2.add(s1); l2.add(s2); l2.add(s3); System.out.println(l2); l2.sort(new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { return o1.getScore()-o2.getScore(); } }); System.out.println(l2); } } //根据我看源码,初步得出Comparator的compare方法是先选择把最值找出,然后用冒泡排序
总结:
Iterable接口 中 iterator()方法
Collection接口中 增删改查 add(Object obj) addAll(Collection coll) remove(Object obj) size() clear()
List接口(独有)
add(index,element) addAll(index,Collection coll) remove(index) get(index) set(index,element)

浙公网安备 33010602011771号