-
List接口:
-
继承自Collection接口,List集合是可重复集合,并且有序,并且提供了一套可以通过下标操作元素的方法
-
常见的实现类:
-
java.util.ArrayList:内部使用数组实现,查询性能更好(直接下标查找物理地址),增删性能不太好
-
java.util.LinkedList:内部使用链表实现,查询性能不太好,首尾增删性能好
注意:在对集合操作的增删性能没有特别苛刻的要求时,通常选择ArrayList
-
-
-
List集合常见方法:
-
get():根据下标获取元素
-
set():将指定元素设置到指定位置 ,并返回被替换的元素(用时再接收)
-
重载add():将指定元素添加到指定位置,理解为插入操作
-
重载remove():删除并返回指定位置元素
-
subList():获取当前集合中指定范围内的子集(含头不含尾)
-
-
集合的排序:
-
Collections为集合的工具类,里面定义了很多静态方法用于操作集合
-
Collections.sort(List list)方法:可以对list集合进行自然排序(从小到大),Collections.sort(List list)方法要求List集合中的元素必须是可比较的,若不可比较则直接发生编译错误,不允许排序。判断是否可比较的标准为元素是否实现了java.util.Comparable接口。实际开发中,我们是不会让我们自己定义的类去实现Comparable接口,因为这对我们的程序有侵入性。
侵入性:当我们调用某个API功能时,其要求我们为其修改其它额外的代码,这个现象叫做侵入性。侵入性越强则越不利于程序的后期维护,应尽量避免。
-
建议使用重载的Collections.sort(List list,Comparator c)方法,可以通过Comprator来自定义比较规则
-
-
Set接口:
-
继承自Collection接口,元素是不可重复的,并且大部分都是无序的
-
常见的实现类:java.util.HashSet
-
笔记:
-
List接口:
-
继承自Collection接口,List集合是可重复集合,并且有序,并且提供了一套可以通过下标操作元素的方法
-
常见的实现类:
-
java.util.ArrayList:内部使用数组实现,查询性能更好(直接下标查找物理地址),增删性能不太好
-
java.util.LinkedList:内部使用链表实现,查询性能不太好,首尾增删性能好
注意:在对集合操作的增删性能没有特别苛刻的要求时,通常选择ArrayList
-
-
-
List集合常见方法:
-
get():根据下标获取元素
-
set():将指定元素设置到指定位置 ,并返回被替换的元素(用时再接收)
-
重载add():将指定元素添加到指定位置,理解为插入操作
-
重载remove():删除并返回指定位置元素
public class ListDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("one"); list.add("two"); list.add("three"); list.add("four"); list.add("five"); System.out.println("list:"+list); //[one, two, three, four, five] /** * E get(int index): * 获取指定下标所对应的元素 */ String e = list.get(2); //获取第3个元素 System.out.println(e); //three for(int i=0;i<list.size();i++){ System.out.println(list.get(i)); } for(String s : list){ System.out.println(s); } Iterator<String> it = list.iterator(); while(it.hasNext()){ System.out.println(it.next()); } System.out.println("-----------------------------"); /* E set(int index,E e): 将给定元素(e)设置到给定位置(index),返回被替换的元素 */ String old = list.set(2,"six"); //将下标为2的元素设置为six,返回原始元素 //list.set(2,"six"); //常规用法 System.out.println(old); //three System.out.println("list:"+list); //[one, two, six, four, five] /** * void add(int index, E e): * 将给定元素e添加到index所指定的位置,相当于插入操作 */ list.add(3,"three"); //将three插入到下标3的位置 System.out.println("list:"+list); //[one, two, six, three, four, five] /** * E remove(int index): * 删除指定位置元素,并返回该位置对应元素 */ String o = list.remove(2); //删除下标2的元素,并返回对应元素 System.out.println(o); //six System.out.println("list:"+list); //[one, two, three, four, five] } }
-
subList():获取当前集合中指定范围内的子集(含头不含尾)
public class ListDemo2 { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); for(int i=0;i<10;i++){ list.add(i*10); } System.out.println("list:"+list); //[0, 10, 20, 30, 40, 50, 60, 70, 80, 90] List<Integer> subList = list.subList(3,8); //获取下标3到7的子集 System.out.println("subList:"+subList); //[30, 40, 50, 60, 70] //将子集的每个元素扩大10倍 for(int i=0;i<subList.size();i++) { subList.set(i, subList.get(i) * 10); } System.out.println("subList:"+subList); //[300, 400, 500, 600, 700] //注意:对子集的操作就是对原集合元素的操作 System.out.println("list:"+list); //[0, 10, 20, 300, 400, 500, 600, 700, 80, 90] list.set(3,3000); //将下标为3的元素修改为3000 System.out.println("list:"+list); //[0, 10, 20, 3000, 400, 500, 600, 700, 80, 90] System.out.println("subList:"+subList); //3000, 400, 500, 600, 700 list.remove(0); //删除list中的第1个元素 System.out.println("list:"+list); //[10, 20, 3000, 400, 500, 600, 700, 80, 90] //原集合修改之后,子集将不能再进行任何操作了,操作则发生并发修改异常,但是可以重新获取子集 //System.out.println("subList:"+subList); //运行时并发修改发生异常 /** * java.util.Collections为集合的工具类,包含了集合相关的静态方法 */ Collections.reverse(list); //反转list集合(元素真实改变了) System.out.println("lisi:"+list); } }
-
-
集合的排序:
-
Collections为集合的工具类,里面定义了很多静态方法用于操作集合
public class ListSortDemo { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); Random rand = new Random(); for(int i=0;i<10;i++){ list.add(rand.nextInt(100)); } System.out.println("list原始数据:"+list); Collections.sort(list); //对list集合进行自然排序(从小到大) System.out.println("list排序后数据:"+list); Collections.reverse(list); //反转list集合(数据已经变化了) System.out.println("list反转后:"+list); } }
-
Collections.sort(List list)方法:可以对list集合进行自然排序(从小到大),Collections.sort(List list)方法要求List集合中的元素必须是可比较的,若不可比较则直接发生编译错误,不允许排序。判断是否可比较的标准为元素是否实现了java.util.Comparable接口。实际开发中,我们是不会让我们自己定义的类去实现Comparable接口,因为这对我们的程序有侵入性。
侵入性:当我们调用某个API功能时,其要求我们为其修改其它额外的代码,这个现象叫做侵入性。侵入性越强则越不利于程序的后期维护,应尽量避免。
-
建议使用重载的Collections.sort(List list,Comparator c)方法,可以通过Comprator来自定义比较规则
public class ListSortStringDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("王克晶"); list.add("传奇djflajfdl"); list.add("苍松老师"); System.out.println("list原始数据:"+list); Collections.sort(list, new Comparator<String>() { /* compare()方法用于定义o1和o2比较大小的规则,并用返回值表达大小关系 返回值实现的要求:-------不用纠结,去记下面的结论即可 1)如果返回值>0,则表达的是o1>o2 2)如果返回值<0,则表达的是o1<o2 3)如果返回值=0,则表达的是o1=o2 结论: 1)前面的(o1)-后面的(o2)-----------升序 2)后面的(o2)-前面的(o1)-----------降序 */ public int compare(String o1, String o2) { return o1.length()-o2.length(); //升序 //return o2.length()-o1.length(); //降序 } }); System.out.println("list排序后数据:"+list); /* List<String> list = new ArrayList<>(); list.add("jack"); list.add("rose"); list.add("tom"); list.add("jerry"); list.add("black"); list.add("Kabe"); System.out.println("list原始数据: "+list); //对英文字符串排序时,会按首字母的ASCII码排序 //若首字母相同,则比较第2个字符的ASCII码,以此类推 Collections.sort(list); System.out.println("list排序后数据:"+list); */ } } public class ListSortPointDemo { public static void main(String[] args) { List<Point> list = new ArrayList<>(); list.add(new Point(5,8)); list.add(new Point(15,28)); list.add(new Point(99,66)); list.add(new Point(45,23)); list.add(new Point(63,9)); list.add(new Point(1,4)); System.out.println("list原始数据:"+list); //JDK1.8,List集合自身提供了sort()方法进行排序,sort()方法依然需要传入比较器 list.sort(new Comparator<Point>() { public int compare(Point o1, Point o2) { int len1 = o1.getX()*o1.getX()+o1.getY()*o1.getY(); int len2 = o2.getX()*o2.getX()+o2.getY()*o2.getY(); return len1-len2; //升序 } }); System.out.println("list排序后数据:"+list); /* Collections.sort(list, new Comparator<Point>() { public int compare(Point o1, Point o2) { int len1 = o1.getX()*o1.getX()+o1.getY()*o1.getY(); int len2 = o2.getX()*o2.getX()+o2.getY()*o2.getY(); //return len1-len2; //升序 return len2-len1; //降序 //return o1.getX()-o2.getX(); //按x坐标升序 //return o2.getY()-o1.getY(); //按y坐标降序 } }); System.out.println("list排序后数据:"+list); */ } }
-
-
Set接口:
-
继承自Collection接口,元素是不可重复的,并且大部分都是无序的
-
常见的实现类:java.util.HashSet
public class SetDemo { public static void main(String[] args) { //小面试题:如何去重? List<String> list = new ArrayList<>(); list.add("one"); list.add("two"); list.add("three"); list.add("four"); list.add("five"); list.add("two"); System.out.println("list:"+list); Set<String> set = new HashSet<>(); set.addAll(list); System.out.println("set:"+set); /* Set<String> set = new HashSet<>(); set.add("one"); set.add("two"); set.add("three"); set.add("four"); set.add("five"); set.add("two"); System.out.println(set); */ } }
-