java 入土--集合详解( 二 )

List 的最常用的三种遍历方法
//以ArraryList为例 public static void main(String[] args) {List list = new ArrayList();List list = new ArrayList();list.add("11");list.add("12");//普通for循环for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}//增强forfor (Object o : list) {System.out.println(o.toString());}//iterator循环//通过列表迭代器添加元素,不会出现并发修改异常Iterator it = list.iterator();while (it.hasNext()) {System.out.println(it.next());} }实例:将 Student 对象添加到集合,三种方式遍历
Student student = new Student("张三",18);Student student2 = new Student("wangjiaqi",13);ArrayList<Student> array = new ArrayList<Student>();array.add(student);array.add(student2);//增强forfor (Student students : array) {System.out.println(students.getName()+students.getAge());}//迭代器Iterator<Student> it = array.iterator();while (it.hasNext()) {Student students = it.next();System.out.println(students.getName()+students.getAge());}//普通forfor(int i = 0; i < array.size(); i++){Student students = array.get(i);System.out.println(students.getName()+students.getAge());}SetSet 接口也是单例的,是无序的,增加和取出顺序是不确定的,无索引不可重复,null 最多有一个 。继承自 Collection 接口,Set 的方法与 List 的方法相差不大,但不能用索引的方式遍历 。
HashSetHashSet 实现 Set 接口,其底层是 HashMap,由于 HashMap 的底层是数组+链表+红黑树,所以 HashSet 的底层就是数组+链表+红黑树,存储时,底层通过 equles()和 hash()方法来确定存储位置,所以存入与取出的顺序不一致 。

java 入土--集合详解

文章插图
HashSet 的初始大小是 16 长度大小的数组,当数组的容量达到 16 的 0.75 倍时,会进行提前扩容,也就是数组在满足 12 时,会进行扩容,其扩容倍数为 2 倍 。
注:当数组长度大于 64,同时链表长度大于 8 时,hashSet 变为红黑树存储,优化存储结构 。
要注意重写 hashCode 与 equlse 方法才能使不同对象的相同内容实现不重复 。
LinkedHashSet父类是 HashSet,底层是 LinkedHashMap,维护了一个数组+双向链表,也是以 hsash 值来确定位置 。存储结构是双向链表,所以是有序的,不允许有双向链表 。
  • 扩容机制
    • 第一次时,数组 table 扩容到 16,底层是存储在 LinkedHashMap$Entry 对象节点上,数组是 HashMap$Node[],在数组中存放 LinkedHashMap$Entry 对象 。
TreeSet底层是 TreeMap,可以进行排序,当我们使用无参构造器,创建 TreeSet 时,仍然是无序的.当我们需要按照某种方式进行排序时,需要使用 TreeSet 提供的一个构造器,可以传入一个比较器[匿名内部类]并指定排序规则
//具体的比较规则还需根据实际进行重写,这里举一个例子 。TreeSet<Object> objects = new TreeSet<>(new Comparator<Object>() {@Overridepublic int compare(Object o1, Object o2) {return o1.toString().compareTo(o2.toString());}});TreeSet 接口间接实现了 Set 接口,是一个有序的集合,它的作用是提供有序的 Set 集合
TreeSet 的特点
  1. 元素有序:按照构造方法进行排序
    1. TreeSet()根据元素的自然排序进行排序
    2. TreeSet(Comparator comparator):根据指定的比较器进行排序,自然排序需要在类中实现 comparator 接口
      java 入土--集合详解

      文章插图
  2. 没有索引,不能用普通 for 循环遍历
  3. 继承 Set 集合,无重复元素

    经验总结扩展阅读