Set集合——HashSet、TreeSet、LinkedHashSet(2015年07月06日)

一、Set集合不同于List的是:
Set不允许重复
Set是无序集合
Set没有下标索引,所以对Set的遍历要通过迭代器Iterator
二、HashSet
1、HashSet由一个哈希表支持,内部实际上是一个HashMap,HashMap的键即为HashSet的值,HashMap的值是一个固定常量,这也就是HashSet中不允许重复的值的原因,因为HashMap的键不允许重复。
HashSet允许null值,并且只允许一个null值存在,它也是非线程安全的,不过它提供构造线程安全的HashSet的方法
Set hashSet = Collections.synchronizedSet(new HashSet(...));
2、HashSet的值不允许重复,那它是怎么保证元素的不重复呢?
对于加入至HashSet中的元素必须要实现并定义自已的equals()方法,但是对于良好的设计风格,最好在覆盖equals()方法的同时,也覆盖hashCode()方法,在往HashSet中插入新的对象时,首先会用该对象的hashCode()与已经存在对象的hashCode()做比较,如果相等,那就不能插入,如果不等,才会调用equals()方法,如果equals结果为true,说明已经存在,就不能再插入,如果为false,可以插入。
eg
User user = new User();
user.setUserId(1);
user.setUserName("Dreyer");
user.setPassword("123456");
user.setBirthday(new Date());
User user2 = new User();
user2.setUserId(1);
user2.setUserName("Dreyer");
user2.setPassword("123456");
user2.setBirthday(new Date());
HashSet hashSet = new HashSet();
hashSet.add(user);
hashSet.add(user2);
System.out.println("集合大小:"+hashSet.size());
对以上面的代码,如果User类没有实现equals()、hashCode()方法,则会输出:集合大小:2
我们给User类增加equals()、hashCode()方法
@Override
public boolean equals(Object o) {
	if (this == o) return true;
	if (o == null || getClass() != o.getClass()) return false;
	User user = (User) o;
	if (userId != user.userId) return false;
	if (userName != null ? !userName.equals(user.userName) : user.userName != null) return false;
	return true;
}
@Override
public int hashCode() {
	int result = userId;
	result = 31 * result + (userName != null ? userName.hashCode() : 0);
	return result;
}
上面的代码则会输出:集合大小:1
(实际上是根据hashCode来判断是否相等)

三、TreeSet
1、TreeSet是基于红-黑树实现的,内部实际上是一个TreeMap,类似于HashSet,TreeSet也不允许重复的元素,也是非线程安全的,同样它也提供构造线程安全的TreeSet方法
Set TreeSet = Collections.synchronizedSet(new TreeSet(...));不同的是TreeSet不允许null值,如果你试图添加null值,它会抛出NullPointExceptin。
2、TreeSet的底层实现是采用红-黑树的数据结构,采用这种结构可以从Set中获取有序的序列,但是前提条件是:元素必须实现Comparable接口,该接口中只用一个方法,就是compareTo()方法。当往Set中插入一个新的元素的时候,首先会遍历Set中已经存在的元素,并调用compareTo()方法,根据返回的结果,决定插入位置。进而也就保证了元素的顺序。 如果把没有实现Comparable的对象放入TreeSet中,则会抛出ClassCastException。
四、LinkedHashSet
1、LinkedHashSet是基于哈希表和链接列表实现的,此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代。注意,插入顺序不受在set中重新插入的元素的影响。(如果在 s.contains(e) 返回 true 后立即调用 s.add(e),则元素 e 会被重新插入到 set s 中。)
2、LinkedHashSet继承自HashSet,所以同样允许null值,不允许重复,LinkedHashSet以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代(插入是什么顺序,迭代出来就是什么顺序)

五、使用情况总结
HashSet是基于哈希表实现的,其性能一般要优于TreeSet,所以在追求效率的时候用HashSet
TreeSet一般用于有排序需要的情况下
LinkedHashSet可以用于我们需要维护插入元素的顺序的情况
时间: 2024-10-28 21:26:51

Set集合——HashSet、TreeSet、LinkedHashSet(2015年07月06日)的相关文章

UGITC携手西门子2015年07月21日举办机器人行业技术研讨会

UGITC携手西门子将在2015年07月21日下午在西门子大楼举办机器人行业技术研讨会.目前,国际制造业中心正向中国转移,用信息化带动工业化.用高新技术改造传统产业已成为我国工业发展的必由之路.作为先进制造装备之典型代表的工业机器人必将有一个大的产业发展空间.SiemensPLM助力ABB.柯马等机器人行业更快地迈向工业革命4.0,期待您的加入! 报名截止日期为7月20日(星期一) 请填写以下表格邮件回复邮件到:[email protected]进行报名,名额有限报名从速! 会议地点:上海市大连

传智播客 刘意_2015年Java基础视频-深入浅出精华版 笔记(2015年10月25日23:28:50)

本笔记是个人笔记+摘录笔记相结合,非完全原创 day01 win 7系统打开DOS有趣方法:按住shift+右键,单击“在此处打开命令窗口”(注意:在此处可以是任何的文件夹,不一定是桌面) 用DOS删除的文件不可以在回收站恢复?!! 常用DOS命令d: 回车 盘符切换dir(directory):列出当前目录下的文件以及文件夹md (make directory) : 创建目录(创建文件夹)rd (remove directory): 删除目录(删除文件夹,注意:前提是文件夹必须是空的!!)如果

更新日期 2015年8月23日 - Citrix桌面虚拟化平台交付推荐版本及相关hotfix

更新日志: 2015年8月19日    增加NVIDIA最新vGPU for XenServer下载地址 2015年8月21日    增加Windows Server 2008R2 推荐安装补丁 2015年8月23日    更新XenServer 6.5 hotfix ++++++++++ 为了方便大家在使用Citrix产品时选择合适的版本及相应的hotfix补丁,特将相关内容整理如下,并不定期更新. 以下所有内容为个人经验分享,不代表任何Citrix官方建议. 目前Citrix桌面虚拟化平台中

2015年9月01日课程作业(磁盘和文件系统管理)-JY1506402-19+liuhui880818

<Linux系统管理> (1)磁盘和文件系统管理: (2)RAID, LVM; btrfs; (3)程序包管理:rpm, yum(dnf) (4)Linux的网络管理; (5)进程和作业管理:htop, glances, tsar: (6)sed和awk: (7)Linux系统的开机启动流程: (8)内核基础知识,内核定制编译: (9)系统安装:kickstart, pxe 一.作业(练习)内容: 1.复习本次课程所讲的内容: 2.总结整理磁盘管理及文件系统管理中设计的各种命令的使用,并附注一

传智播客_2015年Java基础视频-深入浅出精华版 笔记(2015年9月14日23:11:11)

本笔记是个人笔记+摘录笔记相结合,非完全原创 day01 win 7系统打开DOS有趣方法:按住shift+右键,单击“在此处打开命令窗口”(注意:在此处可以是任何的文件夹,不一定是桌面) 用DOS删除的文件不可以在回收站恢复?!! 常用DOS命令d: 回车 盘符切换dir(directory):列出当前目录下的文件以及文件夹md (make directory) : 创建目录(创建文件夹)rd (remove directory): 删除目录(删除文件夹,注意:前提是文件夹必须是空的!!)如果

2015年8月27日课程作业(文件权限管理及grep正则和扩展正则表达式)-JY1506402-19+liuhui880818

学习内容:文件权限管理及grep正则和扩展正则表达式 系统环境:CentOS 6.7/7 x86_64 一.作业(练习)内容: 1.总结本此课程中所涉及命令的使用方法及相关示例展示: 2.总结基本正则表达式及扩展正则表达式 3.显示/etc/passwd文件中以bash结尾的行 4.显示/etc/passwd文件中的两位数或三位数 5.显示`netstat -tan`命令结果中以'LISTEN'后跟0个.1个或者多个空白字符结尾的行 6.添加用户bash.testbash.basher以及nol

linux运维实战练习-2015年8月30日课程作业(练习)安排

一.作业(练习)内容: 1.总结文本编辑工具vim的使用方法: 2.总结文件查找命令find的使用方法: 3.总结bash环境变量的相关内容: 4.总结Linux文件系统上的特殊权限(SUID.SGID.Sticky)的知识点: 5.总结Linux磁盘管理.文件系统相关知识点及其相关命令的使用方法: 6.复制/etc/grub.cfg配置文件至/tmp目录,用查找替换命令删除/tmp/grub.cfg文件中的行首的空白字符: 7.复制/etc/rc.d/init.d/functions文件至/t

雷米 - 心理罪:暗河(2015年8月9日)

<心理罪:暗河> 作 者:雷米译 者:系 列:出 版:重庆出版社字 数:290千字阅读完成:2015年8月9日

雷米 - 心理罪:教化场(2015年8月8日)

<心理罪:教化场> 作 者:雷米译 者:系 列:出 版:重庆出版社字 数:270千字阅读完成:2015年8月8日