一、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可以用于我们需要维护插入元素的顺序的情况

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

  1. Set集合[HashSet,TreeSet,LinkedHashSet],Map集合[HashMap,HashTable,TreeMap]

    ------------ Set ------------------- 有序: 根据添加元素顺序判定, 如果输出的结果和添加元素顺序是一样 无序: 根据添加元素顺序判定,如果输出的结果和添加元素的顺 ...

  2. Python array,list,dataframe索引切片操作 2016年07月19日——智浪文档

    array,list,dataframe索引切片操作 2016年07月19日——智浪文档 list,一维,二维array,datafrme,loc.iloc.ix的简单探讨 Numpy数组的索引和切片 ...

  3. 2015年12月28日 Java基础系列(六)流

    2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流

  4. 2015年12月13日 spring初级知识讲解(四)面向切面的Spring

    2015年12月13日 具体内容待补充...

  5. 2015年8月18日,杨学明老师《技术部门的绩效管理提升(研讨会)》在中国科学院下属机构CNNIC成功举办!

    2015年8月18日,杨学明老师为中国网络新闻办公室直属央企中国互联网络中心(CNNIC)提供了一天的<技术部门的绩效管理提升(研讨会)>培训课程.杨学明老师分别从研发绩效管理概述.研发绩 ...

  6. 2015年8月17日,杨学明老师《产业互联网化下的研发模式转型》在中国科学院下属机构CNNIC成功举办!

    2015年8月17日,杨学明老师为中国网络新闻办公室直属央企中国互联网络中心(CNNIC)提供了一天的<产业互联网化下的研发模式转型>内训课程.杨学明老师分别从产业互联网化的问题与挑战.传 ...

  7. 【C++】命令行Hangman #2015年12月15日 00:20:27

    增加了可以在构造Hangman对象时通过传入参数设定“最大猜测次数”的功能.少量修改.# 2015年12月15日 00:20:22 https://github.com/shalliestera/ha ...

  8. 我的Python成长之路---第一天---Python基础(作业2:三级菜单)---2015年12月26日(雾霾)

    作业二:三级菜单 三级菜单 可一次进入各个子菜单 思路: 这个题看似不难,难点在于三层循环的嵌套,我的思路就是通过flag的真假来控制每一层的循环的,简单来说就是就是通过给每一层循环一个单独的布尔变量 ...

  9. 我的Python成长之路---第一天---Python基础(作业1:登录验证)---2015年12月26日(雾霾)

    作业一:编写登录接口 输入用户名密码 认证成功系那是欢迎信息 输错三次后锁定 思路: 1.参考模型,这个作业我参考了linux的登录认证流程以及结合网上银行支付宝等锁定规则 1)认证流程参考的是Lin ...

随机推荐

  1. COM组件(ActiveX)控件注册失败

    这主要是由于旧版本的falsh player的原因,卸载干净并清理注册表,再次安装flash player即可. 具体方法: 1 在控制面板 卸载程序里面 卸载flash player 2 C:\WI ...

  2. 在ASP.NET MVC中使用MySQL【并使用membership】

            大多数情况下我们使用.NET或ASP.NET(包括MVC)程序时,我们会同时选择SQL Server 或者SQL Express (其他微软产品)做数据库.但是今天使用MVC已经完全没 ...

  3. Request对象的主要方法

    setAttribute(String name,Object):设置名字为name的request的參数值 getAttribute(String name):返回由name指定的属性值 getAt ...

  4. android 根据SD卡中图片路径读取并显示SD中的图片——源代码

    package com.guo; import java.io.File; import android.app.Activity; import android.graphics.Bitmap; i ...

  5. Linux内核--usb子系统的分析

    drivers/usb/core/usb.c subsys_init(usb_init); module_exit(usb_exit); 我们 看到一个subsys_initcall,它也是一个宏,我 ...

  6. grumble.js

    grumble.js是一个jQuery插件.它提供了气泡提示框功能. 我们可以自定义气泡框的角度,大小,内容,以及回调方法等. 用法很简单: $('#grumble1').grumble( { tex ...

  7. 【JavaScript】JS的启动机制

    DOM  Event------------------>触发function() function  自身的调用 主要就是调用function 1.DOM Event 2.调用function

  8. iOS开发——UI篇Swift篇&UISlider

    UISlider override func viewDidLoad() { super.viewDidLoad() titleLabel.text = titleString // Do any a ...

  9. 深入了解android平台的jni---注册native函数

    注册native函数有两种方法:静态注册和动态注册. 1.静态注册方法 根据函数名找到对应的JNI函数:Java层调用函数时,会从对应的JNI中寻找该函数,如果没有就会报错,如果存在则会建立一个关联联 ...

  10. ScrollView反弹效果 仿小米私密短信效果

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/28441197 如今非常多APP都给ScrollView加入了反弹效果.QQ.小米 ...