Java所自带的容器,几乎可以满足我们日常开发中对数据结构的需求,这里做一个小小的简单总结,但并不会去深究其细节与实现
Java简单的容器分类如下图:
其实只有四种容器:List、Set、Queue、Map,他们各自包含有不同功能的实现版本。
List:
1.ArrayList:一种可以动态增长和缩减的索引序列
2.LinkedList:一种可以在任何位置进行高效地插入和删除操作的有序序列
Set:
1.HashSet:一种没有重复元素的无序集合
2.TreeSet:一种有序集
3.EnumSet:一种包含枚举类型值的集
4.LinkedHashSet:一种可以记住元素插入次序的集
Queue:
PriorityQueue:一种允许高效删除最小元素的集合
Map:
1.HashMap:一种存储键/值关联的数据结构
2.TreeMap:一种键值有序排列的映射表
3.EnumMap:一种键值属于枚举类型的映射表
4.LinkedHashMap:一种可以记住键/值项添加顺序的映射表
5.WeakHashMap:一种其值无用武之地后可以被垃圾回收器回收的映射表
6.IdentityHashMap:一种用==而不是equals比较键值的映射表
1.Collection保存单一的元素,Map保存相关联的键值对。
2.如果要进行大量的随机访问,就用ArrayList,如果要经常从表中间插入或删除元素,就用LinkedList
3.各种Queue以及栈的行为,有LinkedList提供支持
4.Set不接受重复元素。HashSet提供最快的查询速度,而TreeSet保持元素处于排序状态,LinkedHashSet以插入顺序保存元素。
5.HashMap设计用来快速访问,TreeMap保持键始终处于排序状态,所以没有HashMap快。LinkedHashMap保持了元素的插入顺序。
6.不应该再使用过时的Vector、HashTable、Stack
对比Vector、ArrayList、LinkedList有何区别?
这三个都是实现结合框架中的List,也就是所谓的有序集合,因此具体功能也比较相似,比如都提供按照位置进行定位、添加或者删除的操作,都提供迭代器以遍历其内容等。但因为具体的设计区别,在行为 、性能、线程安全等方面,表现又有很大不同。
Vector是Java早期提供的线程安全的动态数组,如果不需要线程安全,并不建议选择,毕竟同步是有额外开销的。Vector内部是使用对象数组来保存数据,可以根据需要自动地增加容量,当数组已满时,会创建新的数组,并拷贝原有数组的数据。
ArrayList是应用更加广泛的动态数组实现,它本身不是线程安全的,所以性能要好很多。与Vector近似,ArrayList也是可以根据需要调整容量,不过两者的调整逻辑有所区别,Vector在扩容时会提高一倍,而ArrayList是增加50%。
LinkedLIst是Java提供的双向链表,所以他并不需要像上面两种那样调整容量,他也不是线程安全的。LinkedList由于基于链表方式存放数据,增加和删除元素的速度较快,但是检索速度较慢。
对比HashTable、HashMap、TreeMap有什么不同?
HashTable、HashMap、TreeMap都是最常见的一些Map实现,是以键值对的形式存储和操作数据的容器类型。
HashTable是早期Java类库提供的一个哈希表实现,本身是同步的,不支持null键和值。由于同步导致的性能开销,所以已经很少被推荐使用。
HashMap是应用更加广泛的哈希表实现,行为上大致与HashTable一致,主要区别在于HashMap不是同步的,支持null键和值等。通常情况下,HashMap进行put或者get操作,可以达到常数时间的性能,所以它是绝大部分利用键值对存取场景的首选,比如,实现一个用户ID和用户信息对应的运行时存储结构。
HashMap基于哈希思想,实现对数据的读写。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。当两个不同的键对象的hashcode相同时,它们会储存在同一个bucket位置的链表中,可通过键对象的equals()方法用来找到键值对。如果链表大小超过阈值(TREEIFY_THRESHOLD, 8),链表就会被改造为树形结构。
TreeMap则是基于红黑树的一种提供顺序访问的Map,和HashMap不同,它的get、put、remove之类的操作都是O(log(n))的时间复杂度,具体顺序可以由指定的Comparator来决定,或者根据键的自然顺序来判断。