Java 容器之Hashset 详解.
?
在之前的博文中本屌已经介绍过java的Collection接口.
作为实现了Collection接口的容器中, List容器无疑是最常用的, 无论是Arraylist, Linklist, Vector 都不难理解.
我们已经知道List容器的特点就是其里面的元素是有序的, 而且允许放入重复的元素.
一, 实现Set接口的容器.
1.1 为何需要set容器
1.2 Set容器的常用方法.
二, HashSet 简介以及优点.
三, HashSet 的内存存储结构.
3.1 Java 里 List的存储结构.
我们知道, 无论是ArrayList, 还是 LinkList, 它们的元素都是一块一块存放地址的内存, 存放的地址再指向各个不同的对象.
3.2 Java 里 HashSet的存放机制(add)
3.2.1 第一步: 根据object1的hashCode()方法获得hashCode()的返回值, 经过算法后获得object1在HashSet中的位置.
3.2.2 第二步情况1: 假如Hashset中的位置3是空的
3.2.2 第二步情况2: 假如Hashset中的位置3不是空的, 而是已经存在一条链表.
3.2 Java 里 HashSet的查找机制(例如 contains())
上面已经介绍过对象是怎样存放入HashSet容器中的了.
3.3 小结: Java 里 HashSet的本质
四, HashSet的对象必须同时重写对象的hashCode 和 equals() 方法.
import java.util.HashSet;class Student{private int id;private String name;public Student(int id, String name){this.id = id;this.name = name;}//overwritepublic String toString(){return this.id + ":" + this.name;}
}public class Hashset1{public static void f(){HashSet hs = new HashSet();hs.add(1);hs.add(2);hs.add(1);hs.add(1);System.out.println(hs);hs.clear();hs.add(new Student(1,"Jack"));hs.add(new Student(2,"Bill"));hs.add(new Student(1,"Jack"));hs.add(new Student(1,"Jack"));System.out.println(hs);}
}
上面简单定义了1个class Student, 只有两个成员id和name.
[java] [1, 2][java] [1:Jack, 1:Jack, 1:Jack, 2:Bill]
可见, 第一次输出1 和 2 符合了Set容器不放入重复元素的原则.
4.1 重写对象的hashCode()方法.
import java.util.HashSet;class Student{private int id;private String name;public Student(int id, String name){this.id = id;this.name = name;}//overwritepublic String toString(){return this.id + ":" + this.name;}//overwrite hashCode()public int hashCode(){return id * name.hashCode();}}public class Hashset1{public static void f(){HashSet hs = new HashSet();hs.add(1);hs.add(2);hs.add(1);hs.add(1);System.out.println(hs);hs.clear();hs.add(new Student(1,"Jack"));hs.add(new Student(2,"Bill"));hs.add(new Student(1,"Jack"));hs.add(new Student(1,"Jack"));System.out.println(hs);}
}
修改后的输出:
[java] [1, 2][java] [2:Bill, 1:Jack, 1:Jack, 1:Jack]
貌似问题还是没解决啊.
4.2 重写对象的equals()方法.
所以除了hashCode() 之外, 放入HashSet容器的类还应该重写equals()方法.
import java.util.HashSet;class Student{private int id;private String name;public Student(int id, String name){this.id = id;this.name = name;}//overwritepublic String toString(){return this.id + ":" + this.name;}//overwrite hashCode()public int hashCode(){return id * name.hashCode();}//overwrite equals()public boolean equals(Object o){Student s = (Student)o;return (s.id == this.id) && (s.name.equals(this.name));}}public class Hashset1{public static void f(){HashSet hs = new HashSet();hs.add(1);hs.add(2);hs.add(1);hs.add(1);System.out.println(hs);hs.clear();hs.add(new Student(1,"Jack"));hs.add(new Student(2,"Bill"));hs.add(new Student(1,"Jack"));hs.add(new Student(1,"Jack"));System.out.println(hs);}
}
[java] [1, 2]
[java] [2:Bill, 1:Jack]
五, 小结:
Java 容器之Hashset 详解.相关推荐
- 并发容器之ThreadLocal详解
文章目录 ThreadLocal的简介 ThreadLocal的实现原理 ThreadLocalMap详解 Entry数据结构 set方法 getEntry方法 remove方法 ThreadLoca ...
- Java同步器之AbstractOwnableSynchronizer详解
JDK 6 时提供. 一种同步器,可以由一个线程独占.该类提供了创建锁和相关同步器的基础,这些同步器可能包含所有权的概念.AbstractOwnableSynchronizer类本身并不管理或使用这些 ...
- python利器怎么编程-Python任务调度利器之APScheduler详解
任务调度应用场景 所谓的任务调度是指安排任务的执行计划,即何时执行,怎么执行等.在现实项目中经常出现它们的身影:特别是数据类项目,比如实时统计每5分钟网站的访问量,就需要每5分钟定时从日志数据分析访问 ...
- java定时任务框架elasticjob详解
这篇文章主要介绍了java定时任务框架elasticjob详解,Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架.该项目基于成熟的开源产品Quartz和Zo ...
- Android绘图Canvas十八般武器之Shader详解及实战篇(上)
本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有java层的,也有jni层深入到Frame ...
- Java单元测试之JUnit4详解
2019独角兽企业重金招聘Python工程师标准>>> Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @B ...
- java -jar 和 -cp详解
java -jar 和 -cp详解 命令行执行程序 假如我们有一个程序,把它打包成Test.jar,如何运行才能成功输出Hello World package com.test; public cla ...
- java访问修饰符详解——学java,零基础不怕,不只要理论,更要实践+项目,a href=http://www.bjweixin.com太原维信科技提供 /a...
java访问修饰符详解--学java,零基础不怕,不只要理论,更要实践+项目 <a href=http://www.bjweixin.com>太原维信科技提供 </a> pub ...
- Java编程配置思路详解
Java编程配置思路详解 SpringBoot虽然提供了很多优秀的starter帮助我们快速开发,可实际生产环境的特殊性,我们依然需要对默认整合配置做自定义操作,提高程序的可控性,虽然你配的不一定比官 ...
最新文章
- Blender建筑可视化技能学习视频教程
- 在组策略中通过.zap的形式发布软件!
- [云炬商业计划书阅读分享]无水洗车业 发展前景好
- 如何构建一个分布式爬虫:基础篇
- Python实现单例模式常量类
- 深入浅出理解 Variable used in lambda expression should be final or effectively final
- MongoDB 副本集管理
- 01.轮播图之四 :imageViews(2 或者 3 个imageview) 轮播
- IDEA/Pycharm 插件与主题切换
- android图片显示代码,Android图片处理:识别图像方向并显示(示例代码)
- 最全 Python 算法实现资源汇总!
- CCF NOI1079 合法C标识符
- lenovo电脑_办公笔记本电脑有哪些值得推荐?
- flash mx拖拽实例_Flash MX 2004 Professional的照片闪光器效果面板
- 密度聚类算法python详解_python实现密度聚类(模板代码+sklearn代码)
- RS-485总线扫盲(图文并茂+超详细)
- 关于Pycharm主题Darcula下使用jupyter显示图片的颜色错误
- 有利于SEO的div+CSS的命名规则小结(技巧)
- 【智能算法】基于双隐含层BP神经网络的预测
- 从开发转型到项目经理,在初创公司我做了什么