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特性的更多相关文章

  1. Leetcode分类刷题答案&心得

    Array 448.找出数组中所有消失的数 要求:整型数组取值为 1 ≤ a[i] ≤ n,n是数组大小,一些元素重复出现,找出[1,n]中没出现的数,实现时时间复杂度为O(n),并不占额外空间 思路 ...

  2. JAVA-集合类型List(ArrayList、LinkedList)常用操作例子(基础必备)

    package com.net.xinfang.reflect; import java.util.ArrayList; import java.util.Arrays; import java.ut ...

  3. 五、Java - 集合

    一.集合 Java 中的集合类存放于 java.util 包中,是一个存放对象的容器. 集合存放的是对对象的引用,对象本身还是存在于 JVM 堆内存中. 存放的是对象,即引用数据类型,对于基本数据类型 ...

  4. 微软在 .NET 3.5 新增了一个 HashSet 类,在 .NET 4 新增了一个 SortedSet 类,本文介绍他们的特性,并比较他们的异同。

    微软在 .NET 3.5 新增了一个 HashSet 类,在 .NET 4 新增了一个 SortedSet 类,本文介绍他们的特性,并比较他们的异同. .NET Collection 函数库的 Has ...

  5. java中使用hashSet的特性,判断数组是否有重复值

    public static boolean cheakRepeat(int[] array){ HashSet<Integer> hashSet = new HashSet<Inte ...

  6. HashSet的特性介绍

    HashSet除了在元素的存储上是无序的以外,还是不能够存储重复的元素. HashSet如何判断元素是否重复呢?是根据元素继承的两个方法来判断,hashCode和equals,当存储元素时,首先判断要 ...

  7. 去除List<Object>集合中重复的元素(利用HashSet的特性---无重复元素)

    import java.util.ArrayList;import java.util.HashSet;import java.util.Iterator; public class Hashset ...

  8. hashset hastable dictionary concurrentdictionary区别

    1.HashTable 哈希表(HashTable)表示键/值对的集合.在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现 ...

  9. 2020了你还不会Java8新特性?(五)收集器比较器用法详解及源码剖析

    收集器用法详解与多级分组和分区 为什么在collectors类中定义一个静态内部类? static class CollectorImpl<T, A, R> implements Coll ...

随机推荐

  1. 基于Quartz.net 的任务调度平台Weiz.TaskManager

    Weiz.TaskManager https://github.com/weizhong1988/Weiz.TaskManager 任务管理平台 系统简介 Quartz.net是一个开源的任务调度工具 ...

  2. 链表两数相加(add two numbers)

    问题 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它 ...

  3. linux--初识别

    镜像网站 下载系统镜像 http://mirrors.163.com/ http://mirrors.sohu.com https://www.netcraft.com/ 命令大全 https://m ...

  4. 微信小程序 Mustache语法详解

    最近微信小程序非常火,对于前端开发的程序员是个利好的消息,这里主要记录下微信小程序  Mustache语法. 小程序开发的wxml里,用到了Mustache语法.所以,非常有必要把Mustache研究 ...

  5. BZOJ 1878(离散化+线段树)

    题面 传送门 分析 首先我们观察到区间范围较大,而区间个数较少,考虑离散化,将所有询问按照右端点进行排序 离散化之后研究区间颜色个数变化的规律 当我们处理到第a[i]个段时,设a[i]上一次出现的地方 ...

  6. Excel VBA批量处理寸照名字

    需求:因为处理学生学籍照片,从照相馆拿回来的寸照是按班级整理好,文件名是相机编号的文件.那么处理的话,是这么一个思路,通过Excel表格打印出各班A4照片列表,让学生自行填上照片对应姓名.表格收回来后 ...

  7. C#学习——控件

    Windows应用程序控件的基类是位于System.Windows.Forms命名空间的Control类. Control类定义了控件类的共同属性.方法和事件,其他的控件类都直接或间接到派生自这个类. ...

  8. ES6——面向对象应用

    面向对象应用——React 特点:     1.组件化(模块化) --- class(一个组件就是一个class)     2.强依赖与JSX (JSX==babel==browser.js  是JS ...

  9. jQuery中attr()和prop()及removeAttr()和removeProp()的区别

    在jquery1.6之前的所有版本中设置和获取元素属性(固有属性和自定义属性)都使用attr方法,后来单独把设置和获取元素固有属性单独做成了prop()方法. 一般来说: 对于HTML元素本身就带有的 ...

  10. Docker实战部署应用——Redis

    Redis 部署 拉取Redis镜像 docker pull redis 创建Redis容器 docker run -id --name=sun_redis -p 6379:6379 redis 客户 ...