集合
#属性说明
-
默认容量 / DEFAULT_CAPACITY
-
负载因子 / Factor
扩容门槛 / Threshold == 当前容量 * 负载因子
-
扩容容量
-
链表转红黑树的阈值/ TREEIFY_THRESHOLD
#Collection子类
默认容量 | 负载因子 | 扩容门槛 | 扩容容量 | |
---|---|---|---|---|
ArrayList / 静态链表 | 10 | 1 | 10 | 右移一位,扩容原来的一半 |
Vector/ 静态链表 | 10 | 1 | 10 | 右移一位,扩容原来的一半 |
HashSet/ 数组 + 链表 + 红黑树 | 16 | 0.75 | 12 | 同HashMap |
注意点:
-
set
允许存储一个null
值 -
以上除了
Vector
线程安全以外, 其余线程都不安全
但是要用如下方法替代Vector
Collections.synchronizeList()
CopyOnWriterList<>()
同理Set
Collections.synchronizeSet()
CopyOnWriterSet<>()
-
Arrays.asList()
-
返回的是该工具类的内部类, 没有
add()
和remove()
方法如果调用就会报出
java.lang.UnsupportedOperationException
-
该方法不能传入基本类型的数组, 但是可以传入
Object
类型的数组Integer[] a = {1,2,3,4}; //有效 int[] b = {1,2,3,4}; //无效
参数是一个可变参数, 打印会调用该内部类的
toString()
方法
-
-
对集合遍历时不能添加和删除
遍历时调用
Itr
的checkForComodification()
,会检查modCount
和exceptedModCount
,而exceptedModCount
的值就是modeCount
, 如果两者不同, 就会抛出异常, 但是add
或是remove
时会修改modCount
#Map
map不属于Collection子类, 但是同属于java.util
包下
默认容量 | 负载因子 | 扩容门槛 | 扩容容量 | 转红黑树 | |
---|---|---|---|---|---|
HashMap/ 数组 + 链表 + 红黑树 | 16 | 0.75 | 12 | 原来的一倍 | 8 |
先按照hash
值找到需要存储的位置, 然后通过对应key
, 找到value
当链表中元素超过8, 转为红黑树
数组用于存储Entry
(对应原码中table
, 包含键值对)
存储时通过Key
的hash值找到对应table
上的位置, 将Entry
键入
HashMap
线程不安全, 使用如下方法替代
-
Collections.synchronizeMap()
-
ConCurrentHashMap<>()
#LinkedList
#LinkedHashMap
和HashMap
比较, LinkedHashMap
使用链表存储Entry
-
HashMap
使用
iterator
遍历时有序, 而HashMap
无序
Map<String, String> hashMap = new HashMap<String, String>();
hashMap.put("name1", "josan1");
hashMap.put("name2", "josan2");
hashMap.put("name3", "josan3");
Set<Map.Entry<String, String>> set = hashMap.entrySet();
Iterator<Map.Entry<String, String>> iterator = set.iterator();
while(iterator.hasNext()) {
Map.Entry entry = iterator.next();
String key = (String) entry.getKey();
String value = (String) entry.getValue();
System.out.println("key:" + key + ",value:" + value);
}
结果:
key:name3,value:josan3
key:name2,value:josan2
key:name1,value:josan1
- 普通
for
或是forEach
, 实质上还是iterator
Map<String, Object> map = new HashMap<>();
map.put("1",1);
map.put("张三",2);
map.put("3",3);
map.put("打发",4);
map.put("5",5);
map.put("李四",6);
for (Map.Entry<String, Object> stringObjectEntry : map.entrySet()) {
System.out.println(stringObjectEntry);
}
结果:
1=1
李四=6
张三=2
打发=4
3=3
5=5