java集合

java 集合

java 集合 从大类上分为以下两种

  • 单列集合 Collection
  • 双列集合 Map

单列集合

List

alt text

alt text

遍历方式:
当collection 因为没有索引,因此不支持普通for循环。

  1. 迭代器循环(只能遍历集合)

alt text

演示代码:

1
2
3
4
5
6
7
8
9
List<String> list = new ArrayList<>();
list.add("java");
list.add("C++");
System.out.println(list.get(1));

Iterator<String> it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
  1. 增强for循环 (数组和集合都能遍历)

alt text

本质就是迭代器遍历集合的简化写法

1
2
3
4
List<String> list = new ArrayList<>();
for(String s:list){
System.out.println(s);
}
  1. Lambda 表达式
1
2
3
4
5
List<String> list = new ArrayList<>();
list.forEach(s-> System.out.println(s));

//通过 方法引用 进行简化
list.forEach(System.out::println);

Set

  • hashSet :数组 + 链表

  • LinkedHashSet:元素之间通过双向链表来记录存储的顺序

  • HashTree: JDK8中,如果一个链表的元素个数超过8,并且table的大小 >= 64 就会变成红黑树

JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)时,会首先调用 treeifyBin()方法。这个方法会根据 HashMap 数组来决定是否转换为红黑树。只有当数组长度大于或者等于 64 的情况下,才会执行转换红黑树操作,以减少搜索时间。否则,就是只是执行 resize() 方法对数组扩容

alt text

alt text

Set集合中每个元素都会有自己的hashcode

如果没有重写hashCode方法 ,不同对象计算出来的哈希值是不同的。

HashSet 集合去重复的机制
如果希望Set集合认为2个内容一样的对象是重复的,必须重写对象的hashcode() 和 equals() 方法

alt text

TreeSet

alt text

TreeSet 排序

alt text

排序时关于返回值的规则

alt text

双列集合map

alt text

Map集合常用方法

alt text

Map集合遍历方式

alt text

  1. 键找值方式 keyset

需要用到 keyset方法 和 get方法

使用map.get() 之前要先判断是否有该key ;使用map.containsKey();

流程:

  • 将Map集合的全部键放到一个Set集合中
  • 遍历Set集合,得到每一个键
  • 根据键去找值
  1. 键值对方法遍历 entrySet

需要用到 entrySet()方法 获取所有“键值对”的集合
流程:把Map集合转换成Set集合,里面的元素类型都是键值对类型( Map.Entry<String,Integer> )
alt text

  1. 使用Lambda表达式
    alt text

  2. keys() && values()

并发修改异常问题

遍历集合的同时又存在增删集合元素的行为时 , 会导致可能出现业务异常
增强for循环和Lambda方法只能遍历元素,不适合 同时做 遍历增删 操作。

解决方法:

  1. 当集合有索引时,可以使用普通for循环倒着遍历去删除元素

  2. 当集合没有索引时,使用迭代器对象去删除元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
        ArrayList<String> list = new ArrayList<>();

list.add("Java入门");
list.add("宁夏枸杞");
list.add("黑枸杞");
list.add("人字拖");
list.add("特级枸杞");
list.add("枸杞子");

System.out.println(list.size());

// 遍历集合的同时又存在增删集合元素的行为时 , 会导致可能出现业务异常
// for (int i = 0; i < list.size(); i++) {
// String s = list.get(i);
// System.out.println(s);
// if (s.contains("枸杞")) {
// System.out.println(s);
// list.remove(s);
// }
// }

// for(String s:list){
// if(s.contains("枸杞")){
// list.remove(s);
// }
// }

Iterator<String> iter = list.iterator();
while(iter.hasNext()){
String s = iter.next();
if(s.contains("枸杞")){
iter.remove(); //通过迭代器的remove()方法去删除,如果使用list的remove方法去删除会报错
}
else{
System.out.println(s);
}
}

hash表原理

alt text

int index = (arr.length - 1) @ 哈希值

Collections 工具类

一个用来操作集合的工具类

alt text


java集合
https://cs-lb.github.io/2024/10/13/Java/java集合/
作者
Liu Bo
发布于
2024年10月13日
许可协议