Java常用集合
图解关系
单列Collection接口
双列Map接口
List接口对比
底层结构 | 版本 | 线程安全(同步效率) | 扩容倍数 | |
---|---|---|---|---|
ArrayList | 可变数组 | jdk1.2 | 不安全,查询效率高、增删效率低 | 有参构造1.5倍数;如果是无参第一次10,第二次1.5倍 |
Vector | 可变数组 | jdk1.0 | 安全,效率不高 | 无参,默认10,满后按2倍扩容,指定大小,则每次按2倍扩容 |
LinkedList | 双向链表 | jdk1.2 | 不安全,增删效率高、查询效率低 | 无需扩容 |
-
RandomAccess 作用
ArrayList实现RandomAccess接口,但是RandomAccess接口里面是空的!Linked并没有实现RandomAccess接口,这只是一个标记接口,发现ArrayList的普通for遍历更快,Linked的迭代器更快,可以list instanceof RandomAccess进行判断
Set接口
Hashset
- 原理
-
实现set接口
-
实际上是HashMap(数组+链表+红黑树)
-
可以放null,但是只能放一个(元素不能重复)
-
不保证元素有序,取决于hash后,再决定索引值
-
添加流程
- HashSet底层是HashMap
- 添加元素时,先得到hash值,会转成索引值
- 找到数组,看这个索引位置是否有值
- 如果没有值直接加入;如果有值,调用equals方法比较(一个节点、红黑树、链表),如果相同,放弃添加,不同,则添加到最后
- 添加完后,判断,在java8中,链表的个数8(含),数组64(含),链表进行红黑树化
- 数组的扩充。默认16,是16*0.75就开始认为提前扩充,扩充为原来的2倍
-
应用
- 加入学生类,将姓名和年龄相同的认为同一个放入HashSet中保存
LinkedHashSet
- 说明
-
LinkedHashSet是HashSet的子类
-
LinkedHashSet的底层是LinkedHashMap,LinkedHashSet实际是数组+双向链表
-
LinkedHashSet是根据元素的hashCode值来决定元素的存储位置,同时使链表维护元素次序,看起来是以插入顺序保存的
-
不能添加重复元素
-
TreeSet&TreeMap
-
说明
- TreeSet的排序是通过TreeSet的构造器中传入一个Comparator匿名内部类,匿名内部类重写compare方法实现
- TreeSet的底层实际上时TreeMap实现
- 在调用add添加方法的时候,在底层调用我们重写的compare方法
- 注意,添加的时候是否能够后加入看我们的compare是否返回0而不是重复(默认是无规则的)
- TreeSet的add所以一定实现Comparator匿名类,或者默认有,实现Comparble接口
Set的去重机制
Map接口
Map
-
说明
-
Map和Collection是并列的,用于保存映射关系的K-V性
-
Map的key和value可以是任何引用类型,会封装到HashMap$Node对象中
-
Map的key不许重复,和HashSet一样
-
Map的value是可以重复的
-
Map的key可以为null,但是只能一个,value也可为null,可以为多个
-
Map的可以常用String
-
key和value是对应的,可通过key找到value
-
-
Map的遍历
- 通过KeySet得到一个key集合的Set(通过迭代器或者增强for循环遍历全部)
- 通过Values取出v,map.values()得到一个Collection集合(迭代器、增强for)
- 通过EntrySet来获取K-v,得到一个Entry对象的Set集合,通过getKey()、getValue()取值(迭代器、增强for)
HashMap
-
添加流程和上面HashSet一样
-
原理性
-
k-v 最后是HashMap$Node node = newNode(hash,key,value,null)
-
k-v是为了方便遍历,会创建EntrySet集合,该集合存放的Entry,而一个Entry对象就有k、v EntrySet<Entry<K,V>>即:transient Set<Map.Entry<K,V>> entrySet
-
entrySet中,定义的类型Map.Entry,但是实际上还是HashMap$Node,其实是一种多态的向上转型
-
当把HashMap$Node对象存放到entrySet就方便遍历Map.Entry提供getKey()、getValue()
-
put一个重复key,更新原来的value,返回一个原来的old值
-
HashTable
- 存放的元素是k-v键值对
- Hashtable的键和值都不能为null
- Hashtable使用方法基本和HashMap一样
- Hashtable是线程安全的(synchronized),HashMap线程不安全的
- 原理性
- 底层有一个数组Hashtable$Entry[],第一次初始化大小为11
- 临界值threshold 8 = 11*0.75(加载因子)
- 扩容的的机制当大于等于临界值时,将大小扩容为old*2+1
Properties
- Properties实现类继承HashTable类并实现了Map接口,使用键值对存储数据
- Properties多用于从xxx.properties文件,加载到Properties类对象,并读取和修改
- k-v都不能为空
TreeMap&TreeSet
Collections工具类
- Collection常用方法
- reverse() 顺序的反转
- shuffle() 随机的重新排序
- sort() 自然排序
- sort(list,Comparator) 指定排序
- swap(list,i,j) 指定集合在i和j进行相互调换
- max() min()自然排序的最/最小值
- max(list,Comparator) min(list,Comparator)指定排序的最大/最小值
- frequency() 出现频率的次数
- copy(dest,src) 拷贝集合,需要指定内容大小,不然直接报错
- replaceAll() 替换