ht-6 hashSet特性
Set接口:
Set接口是Collection接口的另外一个常用子接口,Set接口描述的是一种比较简单的集合,集合中的对象并不按特定的方式排序,并且不能保存重复的对象,即set接口可以存储一组唯一的无序的对象。
为什么要用HahSet?
假如我们现在想要在一大堆数据中查找X数据。LinkedList的数据结构就不说了,它的数据结构决定了它的查找效率低的可怕。如果使用ArrayList,在不知道数据的索引,且需要全部遍历的情况下,效率一样的低下。为此,Java集合提供了一个查找效率高的集合类HashSet,该类实现了Set接口,是使用Set集合是最常用的一个实现类,HashSet特性如下:
(1)集合内的元素是无序排列的
(2)HashSet类是非线程安全的
(3)允许集合元素值为null
HashSet类常用方法:
boolean add(Object o) 如果此set集合中尚未傲寒指定元素o,则添加指定元素o
void clear() 从Set集合中移除所有元素
int size() 返回set集合中元素的数量
boolean is Empty() 如果此Set不包含任何元素,则返回true
boolean contains(Object o) 如果此Set包含指定元素,则返回true
boolean remove(Object o) 如果指定元素存在于此Set中,则将其移除
简单示例:
package com.iotek.set; import java.util.HashSet; public class HashSetDemo1 { public static void main(String[] args) {
HashSet<String> data = new HashSet<String>();
// 创建一个HashSet容器对象
data.add("zhangsan");
data.add("lisi");
System.out.println("1:" + data.add("jay")); // 如果添加成功, add()方法返回true
data.add("jack");
System.out.println("2:" + data.add("jay"));
System.out.println(data);
HashSet<Student> stuSet = new HashSet<Student>();
// 把Student对象作为HashSet底层的HashMap里边的键
System.out.println("3:" + stuSet.add(new Student("zhangsan", 20)));
System.out.println("4:" + stuSet.add(new Student("lisi", 20)));
System.out.println("5:" + stuSet.add(new Student("zhangsan", 20)));
// 没有重写hashCode()和equals()前,这个重复的对象可以添加进去,重写了之后,就无法添加
System.out.println("6:" + stuSet.size());
} } class Student {
private String name;
private int age; public Student(String name, int age) {
super();
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} // 只有当2个对象的hashCode和equals()返回值都相同,才能认定为是同一个对象
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
} }
/*
* HashSet原理分析: (1)当调用HashSet的无参构造方法创建一个HashSet对象时, 其内部自动创建了一个HashMap对象,如下所示:
* public HashSet() { map = new HashMap<E,Object>(); }
*
* (2)HashSet没有put()方法,只有add()方法,原因是,这个add()方法其实调用的
* 是HashSet()构造方法创建的map对象的put()方法来对数据进行存储,其实操作的是 HashMap对象里的键,值是定义的一个静态常量PRESENT
* public boolean add(E e) { return map.put(e, PRESENT)==null; }
* (3)size()方法:其实就是返回map对象里的size()方法返回的数据个数 public int size() { return
* map.size(); }
*/
结果如下
HashSet本质:
HashSet底层维护了一个hashMap, set中添加的元素,被作为这个HashMap的key, hashmap键是不能重复的,所以HashSet内部的元素也是不能重复的 ,对于HashSet中保存的对象,需要正确重写equals方法和hashCode方法,以保证放入Set对象的唯一性,正因为这样的原理,HashSet集合是非常高效的,比如,要查找集合中是否包含某个对象,首先计算对象的hashCode,折算出位置号,到该位置上去找就可以了,而不用和所有的元素都比较一遍
参考文章:
https://blog.csdn.net/sugar_rainbow/article/details/68257208
https://www.cnblogs.com/whgk/p/6114842.html
ht-6 hashSet特性的更多相关文章
- Leetcode分类刷题答案&心得
Array 448.找出数组中所有消失的数 要求:整型数组取值为 1 ≤ a[i] ≤ n,n是数组大小,一些元素重复出现,找出[1,n]中没出现的数,实现时时间复杂度为O(n),并不占额外空间 思路 ...
- JAVA-集合类型List(ArrayList、LinkedList)常用操作例子(基础必备)
package com.net.xinfang.reflect; import java.util.ArrayList; import java.util.Arrays; import java.ut ...
- 五、Java - 集合
一.集合 Java 中的集合类存放于 java.util 包中,是一个存放对象的容器. 集合存放的是对对象的引用,对象本身还是存在于 JVM 堆内存中. 存放的是对象,即引用数据类型,对于基本数据类型 ...
- 微软在 .NET 3.5 新增了一个 HashSet 类,在 .NET 4 新增了一个 SortedSet 类,本文介绍他们的特性,并比较他们的异同。
微软在 .NET 3.5 新增了一个 HashSet 类,在 .NET 4 新增了一个 SortedSet 类,本文介绍他们的特性,并比较他们的异同. .NET Collection 函数库的 Has ...
- java中使用hashSet的特性,判断数组是否有重复值
public static boolean cheakRepeat(int[] array){ HashSet<Integer> hashSet = new HashSet<Inte ...
- HashSet的特性介绍
HashSet除了在元素的存储上是无序的以外,还是不能够存储重复的元素. HashSet如何判断元素是否重复呢?是根据元素继承的两个方法来判断,hashCode和equals,当存储元素时,首先判断要 ...
- 去除List<Object>集合中重复的元素(利用HashSet的特性---无重复元素)
import java.util.ArrayList;import java.util.HashSet;import java.util.Iterator; public class Hashset ...
- hashset hastable dictionary concurrentdictionary区别
1.HashTable 哈希表(HashTable)表示键/值对的集合.在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现 ...
- 2020了你还不会Java8新特性?(五)收集器比较器用法详解及源码剖析
收集器用法详解与多级分组和分区 为什么在collectors类中定义一个静态内部类? static class CollectorImpl<T, A, R> implements Coll ...
随机推荐
- 基于Quartz.net 的任务调度平台Weiz.TaskManager
Weiz.TaskManager https://github.com/weizhong1988/Weiz.TaskManager 任务管理平台 系统简介 Quartz.net是一个开源的任务调度工具 ...
- 链表两数相加(add two numbers)
问题 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它 ...
- linux--初识别
镜像网站 下载系统镜像 http://mirrors.163.com/ http://mirrors.sohu.com https://www.netcraft.com/ 命令大全 https://m ...
- 微信小程序 Mustache语法详解
最近微信小程序非常火,对于前端开发的程序员是个利好的消息,这里主要记录下微信小程序 Mustache语法. 小程序开发的wxml里,用到了Mustache语法.所以,非常有必要把Mustache研究 ...
- BZOJ 1878(离散化+线段树)
题面 传送门 分析 首先我们观察到区间范围较大,而区间个数较少,考虑离散化,将所有询问按照右端点进行排序 离散化之后研究区间颜色个数变化的规律 当我们处理到第a[i]个段时,设a[i]上一次出现的地方 ...
- Excel VBA批量处理寸照名字
需求:因为处理学生学籍照片,从照相馆拿回来的寸照是按班级整理好,文件名是相机编号的文件.那么处理的话,是这么一个思路,通过Excel表格打印出各班A4照片列表,让学生自行填上照片对应姓名.表格收回来后 ...
- C#学习——控件
Windows应用程序控件的基类是位于System.Windows.Forms命名空间的Control类. Control类定义了控件类的共同属性.方法和事件,其他的控件类都直接或间接到派生自这个类. ...
- ES6——面向对象应用
面向对象应用——React 特点: 1.组件化(模块化) --- class(一个组件就是一个class) 2.强依赖与JSX (JSX==babel==browser.js 是JS ...
- jQuery中attr()和prop()及removeAttr()和removeProp()的区别
在jquery1.6之前的所有版本中设置和获取元素属性(固有属性和自定义属性)都使用attr方法,后来单独把设置和获取元素固有属性单独做成了prop()方法. 一般来说: 对于HTML元素本身就带有的 ...
- Docker实战部署应用——Redis
Redis 部署 拉取Redis镜像 docker pull redis 创建Redis容器 docker run -id --name=sun_redis -p 6379:6379 redis 客户 ...