Java集合类的一些八卦

Map 和 Set的关系

Map和Set其实是好基友,有着千丝万缕的联系。

Map可以看成Set的扩展,因为当Set中存放的内容是key-value的值对的形式时,这个Set实际上可以当成Map使用。反过来,Map中其实有个Map.Entry内部接口,而Map在存放值对时,完全不考虑value,而只考虑key,因此Map也可以看成是一个存key的Set,而value只是key的附属物。

HashMap添加元素时,根据key的hashCode进行再哈希计算得到值来决定存放位置。HashMap底层有个数组Entry[],根据hash值来决定key-value存在数组的哪个元素,而Entry[]实际上是一个table。

HashSet底层是居于HashMap来实现的。HashSet底层用HashMap来保存所有元素,这些元素作为HashMap的key,而对应的Value是一个名为PRESENT的static final的Object对象。对HashSet操作的方法都调用HashMap的方法进行操作。元素是否重复,要同时判断元素对象的hashCode()和equals(),hashCode相等且equals返还true时才认为是重复元素,不进行替换。

TreeSet和TreeMap的关系也是很相似的,即TreeSet底层是采用TreeMap存储的。TreeMap采用红黑树的排序二叉树来保存Map中的每个Entry(树节点)。

 

List的三个实现:ArrayList,Vector和LinkedList。

Vector还有个儿子Stack,Stack只是在Vector的基础上添加了5个方法,仅仅五个方法的代码就将Vector变成了Stack,Stack依然是一个Vector,它继承了Vector的synchronized血统,都是线程安全的。从JDK1.6开始,Java提供了Deque接口并提供了实现类ArrayDeque,即使程序中需要栈这样的数据结构,也不推荐使用Stack而推荐使用Deque,除非要求线程安全。Deque是双端队列,是队列但同时拥有栈的功能,底层都是数组实现。

Vector几乎被ArrayList代替了,它唯一的好处是线程安全。现在甚至为了线程安全也不用Vector了,可以通过Collections工具类的synchronizedList()方法将一个普通的ArrayList包装成线程安全的ArrayList。

 

ArrayList 和LinkedList

ArrayList底层是基于数组实现的,所以ArrayList创建的时候有个初始的capacity,提供了构造方法,编程者可以在创建ArrayList时指定初始的capacity,如果没有显式提供capacity,那么程序默认设置为10.LinkedList是双向链表存储结构,不仅实现List接口,还实现了Deque双端队列接口。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值