【转】HashSet的用法
原文网址:http://blog.csdn.net/aidesudi/article/details/4720201
- public class TestHashSet {
- public static void main(String [] agrs){
- Set set = new HashSet();
- //添加一个string数据
- set.add("文本");
- //添加一个整数数据
- set.add(new Integer(5));
- //添加一个付点数据
- set.add(12.15);
- //输出集合大小
- System.out.println(set.size());
- //在添加个相同的文本
- set.add("文本");
- //输出大小
- System.out.println(set.size());
- //添加个null值
- set.add(null);
- //输出集合大小
- System.out.println(set.size());
- //再添加个null值
- set.add(null);
- //输出集合大小
- System.out.println(set.size());
- //判断是否存在null值
- System.out.println(set.contains(null));
- // 删除null值
- set.remove(null);
- //判断是否存在null值
- System.out.println(set.contains(null));
- //输出集合大小
- System.out.println(set.size());
- Set set1 = new HashSet();
- UserInfo user = new UserInfo("abc","123");
- UserInfo user1 = new UserInfo("abc","123");
- set1.add(user);
- System.out.println(set1.size());
- //判断是否存在user1这个对象
- System.out.println(set1.contains(user1));
- user.setName("xyz");
- user.setPassword("aaa");
- //在更改了user值后user1还存在吗?
- System.out.println(set1.contains(user1));
- }
- }
- public class UserInfo {
- private String name;
- private String password;
- private int HASHCODE= Integer.MIN_VALUE;
- public UserInfo(String name,String password){
- this.name = name;
- this.password = password;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public int hashCode() {
- if (HASHCODE == Integer.MIN_VALUE) {
- // 重新生成本类的hashCode
- HASHCODE = name.hashCode() + password.hashCode();
- }
- return HASHCODE;
- }
- //判断值是否相等
- public boolean equals(Object obj) {
- if(obj == null || !(obj instanceof UserInfo)){
- return false;
- }
- UserInfo user = (UserInfo)obj;
- return this.name == user.name && this.password == user.password;
- }
- }
从上面的简单添加,和输出结果我想大家已经知道了set的一些用法和特性了。
1. HashSet允许null值。
2. HashSet中值不能重复。
3. Hashset在判断是否存在同一个对象的时候首先会判断对象的hashcode是否相等,然后在判断对象的equals()是否相等。当你向HashSet中存入重复元素时,他会按照正常的流程执行存入操作
底层的数据结构采用的是数组+链表的存储结构(明白这一点对于理解HashSet的原理非常重要),
也就是说数组中的每一个元素都是一个链表(对应java中的List的某一具体实现),
这样当有元素要存入HashSet中时,便会首先通过hashCode()方法得到该对象的一个哈希码,并利用该哈希码通过一些转换算法映射成数组的下标索引(当查找时也是如此,因此会非常的快),接下来便会判断该下标处是否为null若为null则会创建一个列表,此时将待插入的对象直接插入,若列表已经存在则利用equals()方法将带插入对象与列表中的元素逐个比较,相等则忽略,不存在相等元素则直接插入。
因此不同对象的hashCode()是可以相同的(最好是均匀的散列开,这样才能充分的提高访问及插入的速度),
根据equals()判定相等的对象所产生的hashCode()必须相等(根据其原理不难理解,否则的话便会有重复元素出现了)
保证一点 hashCode()与equals()必须能够唯一的确定一个对象。
【转】HashSet的用法的更多相关文章
- 计算机程序的思维逻辑 (41) - 剖析HashSet
上节介绍了HashMap,提到了Set接口,Map接口的两个方法keySet和entrySet返回的都是Set,本节,我们来看Set接口的一个重要实现类HashSet. 与HashMap类似,字面上看 ...
- Java编程的逻辑 (41) - 剖析HashSet
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- 面试官:HashSet如何保证元素不重复?
本文已收录<Java常见面试题>系列,Git 开源地址:https://gitee.com/mydb/interview HashSet 实现了 Set 接口,由哈希表(实际是 HashM ...
- Collection类相关总结
集合类的框架如下: Collection(接口) List(接口):允许重复. ArrayList Vector LinkedList Se ...
- JAVA提高十三:Hashtable&Properties深入分析
最近因为一些琐碎的事情,导致一直没时间写博客,正好今天需求开发完的早,所以趁早写下本文,本文主要学习的是Hashtable的分析,因为上面一篇文章研究的是HashMap,而Hashtable和Hash ...
- java集合框架(Collections Framework)
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- Java HashSet和LinkedHashSet的用法
Java HashSet和LinkedHashSet的用法 类HashSet和LinkedHashSet都是接口Set的实现,两者都不能保存重复的数据.主要区别是HashSet不保证集合中元素的顺序, ...
- HashMap,Hashset,ArrayList以及LinkedList集合的区别,以及各自的用法
基础内容 容器就是一种装其他各种对象的器皿.java.util包 容器:Set, List, Map ,数组.只有这四种容器. Collection(集合) 一个一个往里装,Map 一对一对往里装. ...
- HashSet<T>类 用法
HashSet<T>类主要是设计用来做高性能集运算的,例如对两个集合求交集.并集.差集等.集合中包含一组不重复出现且无特性顺序的元素 改变集的值的方法: HashSet<T>的 ...
随机推荐
- Ouath协议
OAuth是一个开放协议,允许用户让第三方应用以安全且标准的方式获取该用户在某一网站.移动或桌面应用上存储的私密的资源(如用户个人信息.照片.视频.联系人列表),而无需将用户名和密码提供给第三方应用. ...
- ASP.NET-FineUI开发实践-13(二)
1.加图标和事件 上次已经通过DataSimulateTreeLevelField属性控制了树节点的显示,不用看也知道就是给指定列数据前面加个图标的HTML 可以在SimulateTreeHeper类 ...
- java中判断两个字符串是否相等的问题
我最近刚学java,今天编程的时候就遇到一个棘手的问题,就是关于判断两个字符串是否相等的问题.在编程中,通常比较两个字符串是否相同的表达式是“==”,但在java中不能这么写.在java中,用的是eq ...
- (转)模板引擎类dedetemplate.class.php使用说明
1.概述 织梦的模板标签类似于XML格式,所有的模板都含有定界符,默认情况下是{dede:*}和{/dede:*},“*”代表模板标记名称. 一般情况下{dede:*}和{/dede:*}是成对出现的 ...
- oracle 添加表分区
alter table DF_WRITE_FILES_H add partition DF_WRITE_FILES_H96 values less than (201512) tablespace T ...
- UIGestureRecognizer手势识别
UIGestureRecognizer 1.#import "ViewController.h"2.3.@interface ViewController ()<UIGest ...
- Swift - 14 - 字符串的基础操作
//: Playground - noun: a place where people can play import UIKit // 拼接 var str = "Hello, playg ...
- Linq 实现普通sql中 where in 的功能
user.ProjectIds 的值是使用逗号分隔的 例如:1,2,3 projectList = (from a in projectList where (user.ProjectIds.Spli ...
- weka打开提示内存不足的解决方法
今天在linux中打开Weka时,打开基因数据文件的时候出现如 Not enough memory . Please load a smaller dataset or use a larger he ...
- Shell 脚本编程笔记(一) Hello Shell
最近不断在接触Linux操作系统,对它一个终端走天下的特性感到十分新奇和伟大.同时也被各种命令折磨的死去活来...公司的一个老同事给我讲,在公司的极品geek宅都是只用一个黑黑的框完成一切的.结果我一 ...