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()方法来确定存储位置,所以存入与取出的顺序不一致 。

文章插图
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<Object> objects = new TreeSet<>(new Comparator<Object>() {@Overridepublic int compare(Object o1, Object o2) {return o1.toString().compareTo(o2.toString());}});
TreeSet 接口间接实现了 Set 接口,是一个有序的集合,它的作用是提供有序的 Set 集合TreeSet 的特点
- 元素有序:按照构造方法进行排序
- TreeSet()根据元素的自然排序进行排序
- TreeSet(Comparator comparator):根据指定的比较器进行排序,自然排序需要在类中实现 comparator 接口
文章插图
- 没有索引,不能用普通 for 循环遍历
- 继承 Set 集合,无重复元素
经验总结扩展阅读
- 4 Java I/O:AIO和NIO中的Selector
- 2023年10月5日入土好吗 2023年10月5日入土吉日一览表
- 2023年2月8日适合入土吗 2023年2月8日入土好吗
- 2023年10月6日入土行吗 2023年10月6日入土黄道吉日
- 3 Java I/O:NIO中的Buffer
- 2023年农历八月廿三入土吉日 2023年10月7日入土吉日一览表
- HILINK海联品牌集合店 : 雅诗兰黛各款面霜区别
- 2023年10月8日入土行吗 2023年10月8日入土好吗
- 一 JPA入门学习集合springboot
- Java程序员必会Synchronized底层原理剖析