集合

一、简介

动态保存任意多个对象

集合两组:单列集合,双列集合

Collection接口有两个重要的子接口 List Set,实现的子类都是单列集合

Map接口的实现子类是双列集合,存放k-v
ccc.png
lll-16466198216741.png

二、Collection 接口和常用方法

  1. Collection实现子类可以存放多个元素,每个元素可以是Object
  2. Collection的实现类,有些可以存放重复的元素,有些不可以
  3. Collection的实现类,有些事有序的(List),有些不是有序的(Set)
  4. Collection接口没有直接的实现子类,是通过它的子接口Set和List来实现的

接口方法,以ArrayList举例

  1. public class Collection_ {
  2. @SuppressWarnings({"all"})
  3. public static void main(String[] args) {
  4. List list = new ArrayList();
  5. // add 添加单个元素
  6. list.add("fff");
  7. list.add(true);
  8. list.add(14.23);
  9. System.out.println(list); // [fff, true, 14.23]
  10. // remove 删除指定元素
  11. list.remove(0); // 删除第一个元素
  12. System.out.println(list); // [true, 14.23]
  13. list.remove(true); // 删除指定元素
  14. System.out.println(list); // [14.23]
  15. // contains 查找元素是否存在
  16. list.add("fff");
  17. list.add(true);
  18. System.out.println(list); // [14.23, fff, true]
  19. System.out.println(list.contains(14.23)); // true
  20. // size 获取元素个数
  21. System.out.println(list.size()); // 3
  22. // isEmpty 判断是否为空
  23. System.out.println(list.isEmpty()); // false
  24. // clear 清空
  25. list.clear();
  26. System.out.println(list); // []
  27. // addAll 添加多个元素
  28. ArrayList list1 = new ArrayList();
  29. list1.add("ggg");
  30. list1.add("1223");
  31. list.addAll(list1);
  32. System.out.println(list); // [ggg, 1223]
  33. // containsAll 查找多个元素是否都存在
  34. System.out.println(list.containsAll(list1)); // true
  35. // removeAll 删除多个元素
  36. list.add(1111);
  37. list.removeAll(list1);
  38. System.out.println(list); // [1111]
  39. }
  40. }

三、Collection接口遍历元素方式

  1. Iterator迭代器遍历

Iterator对象称为迭代器,用于遍历集合中的元素

所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象,即可以返回一个迭代器

Iterator仅用于遍历集合,本身不存放对象

  • 执行原理
    Iterator iterator = collection.iterator(); // 得到一个集合的迭代器
    // hasNext() 判断是否还有下一个元素
    while(iterator.hasNext()){
    //next() 后移 将后移以后集合位置上的元素返回
    }
    System.out.println(iterator.next());
  1. public class CollectionIterator {
  2. @SuppressWarnings({"all"})
  3. public static void main(String[] args) {
  4. Collection collection = new ArrayList();
  5. collection.add(new Book("三国" ,"罗贯中",10));
  6. collection.add(new Book("aaa","a",52));
  7. collection.add(new Book("tt","as",25.2));
  8. // 得到collection对应的迭代器
  9. Iterator iterator = collection.iterator();
  10. // 使用while循环遍历
  11. while(iterator.hasNext()){// 判断是否还有数据
  12. // 返回下一个元素,类型是Object
  13. Object obj = iterator.next();
  14. System.out.println(obj);
  15. }
  16. // 当退出while循环后,iterator迭代器,指向最后的元素
  17. // 如果再次遍历,重置迭代器
  18. iterator = collection.iterator();
  19. }
  20. }
  21. class Book{
  22. private String name;
  23. private String author;
  24. private double price;
  25. public Book(String name, String author, double price) {
  26. this.name = name;
  27. this.author = author;
  28. this.price = price;
  29. }
  30. public String getName() {
  31. return name;
  32. }
  33. public void setName(String name) {
  34. this.name = name;
  35. }
  36. public String getAuthor() {
  37. return author;
  38. }
  39. public void setAuthor(String author) {
  40. this.author = author;
  41. }
  42. public double getPrice() {
  43. return price;
  44. }
  45. public void setPrice(double price) {
  46. this.price = price;
  47. }
  48. @Override
  49. public String toString() {
  50. return "Book{" +
  51. "name='" + name + '\'' +
  52. ", author='" + author + '\'' +
  53. ", price=" + price +
  54. '}';
  55. }
  56. }
  1. 增强for循环
  1. for (Object obj:collection){
  2. System.out.println(obj);
  3. }

四、List接口和常用方法

List接口Collection接口的子接口

  • List集合类中元素有序,即添加顺序和取出顺序一致,且可重复
  • List集合中的每个元素都有其对应的顺序索引,即支持索引
  • List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素
  • 常用的类有ArrayList、LinkedList和Vector
  1. public class List_ {
  2. @SuppressWarnings({"all"})
  3. public static void main(String[] args) {
  4. List list = new ArrayList();
  5. list.add("aaa");
  6. list.add("ccc");
  7. list.add("cxx");
  8. System.out.println(list); // [aaa, ccc, cxx]
  9. System.out.println(list.get(1)); // ccc 索引从0开始
  10. }
  11. }
  1. public class ListMethod {
  2. @SuppressWarnings({"all"})
  3. public static void main(String[] args) {
  4. List list = new ArrayList();
  5. list.add("苹果");
  6. list.add("鸡蛋");
  7. list.add("aaa");
  8. // void add(int index, Object ele):在 index 位置插入 ele 元素
  9. list.add(1,"abc"); // [苹果, abc, 鸡蛋, aaa] 在位置1加入abc
  10. // boolean addAll(int index, Collection eles):从 index 位置开始将 eles 中的所有元素添加进来
  11. List list1 = new ArrayList();
  12. list1.add("ooo");
  13. list1.add(222);
  14. list.addAll(list1);
  15. System.out.println(list); // [苹果, abc, 鸡蛋, aaa, ooo, 222]
  16. // Object get(int index):获取 index 位置的元素
  17. System.out.println(list.get(2)); // 鸡蛋
  18. // int indexOf(Object obj):返回 obj 在集合中首次出现的位置
  19. System.out.println(list.indexOf("ooo")); // 4
  20. // int lastIndexOf(Object obj):返回 obj 在当前集合中末次出现的位置
  21. list.add("ooo");
  22. System.out.println(list.lastIndexOf("ooo")); // 6
  23. // Object remove(int index):移除指定 index 位置的元素,并返回此元素
  24. list.remove(0);
  25. System.out.println(list); // [abc, 鸡蛋, aaa, ooo, 222, ooo]
  26. // Object set(int index, Object ele):设置指定 index 位置的元素为 ele
  27. list.set(2,345);
  28. System.out.println(list); // [abc, 鸡蛋, 345, ooo, 222, ooo]
  29. // List subList(int fromIndex, int toIndex):返回从 fromIndex <= < toIndex 位置的子集合
  30. List returnList = list.subList(1,3);
  31. System.out.println(returnList); // [鸡蛋, 345]
  32. }
  33. }
  • List的三种遍历方式
  1. 使用iterator

    1. Iterator iterator = list.iterator();
    2. while(iterator.hasNext()){
    3. Object o = iterator.next();
    4. }
  2. 使用增强for
    ```java for (Object o:list) {

}

  1. 3. 使用普通for
  2. ```java
  3. for (int i = 0; i < list.size(); i++) {
  4. Object object = list.get(i);
  5. System.out.println(object);
  6. }

五、ArrayList底层

null也可以加入ArrayList

ArrayList是由数组来实现数据存储的

ArrayList基本等同于Vector,但ArrayList是线程不安全的

ArrayList中维护了一个Object类型的数组elementData

当创建ArrayList对象时,如果使用无参构造器,初始elementData容量为0,第1次添加,扩容为10,再次扩容,扩容为elementDate的1.5倍

如果使用的是指定大小的构造器,初始elementDate容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍

六、Vector

底层是对象数组

线程安全的,方法右synchronized

扩容:如果是无参,默认10,满了按2倍;如果指定大小,每次按2倍扩容

七、LinkedList

底层实现了双向链表和双端队列,可以添加任意元素,可以重复,包括null

线程不安全,没有实现同步

底层维护了一个双向链表,first和last分别指向首节点和尾节点

每个节点(Node)维护了prev,next,item三个属性,prev指向前一个节点,next指向后一个节点

添加删除效率比较高

  1. public class LinkedListCRUD {
  2. public static void main(String[] args) {
  3. LinkedList linkedList = new LinkedList();
  4. linkedList.add(1);
  5. linkedList.add(222);
  6. linkedList.add("sds");
  7. System.out.println(linkedList); // [1, 222, sds]
  8. linkedList.remove();// 删除第一个结点
  9. linkedList.set(1,777); // 修改
  10. System.out.println(linkedList); // [222, 777]
  11. Object o = linkedList.get(1);
  12. System.out.println(o); // 777
  13. }
  14. }

改查多选ArrayList

增删多选LinkedList

八、Set

无序,没有索引

不允许重复元素,最多包含一个null

遍历可以使用迭代器和增强for,不能用索引,即不能普通的循环

  1. public class SetMethod {
  2. public static void main(String[] args) {
  3. Set set = new HashSet();
  4. set.add("dfg");
  5. set.add("ewq");
  6. set.add("dqwd");
  7. set.add("dfg");
  8. set.add(111);
  9. set.add(null);
  10. set.add(null);
  11. System.out.println(set); // [null, dfg, dqwd, ewq, 111]不能重复且无序
  12. // 添加和取出的顺序不一致,虽然不是添加的顺序,但是是固定的
  13. // 遍历
  14. // 1. 迭代器
  15. Iterator i = set.iterator();
  16. while (i.hasNext()){
  17. Object obj = i.next();
  18. System.out.println(obj);
  19. }
  20. // 2. 增强for
  21. for (Object o: set) {
  22. System.out.println(o);
  23. }
  24. }
  25. }

HashSet

实现Set接口,底层是HashMap

  1. public HashSet() {
  2. map = new HashMap<>();
  3. }

可以添加null,但仅一个

不保证元素有序,hash后再确定索引的结果

  1. public class HashSet_ {
  2. public static void main(String[] args) {
  3. Set set = new HashSet();
  4. // add会返回一个boolean值,添加成功,返回true,否则返回false
  5. System.out.println(set.add("dfg")); //true
  6. System.out.println(set.add("ewq")); //true
  7. System.out.println(set.add("dqwd")); //true
  8. System.out.println(set.add("dfg")); // false
  9. System.out.println(set.add(111)); //true
  10. // remove指定删除某个对象
  11. set.remove("dfg");
  12. System.out.println(set);
  13. }
  14. }
  1. public class HashSet01 {
  2. public static void main(String[] args) {
  3. Set set = new HashSet();
  4. set.add("dfg");
  5. set.add("dfg"); // 加不进
  6. set.add(new Dog("t"));
  7. set.add(new Dog("t")); // 加进去了 两个Dog对象
  8. System.out.println(set); // [dfg, Dog{name='t'}, Dog{name='t'}]
  9. set.add(new String("ttt"));
  10. set.add(new String("ttt")); // 加不进去
  11. System.out.println(set); // [dfg, ttt, Dog{name='t'}, Dog{name='t'}]
  12. }
  13. }
  14. class Dog{
  15. private String name;
  16. public Dog(String name) {
  17. this.name = name;
  18. }
  19. @Override
  20. public String toString() {
  21. return "Dog{" +
  22. "name='" + name + '\'' +
  23. '}';
  24. }
  25. }
  • 底层
    HashSet的底层是HashMap,HashMap的底层是数组+链表+红黑树
  • 扩容
    第一次添加时,table数组扩容到16(临界值*加载因子=16x0.75=12),达到12时扩容到16x2=32,此时临界值32x0.75=24(加入一个结点就算一个)
    添加一个元素时,得到hash值,转成索引值
    找到存储表table的这个索引是否已经有元素
    没有元素,直接添加
    如果有,调用equals比较,相同,不能添加,不同,添加到最后
    一条链表的元素个数达到TREEIFY_THRESHOLD(默认8),table大小>=MIN_TREEIFY_CAPACITY(默认64)会进行数化,红黑树
  1. public class HashSet02 {
  2. public static void main(String[] args) {
  3. HashSet hashSet = new HashSet();
  4. hashSet.add(new Employee("ml",45));
  5. hashSet.add(new Employee("kl",21));
  6. hashSet.add(new Employee("ml",45));
  7. System.out.println(hashSet); //[Employee{name='ml', age=45}, Employee{name='kl', age=21}, Employee{name='ml', age=45}]
  8. // 要求name和age的值相同,视为相同的Employee,即让它们hash值相同
  9. // equals() and hashCode()后 [Employee{name='kl', age=21}, Employee{name='ml', age=45}]
  10. }
  11. }
  12. class Employee{
  13. private String name;
  14. private int age;
  15. public Employee(String name, int age) {
  16. this.name = name;
  17. this.age = age;
  18. }
  19. public String getName() {
  20. return name;
  21. }
  22. // ALT+INSERT 选equals() and hashCode()
  23. @Override
  24. public boolean equals(Object o) {
  25. if (this == o) return true;
  26. if (o == null || getClass() != o.getClass()) return false;
  27. Employee employee = (Employee) o;
  28. return age == employee.age && Objects.equals(name, employee.name);
  29. }
  30. @Override
  31. public int hashCode() {
  32. return Objects.hash(name, age);
  33. }
  34. public void setName(String name) {
  35. this.name = name;
  36. }
  37. public int getAge() {
  38. return age;
  39. }
  40. public void setAge(int age) {
  41. this.age = age;
  42. }
  43. @Override
  44. public String toString() {
  45. return "Employee{" +
  46. "name='" + name + '\'' +
  47. ", age=" + age +
  48. '}';
  49. }
  50. }

LinkedHashSet

LinkedHashSet时HashSet的子类,底层是一个LinkedHashMap,底层维护了一个数组+双向链表

LinkedHashSet根据元素的hashCode值来决定元素的存储位置,同时使用链表维护元素的次序,使元素以插入顺序保存

不允许添加重复元素

九、Map 接口和常用方法

  1. 特点
    双列key-value
    k、v时任何引用类型的数据,会封装到HashMap$Node对象中
    不允许重复
    k、v可以为null,但只能有一个k为null,可以有多个v为空
    通过k能找到对应的value
    一对k-v放在一个HashMap$Node中Node实现了Entry接口,为了方便遍历(Entry提供了getKey(),getValue()方法),创建EntrySet集合,集合存放的是Entry,一个Entry对象有k,v EntrySet> 即transient Set> entrySet;
    entrySet中定义的类型是Map.Entry,实际存放的是HashMap【Java笔记】25 集合 - 图3Node`实现了Map.Entry接口
  2. 常用方法

    1. public class Map01 {
    2. public static void main(String[] args) {
    3. Map map = new HashMap();
    4. map.put("we","121");
    5. map.put("nfwkje",554);
    6. map.put("vfs","efs");
    7. map.put("cs","csf");
    8. map.put("cs",new Book1("书",9)); // 替换
    9. map.put("er","gerg");
    10. map.put(null,"hi");
    11. map.put("fwqw",null);
    12. System.out.println(map); // {cs=Book1{name='书', num=9}, null=hi, vfs=efs, fwqw=null, nfwkje=554, er=gerg, we=121}
    13. // remove 根据K删除
    14. map.remove("vfs");
    15. System.out.println(map); // {cs=Book1{name='书', num=9}, null=hi, fwqw=null, nfwkje=554, er=gerg, we=121}
    16. System.out.println(map.get("cs")); // Book1{name='书', num=9}
    17. // size 获取元素个数
    18. System.out.println(map.size()); // 6
    19. // isEmpty 判空
    20. System.out.println(map.isEmpty()); // false
    21. // 清空
    22. // map.clear();
    23. // containsKey 是否存在
    24. System.out.println(map.containsKey("fwqw")); // true
    25. }
    26. }
    27. class Book1{
    28. private String name;
    29. private int num;
    30. public Book1(String name, int num) {
    31. this.name = name;
    32. this.num = num;
    33. }
    34. public String getName() {
    35. return name;
    36. }
    37. public void setName(String name) {
    38. this.name = name;
    39. }
    40. public int getNum() {
    41. return num;
    42. }
    43. public void setNum(int num) {
    44. this.num = num;
    45. }
    46. @Override
    47. public String toString() {
    48. return "Book1{" +
    49. "name='" + name + '\'' +
    50. ", num=" + num +
    51. '}';
    52. }
    53. }
  3. Map 遍历

    1. // 遍历
    2. public class Map02 {
    3. public static void main(String[] args) {
    4. Map map = new HashMap();
    5. map.put("we","121");
    6. map.put("nfwkje",554);
    7. map.put("vfs","efs");
    8. map.put("cs","csf");
    9. map.put("cs",new Book1("书",9)); // 替换
    10. map.put("er","gerg");
    11. map.put(null,"hi");
    12. map.put("fwqw",null);
    13. // 1. 取出所有key,通过key得到value
    14. Set keyset = map.keySet();
    15. // 1.1 增强for
    16. for (Object key:keyset) {
    17. System.out.println(key+"-"+map.get(key));
    18. }
    19. // 1.2 迭代器
    20. Iterator iterator = keyset.iterator();
    21. while (iterator.hasNext()) {
    22. Object key = iterator.next();
    23. System.out.println(key+"-"+map.get(key));
    24. }
    25. // 2. 把所有的values取出 可以使用所有的Collection遍历
    26. Collection values = map.values();
    27. // 2.1 增强for
    28. for (Object value:values) {
    29. System.out.println(value);
    30. }
    31. // 2.2 迭代器
    32. Iterator iterator1 = values.iterator();
    33. while (iterator1.hasNext()) {
    34. Object next = iterator1.next();
    35. }
    36. // 3. 通过EntrySet获取k-v
    37. Set set = map.entrySet();
    38. // 3.1 增强for
    39. for (Object entry: set) {
    40. // 将entry转成Map.Entry
    41. Map.Entry m =(Map.Entry) entry;
    42. System.out.println(m.getKey() + "-" + m.getValue());
    43. }
    44. // 3.2 迭代器
    45. Iterator iterator2 = set.iterator();
    46. while (iterator2.hasNext()){
    47. Object next = iterator2.next();
    48. // 向下转型
    49. Map.Entry m = (Map.Entry) next;
    50. System.out.println(m.getKey() + "-" + m.getValue());
    51. }
    52. }
    53. }
  4. HashMap(k,v)是一个Node,实现了Map.Entry
    扩容机制和HashSet一样:

    • HashMap底层维护了Node类型的数组table,默认为null
    • 创建对象时,加载因子初始化为0.75
    • 添加k-v时,通过k的哈希值得到在table的索引,判断该索引处是否有元素,如果没有元素直接添加,如果有元素,继续判断该元素的k和准备加入的k是否相等,相等,直接替换v,不相等,判断是树结构还是链表结构,做出相应处理。添加时容量不够,扩容
    • 第一次添加,table扩容至16,临界值为12
    • 之后再扩容,table扩容至2倍32,临界值24
    • 如果一条链表的元素个数超过EREEIFY_THRESHOLD(默认8),且table>=MIN_TREEIFY_CAPACITY(默认64),树化(红黑树)

HashTable

存放键值对 k-v

hashtable键和值都不能为null

使用方法基本上和HashMap一样

hashtable是线程安全的

扩容:>=临界值时,以*2+1的大小扩容

Properties

键值对保存数据

和HashTable类似

用于从xx.properties文件中加载数据到Properties类对象,进行读取和修改

  1. public class Properties_ {
  2. public static void main(String[] args) {
  3. Properties properties = new Properties();
  4. // k,v不能为null
  5. properties.put("qww",100);
  6. properties.put("lls",100);
  7. properties.put("z",100);
  8. properties.put("z",90); // 如果有相同的k,v值被替换
  9. System.out.println(properties); // {qww=100, z=90, lls=100}
  10. // 用k获取v
  11. System.out.println(properties.get("z"));
  12. // 删除
  13. properties.remove("z");
  14. System.out.println(properties); // {qww=100, lls=100}
  15. // 修改
  16. properties.put("lls",110);
  17. }
  18. }

十、TreeSet、TreeMap

  • TreeSet
  1. public class TreeSet_ {
  2. public static void main(String[] args) {
  3. // 无参构造器创建TreeSet时,是无序的
  4. TreeSet treeSet = new TreeSet();
  5. treeSet.add("jis");
  6. treeSet.add("aaas");
  7. treeSet.add("aa");
  8. treeSet.add("cd");
  9. treeSet.add("111");
  10. System.out.println(treeSet); // [111, aa, aaas, cd, jis]
  11. // 按照字符串大小排序
  12. // 使用TreeSet提供一个构造器,传入一个比较器(匿名内部类) 并指定排序规则
  13. /*
  14. 1. 构造器把传入的比较器对象赋给了TreeSet 的底层的 TreeMap 的属性 this.comparator
  15. public TreeMap(Comparator<? super K> comparator) {
  16. this.comparator = comparator;
  17. }
  18. 2. 调用add
  19. if (cpr != null) {//cpr 是匿名内部类(对象)
  20. do {
  21. parent = t;
  22. //动态绑定到匿名内部类(对象)
  23. compare cmp = cpr.compare(key, t.key);
  24. if (cmp < 0)
  25. t = t.left;
  26. else if (cmp > 0)
  27. t = t.right;
  28. else //如果相等,即返回 0,这个 Key 就没有加入
  29. return t.setValue(value);
  30. } while (t != null);
  31. }
  32. */
  33. TreeSet treeSet1 = new TreeSet(new Comparator() {
  34. @Override
  35. public int compare(Object o1, Object o2) {
  36. //使用String的compareTo方法进行字符串大小比较
  37. return ((String)o2).compareTo((String) o1);
  38. }
  39. });
  40. // 添加数据
  41. treeSet1.add("jis");
  42. treeSet1.add("aaas");
  43. treeSet1.add("aa");
  44. treeSet1.add("cd");
  45. treeSet1.add("111");
  46. System.out.println(treeSet1); // [jis, cd, aaas, aa, 111]
  47. // 按照字符长度大小排序
  48. TreeSet treeSet2 = new TreeSet(new Comparator() {
  49. @Override
  50. public int compare(Object o1, Object o2) {
  51. return ((String)o2).length()-((String) o1).length();
  52. }
  53. });
  54. treeSet2.add("jis");
  55. treeSet2.add("aaas");
  56. treeSet2.add("aa");
  57. treeSet2.add("c");
  58. treeSet2.add("111");
  59. System.out.println(treeSet2); // [aaas, jis, aa, c] "111"没有被加入,因为规则是以长度大小排序,长度相同时被看作是同一个
  60. }
  61. }
  • TreeMap
  1. public class TreeMap_ {
  2. public static void main(String[] args) {
  3. // 使用默认的构造器创建,是无序的
  4. // 按照传入k的字符串大小进行排序
  5. /*
  6. 1. 构造器. 把传入的实现了 Comparator 接口的匿名内部类(对象),传给给 TreeMap 的 comparator
  7. public TreeMap(Comparator<? super K> comparator) { this.comparator = comparator; }
  8. 2. put方法
  9. 2.1 第一次添加,把k-v封装到Entry对象,放入root
  10. Entry<K,V> t = root;
  11. if (t == null) {
  12. compare(key, key); // 第一次添加也会调用compare,这样判断是不是null
  13. root = new Entry<>(key, value, null);
  14. size = 1; modCount++;
  15. return null;
  16. }
  17. 2.2 再次添加
  18. Comparator<? super K> cpr = comparator;
  19. if (cpr != null) {
  20. do { //遍历所有的 key , 给当前 key 找到适当位置
  21. parent = t;
  22. cmp = cpr.compare(key, t.key);//动态绑定到匿名内部类的compare
  23. if (cmp < 0)
  24. t = t.left;
  25. else if (cmp > 0)
  26. t = t.right;
  27. else //如果遍历过程中,发现准备添加 Key 和当前已有的 Key 相等,就不添加
  28. return t.setValue(value);
  29. } while (t != null);
  30. }
  31. */
  32. TreeMap treeMap = new TreeMap(new Comparator() {
  33. @Override
  34. public int compare(Object o1, Object o2) {
  35. return ((String) o2).compareTo((String) o1);
  36. }
  37. });
  38. treeMap.put("de","fwefee0");
  39. treeMap.put("vea",45);
  40. treeMap.put("aihia","edas");
  41. System.out.println(treeMap); // {vea=45, de=fwefee0, aihia=edas}
  42. }
  43. }

十一、Collections工具类

操作Set、List、Map等集合的工具类

提供了一系列静态的方法对集合元素进行排序、查询和修改等操作

  • 都是static方法
  1. public class Collections_ {
  2. public static void main(String[] args) {
  3. List list = new ArrayList();
  4. list.add("aaa");
  5. list.add("ccc");
  6. list.add("cxx");
  7. list.add("kql");
  8. System.out.println(list); // [aaa, ccc, cxx, kql]
  9. // reverse 反转List中元素的顺序
  10. Collections.reverse(list);
  11. System.out.println(list); // [kql, cxx, ccc, aaa]
  12. // shuffle 对集合元素进行随机排序
  13. for (int i = 0;i<5;i++){
  14. Collections.shuffle(list);
  15. System.out.println(list);
  16. }
  17. // sort(List) 根据元素的自然顺序对指定集合元素按升序排序
  18. Collections.sort(list);
  19. System.out.println(list);
  20. // sort(List, Comparator) 根据指定的顺序对集合元素排序
  21. // 按字符串的大小排序
  22. Collections.sort(list, new Comparator() {
  23. @Override
  24. public int compare(Object o1,Object o2){
  25. return ((String)o2).compareTo((String)o1);
  26. }
  27. });
  28. System.out.println(list); // [kql, cxx, ccc, aaa]
  29. // swap(List,int,int) 将指定list集合中i处的元素和j处的元素进行交换
  30. Collections.swap(list, 0, 1);
  31. System.out.println(list); // [cxx, kql, ccc, aaa]
  32. // Object max(Collection) 根据元素的自然排序,返回给定集合中的最大元素
  33. System.out.println(Collections.max(list)); // kql
  34. // Object max(Collection, Comparator) 根据Comparator指定的顺序,返回给定集合中的最大元素
  35. Object max = Collections.max(list, new Comparator() {
  36. @Override public int compare(Object o1, Object o2) {
  37. return ((String)o2).compareTo((String)o1);
  38. }
  39. });
  40. System.out.println(max); // aaa
  41. // Object min(Collection)
  42. // Object min(Collection,Comparator) 跟max类似
  43. // int frequency(Collection,Object):返回指定集合中指定元素的出现次数
  44. System.out.println(Collections.frequency(list,"aaa")); // 1
  45. //void copy(List dest,List src):将 src 中的内容复制到 dest 中
  46. ArrayList dest = new ArrayList();
  47. for (int i = 0;i < list.size();i++){
  48. dest.add(""); // 要先给dest赋值
  49. }
  50. Collections.copy(dest,list);
  51. System.out.println(dest); // [cxx, kql, ccc, aaa]
  52. // boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换 List 对象的所有旧值
  53. Collections.replaceAll(list,"aaa","xxx");
  54. System.out.println(list); // [cxx, kql, ccc, xxx]
  55. }
  56. }

选择

存储类型.png