Java 容器简单总结

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来决定,或者根据键的自然顺序来判断。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值