35 、HashSet详解
HashSet特点
1、不能保证元素的排列顺序
2、没有重复元素
3、HashSet不是同步的,多个线程同时访问一个HashSet,需要通过代码来保持同步
4、集合元素可以是null
当向HashSet中添加元素时,通过对象的HashCode方法来决定元素的存储位置。当两个元素equals相同,HashCode不相同时,HashSet也会看作两个不同元素;当两个元素HashCode相同,equals不同时,HashSet试图把它们保存着同一个位置,但又不行,所以实际上回在这个位置使用链式结构来保存多个对象,这样导致性能下降。
案例:
class A{
public boolean equals(Object obj) {
return true;
}
}
class B{
public int hashCode() {
return 1;
}
}
class C{
public boolean equals(Object obj) {
return true;
}
public int hashCode() {
return 2;
}
}
public class Test{
public static void main(String[] args) {
Set set=new HashSet();
set.add(new A());
set.add(new A());
set.add(new B());
set.add(new B());
set.add(new C());
set.add(new C());
System.out.println(set);
}
}
输出结果:[B@1, B@1, C@2, A@6bbc4459, A@7150bd4d]
【注意】:如果要把某个类的对象保存到HashSet集合中,重写这个类的equals方法和hashCode方法时,应该尽量保证两桶对象通过equals方法比较返回为true时,它们的hashCode方法返回值也相等
LinkedHashSet类
HashSet还有一个子类,LinkedHashSet,LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序来保存的。也就是说,当遍历LinkedHashSet集合里的元素时,会按照元素插入顺序来访问元素。
正因为LinkedHashSet需要维护元素的插入顺序,所以性能略低于HashSet,但是在迭代方位Set里的全部元素时将会有很好的性能
35 、HashSet详解的更多相关文章
- Java 容器之Hashset 详解
Java 容器之Hashset 详解.http://blog.csdn.net/nvd11/article/details/27716511
- java中HashSet详解(转)
HashSet 的实现 对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSe ...
- java中HashSet详解
HashSet 的实现 对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSe ...
- java集合(4)- java中HashSet详解
HashSet 的实现 对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSe ...
- java集合HashMap、HashTable、HashSet详解
一.Set和Map关系 Set代表集合元素无序,集合元素不可重复的集合,Map代表一种由多个key-value组成的集合,map集合是set集合的扩展只是名称不同,对应如下 二.HashMap的工作原 ...
- HashSet 详解
基本介绍 1. 不允许重复(底层是HashMap,用key储存元素,value统一都是 PRESENT),可以为null,无顺序 2. HashSet就是为了提高查找效率的(在查找是否存在某个值时,A ...
- 35.ListSerializer详解
ListSerializer继承了BaseSerializer 一般情况下我们不直接使用ListSerializer ListSerializer会自动调用,序列化many=True的字段时,会自动调 ...
- 集合框架的详解,List(ArrayList,LinkedList,Vector),Set(HashSet,TreeSet)-(14)
集合详解: /* Collection |--List:元素是有序的,元素可以重复.因为该集合体系有索引. |--ArrayList:底层的数据结构使用的是数组结构.特点:查询速度很快.但是增删稍慢. ...
- 重新想象 Windows 8 Store Apps (35) - 通知: Toast 详解
[源码下载] 重新想象 Windows 8 Store Apps (35) - 通知: Toast 详解 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 通知 Toa ...
随机推荐
- Django Pagination
Django provides a few classes that help you manage paginated data – that is, data that’s split acros ...
- 微信开发之如何使用开发工具--weixin-java-tools
一.前沿 微信公众平台由于没有提供针对语言的开发包,只公布了一个基于Http协议的接口和加解密的算法sdk,这样给微信公众号的开发者带来很多工作量,除了实现业务逻辑外,还需要自己处理底层的接口协议细节 ...
- ORACLE的VARCHAR2是字节还是字符
往Oracle一个表的VACHAR2(20)字段中插入七个汉字,提示错误:插入的值太大. 改成插入六个汉字,又可以. 于是百度,原来这与ORACLE的字符集设置有关.(以前的项目都是设置成的ZHS16 ...
- JDK JRE区别
JDK里面的工具也是用JAVA编写的,它们本身运行的时候也需要一套JRE,如C:/Program Files/Java/jdk1.5.x/目录下的JRE.而C:/Program Files/Java/ ...
- [翻译] TLMotionEffect 重力感应
TLMotionEffect 重力感应 https://github.com/jvenegas/TLMotionEffect This category adds a motion effect t ...
- Integer IntegerCache源码
先看一段测试结果: /*public static void main(String[] args) { Integer a = 128, b = 128; Integer c = 127, d = ...
- 5)Linux程序设计入门--信号处理
)Linux程序设计入门--信号处理 Linux下的信号事件 前言:这一章我们讨论一下Linux下的信号处理函数. Linux下的信号处理函数: 信号的产生 信号的处理 其它信号函数 一个实例 .信号 ...
- iOS:网络编程中三个数据解析协议HTTP、XML、JSON的详细介绍
网络编程:HTTP协议.XML数据协议.JSON数据协议: HTTP: 1.HTTP传输数据有四种方式:Get方式.Post方式.同步请求方式.异步请求方式. 说明:同步和异步请求方式在创建链接对象和 ...
- 在上已个Java Spring MVC项目基础上加MyBatis
代码目录: /Users/baidu/Documents/Data/Work/Code/Self/HelloSpringMVC 1. 首先在resource目录加上jdbc.properties: d ...
- PowerDesigner教程系列(一)概念数据模型
目标: 本文主要介绍PowerDesigner中概念数据模型 CDM的基本概念. 一.概念数据模型概述 数据模型是现实世界中数据特征的抽象.数据模型应该满足三个方面的要求:1)能够比较真实地模拟现实世 ...