首页 > 其他分享 >HashSet类

HashSet类

时间:2023-02-21 23:38:14浏览次数:44  
标签:set HashSet wangwu lisi add zhangsan

Set接口的特点是无序和不重复

上图就是无序的体现,HashSet底层数据结构是数组+链表,虽然数组有索引,但是数据并不是按索引来存放
而是先通过Hash算法来给出各个数据存放的位置
如图,数据A通过Hash算法得到存放的位置是索引2,B是索引1,C是索引0
所以HashSe里的数据是无序的

上图是不重复的体现,Hash算法对相同的数据得出的结果是相同的
假设Hash算法得到A的位置是索引2,那么第二个数据还是A时,算法得到的结果还是索引2。HashSet会丢弃到重复的A

添加

package Set;

import java.util.HashSet;

public class hashset {
    public static void main(String[] args) {
        HashSet set = new HashSet();
        set.add("zhangsan");
        set.add("lisi");
        set.add("wangwu");
        System.out.println(set);//[lisi, zhangsan, wangwu]
        /*Hash算法是根据数据的值来得到存放位置的,且不会发生改变
        set.add("wangwu");
        set.add("zhangsan");
        set.add("lisi");
        System.out.println(set);//[lisi, zhangsan, wangwu]
        */
    }
}

addAll

package Set;

import java.util.ArrayList;
import java.util.HashSet;

public class hashset {
    public static void main(String[] args) {
        HashSet set = new HashSet();
        set.add("zhangsan");
        set.add("lisi");
        set.add("wangwu");
        ArrayList list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        set.addAll(list);
        System.out.println(set);//[lisi, a, b, c, zhangsan, wangwu]
    }
}

删除

HashSet不能直接修改,只能先删除再添加来间接修改

package Set;

import java.util.HashSet;

public class hashset {
    public static void main(String[] args) {
        HashSet set = new HashSet();
        set.add("zhangsan");
        set.add("lisi");
        set.add("wangwu");
        System.out.println(set);//[lisi, zhangsan, wangwu]
        set.remove("zhangsan");
        System.out.println(set);//[lisi, wangwu]
    }
}

查询

HashSet也不能单个查询,因为查不到索引。只能遍历

package Set;

import java.util.HashSet;

public class hashset {
    public static void main(String[] args) {
        HashSet set = new HashSet();
        set.add("zhangsan");
        set.add("lisi");
        set.add("wangwu");
        System.out.println(set);//[lisi, zhangsan, wangwu]
        for (Object obj:set) {
            System.out.println(obj);
        }
    }
}

常用方法

toArray

package Set;

import java.util.Arrays;
import java.util.HashSet;

public class hashset {
    public static void main(String[] args) {
        HashSet set = new HashSet();
        set.add("zhangsan");
        set.add("lisi");
        set.add("wangwu");
        System.out.println(set);//[lisi, zhangsan, wangwu]
        Object[] objects = set.toArray();
        System.out.println(Arrays.toString(objects));//[lisi, zhangsan, wangwu]
    }
}

其他

//还有一些之前List里也常用的方法
        set.isEmpty();
        set.contains("lisi");
        set.clear();
        set.size();
        set.clone();//...等等一些方法

数据重复问题



首先再讲下Hash算法,它是通过数据的hashCode来算出存放位置的。
C通过Hash算法根据C的HashCode得出它的位置是索引1,且索引1里没有数据,所以C被存放到索引1
D通过算法是有可能也得到索引1的位置的,假设D的位置也是索引1,此时已经有C了。再判断数据C、D是否相同,相同则抛弃D,不同则用链表把C、D链接起来

要想HashSet和我们的认知一致(id和name都相同就认为两个数据是一样的),就要重写hashCode和equals方法

此时再运行,结果就只有两个对象了

标签:set,HashSet,wangwu,lisi,add,zhangsan
From: https://www.cnblogs.com/ben10044/p/17142897.html

相关文章

  • HashSet的使用以及存储方式
    packageedu.wtbu;importjava.util.HashSet;importjava.util.Iterator;publicclassDemo01{publicstaticvoidmain(String[]args){//HashSet:存储结......
  • HashSet
    HashSet基于HashMap来实现的,是一个不允许有重复元素的集合;HashSet允许有null值;HashSet是无序的,即不会记录插入的顺序;HashSet不是线程安全的;HashSet实现了Set接口......
  • java中的HashSet内部是如何工作的
    HashSet的内部采用HashMap来实现。由于Map需要key和value,所以HashSet中所有key的都有一个默认value。类似于HashMap,HashSet不允许重复的key,只允许有一个nullke......
  • HashSet底层解析
    底层基于hashmap实现,构造函数中会new一个HashMap实例,hashset中的元素都放在hashmap中,key是元素本身,value为PRESENT,PRESENT定义:privatestaticfinalobjectPRESENT =......
  • Set、HashSet、LinkedHashSet
    set接口基本介绍无序(添加和取出的顺序不一致),没有索引不允许重复元素,所有最多包含一个nullHashSetHashSet实现了Set接口HashSet实际上是HashMapHashSet细节s......
  • Rust 中 HashSet 的基础用法示例
    代码:usestd::collections::{HashSet,HashMap};fnmain(){letmutset:HashSet<i32>=HashSet::new();set.insert(1);set.insert(2);//插入元素......
  • JDK 1.8 hashset的源码分析
        /**   *hashset的特点:无序 唯一需要比较器自定义<>中的内容需要实现comparable的接口推荐外部实现:多态,自定义多种规则   *底层实现逻辑:数......
  • 善于使用HashSet和Dictionary使系统性能绝大的提升。
    废话不说。直接上代码。 privatestaticHashSet<string>hashSetLocationIds=newHashSet<string>();stringid=string.Format("{0}{1}{2}{3}{4}",1,2,3,4).......
  • 集合4 HashSet
    HashSet底层实现是数组+链表数据存放时的索引通过内部Hash算法确定--增加数据是无序的Hash算法--索引相同时根据内容是否相同决定是否丢弃,内容不相同则采用链地址......
  • 总结HashSet和TreeSet的去重
    HashSet的去重添加的对象需要重写hashCode()和equals()方法,其中hashCode()方法,应该是根据自定义类对象的成员属性值计算得来,equals()方法,应该是比较自定义类对象的成员属......