说说List,Set,Map三者的区别?
List(对付顺序的好帮手)有序集合,允许有相同的元素。
Set(注重独一无二的性质)无序集合,不允许相同元素。
Map(用Key来搜索的专家): 使用键值对存储,不允许相同的键。
Collection > list set map
Collection 接口
boolean containsAll(Collection c) 判断集合中是否 包含 集合 c 中的所有元素
boolean isEmpty() 判断集合是否为 空
boolean removeAll(Collection c) 从集合中删除所有在集合 c 中出现的元素
Object[] toArray() 返回包含此集合中所有元素的数组
list ArrayList,LinkedList (不同步,都是线程不安全)
ArrayList 采用数组存储, 插入和删除元素的时间复杂度受元素位置的影响(List list = new ArrayList(); // 创建集合)
LinkedList 采用链表存储, 插入和删除元素时间复杂度不受元素位置的影响(LinkedList<String> products = new LinkedList<String>(); // 创建集合对象)
随机访问, LinkedList 不支持高效的随机元素访问,而 ArrayList 支持
set HashSet,TreeSet
HashSet (无序,唯一)基于 HashMap 实现的(HashSet<String> bookSet = new HashSet<String>(); // 创建一个空的 Set 集合)集合中添加两个相同的元素,则后添加的会覆盖前面添加的元素
TreeSet (有序,唯一)红黑树(自平衡的排序二叉树) (TreeSet<Double> scores = new TreeSet<Double>(); // 创建 TreeSet 集合)
LinkedHashSet LinkedHashSet 继承于 HashSet
map HashMap,TreeMap
HashMap 由数组+链表组成的,而 TreeMap 类可以对键对象进行排序。
TreeMap 红黑树(自平衡的排序二叉树),唯一不同的是 TreeMap 类可以对键对象进行排序
LinkedHashMap LinkedHashMap 继承自 HashMap,
Hashtable 数组+链表组成的,数组是 HashMap 的主体
HashMap 和 Hashtable 区别:
线程是否安全: HashMap 是非线程安全的, HashTable 是线程安全的;HashTable 内部的方法基本都经过synchronized 修饰 证线程安全的话就使用 Concurrent HashMap
键,或值是否为空: HashMap 支持, HashTable 不支持
初始容量大小和每次扩充容量大小的不同:
HashMap ,解决哈希冲突,当链表长度大于阈值(默认为8)时,将链表转化为红黑树
HashMap 和 HashSet 区别:
HashSet 底层就是基于 HashMap 实现的。
实现不同的接口, 一个是 map 接口 ,一个是 set 接口。
存储 键值对, set 是存储对象
map 用 put 方法存。 set 用 add 方法存。
HashMap 底层实现:
底层是 数组和链表 结合在一起使用。创建一个链表数组, jdk1.8 以后。 当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。
红黑树:?
多线程情况下使用 ConcurrentHashMap
如何选用集合?
需要根据 键值获取到元素值时就选用Map接口下的集合,需要排序时选择 TreeMap,不需要排序时就选择 HashMap, 需要保证 线程安全就选用 Concurrent HashMap.
当我们只需要存放元素值时,就选择实现 Collection 接口的集合,需要保证 元素唯一时选择实现Set接口的集合比如 TreeSet 或 HashSet ,
不需要就选择实现List接口的比如ArrayList或LinkedList,