Collection接口
说明:
List(接口):元素按进入先后有序(添加顺序)保存,可重复,可存储多个null
实现类 | 实现方式 | 是否同步 | 线程安全 | 查增删 | 效率 | 是否重复 |
---|---|---|---|---|---|---|
LinkedList | 链表 | 不同步 | 线程不安全 | 查询慢,增删快 | 效率高 | 元素可重复 |
ArrayList | 数组 | 不同步 | 线程不安全 | 查询快,增删慢 | 效率高 | 元素可重复 |
Vector | 数组 | 同步 | 线程安全 | 查询快,增删慢 | 效率低 | 元素可重复 |
Set(接口):元素不可重复(**hashcode()和equals()**方法保证不可重复),无序做内部排序(与添加顺序无关)
实现类 | 实现方式 | 线程安全/效率 | null | 是否唯一 | 是否有序 |
---|---|---|---|---|---|
HashSet | 使用hash表(数组) | 不安全/效率高 | 可存储null | 元素唯一 | 无序 |
LinkedHashSet(继承HashSet) | hash表+链表 | 不安全/效率高 | 可存储null | 元素唯一 | 有序(插入顺序) |
TreeSet | 红-黑树 | 不安全 | 不能储存null | 元素唯一 | 有序(自定义排序规则) |
注意:每一个存储到 哈希 表中的对象,都得提供 hashCode() 和 equals() 方法的实现,用来判断是否是同一个对象
对于 HashSet 集合,我们要保证如果两个对象通过 equals() 方法返回 true,这两个对象的 hashCode 值也应该相同。
链表保证元素的添加顺序,哈希表保证元素的唯一性
以上三个都是线程不安全的类,解决办法:
Set set = Collections.synchronizedSet(Set对象)
Map(接口) 键值对的集合(双列集合)
实现类 | 实现方式 | 是否同步 | 线程安全 | 排序 | null |
---|---|---|---|---|---|
HashMap | hash表(保证k唯一)+散列表 | 不同步 | 线程不安全 | 无序 | k,v均可为null |
LinkedHashMap(继承HashMap) | 双向链表(保证元素存取顺序一致)和hash表实现保证k唯一) | 不同步 | 不安全 | 有序 | k,v均可为null |
HashTable | hash表+散列表 | 同步 | 安全 | 无序 | k,v不能为null |
TreeMap | 红黑数(保证键的排序和唯一性) | 不同步 | 不安全 | 自然排序和定制排序 | k不能为null,v能 |
concurrenthashmap | 散列表(数组+链表+红黑树) | 同步 | 安全 | 无序 | k,v不能为null |
WeakHashMap(继承HashMap) | 散列表(数组+链表) | 不同步 | 不安全 | 无序 | k,v可以为null |
注意:HashMap底层依赖hashcode和equals,在键值为对象的时候需要重写这两个方法,这两个方法都可以通过右键直接生成。
**散列表**(JDK7:数组+链表,JDK8:数组+链表+红黑树)
注:内容为本人总结而来,涉码不深,可能有误,只供参考!欢迎指出有误的地方