• 欢迎访问金笔头博客,这是一个菜鸟(伪)程序员的自留地,欢迎访问我的github:点击进入

Java源码分析系列(二)——Set集合类

java eason 2541次浏览 2个评论 扫描二维码

 

java集合类是一种特别有用的工具类,可以用于存储数量不等的多个对象,并可以实现常用的数据结构,如栈,队列等。分析java集合大致可以分为Set、List和Map三种体系,其中Set代表无序、不可重复的集合;List代表有序、重复的集合;Map代表具有印射关系的集合。从Java5之后,Java又增加了Queue体系集合,代表一种队列集合实现。

集合与数组的区别:在编程时,常常需要集中存放多个数据,我们可以使用数组来保存多个对象,但数组长度不可变化,一旦在初始化时指定了数组长度,这个数组长度就是不可变的

clipboard

分析ArrayList的源码

clipboard[1]

Set集合

Set集合,类似于一个罐子,程序可以依次把多个对象“丢进”Set集合,而Set集合通常不能记住元素的添加顺序。Set集合与Collection基本相同,没用提供任何额外的方法。

1、HashSet类

HashSet是Set接口的典型实现,大多数时候使用Set集合时候就是使用这个实现类。HashSet就是按Hash算法来存储集合中的元素,因此有很好的存取和查找性能

http://www.cnblogs.com/wangjy/archive/2011/09/08/2171638.html(Hash算法详解)

笔者带领读者解读源码,看看hash算法的在HashSet类中的实现

clipboard[2]

看源码中HashSet其实质是一个HashMap,由于笔者也是第一次看源码

对于集合类最重要的就是其add()方法了

clipboard[3]

HashSet只有一个add方法,调用的是HashMap的put方法,详解看下文的HashMap源码解读

private static final Object PRESENT = new Object();

有点HashMap基础的人应该了解,map存储是采用键值对的形式,这里的值即PRESENT是一个常量Object类

所以此处加入的元素e是作为HashMap中的key存在的,而所添加的e都印射到PRESENT作为value,这就解释了为什么HashMap不能放重复元素的原理,Map中是不允许<key,value>中的key重复的

真相就是,HashSet中的值是HashMap中的Key,保证了其唯一性

有意思的是,HashMap中有一个方法

clipboard[4]

返回一个Set接口的所以键值的视图

LinkHashSet是HashSet的子类,就没什么好说的了

2、TreeSet类

TreeSet是SortedSet接口的实现类,正如SortedSet名字所暗示的,TreeSet可以确保集合元素处于排序状态。与HahSet集合采用hash算法来决定元素的存储位置不同,TreeSet采用红黑树的数据结构来存储集合元素

红黑树的算法详解http://blog.chinaunix.net/uid-26575352-id-3061918.html


金笔头博客, 版权所有丨如未注明 , 均为原创, 转载请注明Java源码分析系列(二)——Set集合类
喜欢 (1)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(2)个小伙伴在吐槽
  1. Im thankful for the article post.Thanks Again. Keep writing.
    young hotties2016-02-01 22:17 Reply 未知操作系统 | Firefox 3.8
  2. Enjoyed every bit of your article. Much obliged.
    erotic videos2016-01-02 00:05 Reply Windows XP | Firefox 3.0.14