有两种容器:一个是Collection容器,存放对象的集合;另一种是Map容器,存放键值对(Key-value)集合
Collection容器
从图上我们可以看到Collection接口下有三个儿子,分别是Set,List,Queue;下面我来逐个介绍。
Set集合看重的是独一无二,就是没有重复的值。
HashSet:基于哈希表实现,支持快速查找,但是不支持有序,就是插入的数据遍历出来是无序的。 LinkedHashSet:具有HashSet查找效率,同时前后链维持数据的插入顺序。 TreeSet:基于红黑树实现,支持有序性操作。 ListList集合看重的是有序,同时值可以重复。
ArrayList:底层是数组,能够动态增大位置,支持随机查找,但是插入和删除效率低。 Vector:底层是数组,和ArrayList相似,不同是线程安全。 LinkedList:底层是链表,双相链表所以不支持随机查找,支持顺序查找,插入和删除效率比ArrayList要高。从图上看到,它也也是Queue的儿子,所以他也可以实现双向队列 Map容器 HashMap:基于哈希表 HashTable:基于哈希表,线程安全 TreeMap:基于红黑树实现 List Set Map 区别List:可以添加重复的值,遍历有序。
Set:不可以添加重复的值,插入是无序的。
Map:键值对存储,值可以重复,键不可以重复。
Vector是线程安全,但是因为每一步都是同步的,时间花销非常大。
HashMap和HashTable区别 线程安全:HashTable 是线程安全,HashMap是非线程安全。Hash Table内部的方法都有synchronized修饰,如果要用HashMap又想线程安全,就使用ConcurrentHashMap; 效率:俗话讲,有得有失,既然线程安全了,那么效率就会比HashMap要低,基本上我工作时不会用HashTable。 对Null的支持:HashMap对键和值都支持为NUll,Hash Table不支持键为Null。 底层数据结构:HashMap在JDK1.7和1.8之间变化较大在1.8之后,当链表长度大于8时,链表转化为红黑树,但HashTable没有变化。 ArrayList 和 LinkedList 区别 线程安全:两者都是不同步的,不能保证线程安全 底层数据结构:ArrayList底层用的是数组,LinkedList底层使用的是双向链表 是否支持快速随机访问:ArrayList实现了RandomAccess接口,这个接口并没有任何代码,这只是一个标识而已,LinkedList没有实现这个接口,不支持高效的随机元素访问。 HashSet如何知道重复靠两个方法:hashCode() 和 equals() 。调用hashCode判断对象放入的位置,如果当前位置有值,equals判断这两个值是否相等
hashCode() 和 equals() 两个对象hashCode值相同,不一定相等 两个对象相等,hashCode也相同 两个对象相等,equal返回true