精华内容
下载资源
问答
  • 答案:Hashset集合中的JavaBean,如果没有重写equals和hashcode两方法,会导致重复存取,但不会报错。 public class Student { private int age; private String name; public int getAge() { return age; ....

    这其实是一道面试题;

    答案:Hashset集合中的JavaBean,如果没有重写equals和hashcode两方法,会导致重复存取,但不会报错。

    public class Student {
         private int age;
        private String name;
        
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }

        public Student(int age, String name) {
            super();
            this.age = age;
            this.name = name;
        }
         
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + age;
            result = prime * result + ((name == null) ? 0 : name.hashCode());
            return result;
        }
        
        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;
        } 
       
    }

    public static void main(String[] args) {
            Set<Student> set = new HashSet<>();
            set.add(new Student(20,"张山"));
            set.add(new Student(20,"张山"));
            System.out.println(set);

    没有重写equals和hashcode方法之前输出;

    [Student [age=20, name=张山], Student [age=20, name=张山]]



    重写之后输出;

    [Student [age=20, name=张山]] 

    展开全文
  • 简单理解HashSet

    2019-10-04 20:21:59
    HashSet是抽象类AbstractSet的子类,实现了Set接口,由父类特性可知,HashSet存取元素的顺序不一致,按HashCode来存取的;和List不同,HashSet无索引,不可以存储重复元素。 方法摘要 初始化和遍历方法 1.初始...

    简单理解Hashset

    HashSet是抽象类AbstractSet的子类,实现了Set接口,由父类特性可知,HashSet存取元素的顺序不一致,按HashCode来存取的;和List不同,HashSet无索引,不可以存储重复元素

    方法摘要

    初始化和遍历方法

    1.初始化

          HashSet< E> hashset =new HashSet<>();
    

    2.迭代器iterator遍历

        Iterator it = hashset.iterator();
        while(it.hasNext()){
        
        System.out.println(it.next());
        
        }
    

    3.使用增强for循环遍历
    for(元素类型 变量名 :集合名){
    }

          for (String string : hashset) {
    			System.out.println(string);
    			
    		}
           
    

    存取实例

    1.当存取元素为基本数据类型

    public static void Hashparagram(){
    		HashSet <Integer> hs = new HashSet<>();
    		hs.add(11);
    		hs.add(22);           //自动装箱
    		hs.add(11);
    		hs.add(23);
    		hs.add(23);
    		hs.add(11);
    		for (Integer integer : hs) {   //增强for循环
    			System.out.println(integer);
    		}
    	}
    

    结果: 22 11 23
    2.当存取元素为自定义对象时,要想使元素保持唯一,需要在自定义对象类中重写HashCode()和equals()方法
    Perosn类中

    public class Person {
         private  String name;
         private  int age;
         
         public Person(String name, int age) {
    		super();
    		this.name = name;
    		this.age = age;
    	}
              public Person(){
        	 
         }
              
    	@Override
    		public int hashCode() {         //重写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) {    //重写equals
    			if (this == obj)
    				return true;
    			if (obj == null)
    				return false;
    			if (getClass() != obj.getClass())
    				return false;
    			Person other = (Person) 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;
    		}
    	@Override
    		public String toString() {          //重写toString
    			return "姓名 " + name + ", 年龄 " + age ;
    		}
    
    import java.util.HashSet;
    import java.util.Random;
    
    public class demoSet {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
           
    		  HashSet<Person>  set =new HashSet<>();
    		  set.add(new Person("张三",23));
    		  set.add(new Person("李四",24));
    		  set.add(new Person("张三",23));
    		  set.add(new Person("张三",23));
    		  set.add(new Person("李四",24));
    		  set.add(new Person("张三",23));
    		  set.add(new Person("李四",24));
    		  
    		  for (Person person : set) {   //增强for循环遍历
    			System.out.println(person);
    		}
    		 
    		  
    //		 
    	}
    

    结果:
    在这里插入图片描述

    HasSet原理:

    当HashSet集合对象调用add()方法存储对象的时候,先调用对象的HashCod()方法的到一个哈希码,然后在集合中查找是否有哈希码相同的对象;
    若无哈希码相同的对象,就直接存入集合。
    若有哈希码相同的对象,调用者调用equals与其相比较,比较结果为false就存入集合中;

    Hash表的数据结构

    在这里插入图片描述

    HashSet去除重复自定义对象

    • 自定义类中必须重写hashCode()和equals();
    • hashCode() : 属性相同,返回值相同;
    • equals():属性相同返回true,不存
      属性不同false,存;

    **

    面试题

    1.如果两个对象的HashCode相同,两个对象的equals()一定相同吗?

    :不一定 ,HashCode 是由Hash算法决定的,不同的对象HashCode可能相同,

    但是equals()不一定相同,如果两个对象的HashCode相同,就比较equals(),若equals()也相 同,则这两个对象一定相同。无法添加到HashSet集合中。

    1. 如果两个对象的equals()方法相同,这两个对象的HashCode一定相同吗?
      答:一定相同的

    **

    展开全文
  • HashSet/HashMap 存取值的过程

    千次阅读 2018-06-09 15:43:13
    HashSet与HashMap的关系:(1)HashSet底层用的就是HashMap

    HashSet与HashMap的关系:

    (1)HashSet底层用的是HashMap来实现的

    (2)这个HashMap的key就是放进HashSet中的对象,value就是一个Object类型的对象

    (3)当调用HashSet的方法时,实际上是向HashMap中增加了一个键值对,key就是set增加的那个对象,value是一个Object类型的对象

    HashMap数据格式解析

    (1)HashMap底层采用数组维护,数组的类型的Entry类型,Entry对象有2个成员变量——key和value,对应的就是map的key和value

    (2 )Entry对象还有个Entry类型的成员变量next,是用于2个对象的hashcode值一样时,把一个对象的引用挂在这个对象的成员变量上的

    HashMap存值过程(put方法)

    (1)当往一个HashMap增加一个键值对时,会先调用键这个对象的hashcode方法,来得到一个hashcode值,然后根据这个值来计算出这个键值对所在的数组下标

    (2)判断该下标数组存的引用是否为null,如果是,直接把对象存到数组里,存储结束;如果不是,转(3)

    (3)判断已存在对象的key的equals方法,跟需要添加的对象的key对比,是否为true,如果是,覆盖这个key所对应的value,存储结束;如果不是,获取到已存在对象的next成员变量的引用,转(4)

    (4)判断这个next所指向的值是不是为空,如果不为空,重复(3)的过程;如果为空,则把next引用指向要增加的对象

    HashMap取值过程(get方法)

    (1)调用key的hashcode方法,根据返回值定位到map里数组对应的下标

    (2)判断这个数组下标是不是指向了null,如果是,返回null;如果不是,转(3)

    (3)判断这个引用对应对象的key值的equals方法,跟查询的key值对比,判断是否为true,如果是,返回这个对象的value值;如果不是,转(4)

    (4)判断这个引用对应对象的next指的是不是null,如果是null,返回null;如果不是,取出这个next对象,重复(3)

    展开全文
  • /*2010 4/12by Younger.Shen */ Java漫游-HashSet结构的存取 对java的一点点研究,java的庞大自不必说了,无论是复杂的类库还是多样的数据类型,为我们编程自然提供了更多的功能,但是很明显的就是java的多功能是...

     /*2010 4/12

    by Younger.Shen
     
    */
     
    Java漫游-HashSet结构的存取
    对java的一点点研究,java的庞大自不必说了,无论是复杂的类库还是多样的数据类型,为我们编程自然提供了更多的功能,但是很明显的就是java的多功能是建立在
    更加复杂的内部机制中的,这其中的细节部分自然是非常难以掌握,java的核心机制自然很多人都知道,不外乎继承,动态多太,封装,代码复用,以及泛型的相关方面,
    但是其中设计的细节就太多了,掌握起来也十分不容易,当然这给我们构造复杂数据类型实现复杂功能的编程提供了很大帮助,研究了很长时间,今天就写一写,备忘,希望
    读过的人能给点意见,大家多多交流哈!
     
    构造下面的类,下面程序中用最明了的类继承实现了equals方法和hashcode方法的重写,也可以说是覆盖(很多同学分不清楚重写和重载,其实还是很容易区分的,重载大多数
    时候是在同一个块中,同一个类或者是其他的块中,而覆盖或者说是重写呢,是在发生继承关系的时候超类方法在子类方法中的重新定义,再次提醒自己这里要多多注意),这里要说明的问题是hash集合的存储的特性以及所使用的技术细节,hashSet之所以速度快是因为数据在它的内部不是按顺序存放的,而是按该数据的哈希值进行索引的,是该数据的哈希值确定了该数据在该结构中的位置,在索引的时候也是使用hash值,HashSet的3大特点就是,其中的数据存放不一定是顺序的,而且其中的顺序有可能在程序的运行过程中发生变化(比如2个相同的数据结构,因为程序操作使其内部的数据成了一样的,而它的哈希值也会变成一样的,这样在操作的时候就会发生意想不到的结果),HashSet是线程不安全的,2个或者2个以上的线程在同时操作HashSet的时候需要人为的来控制线程同步问题,最后是结构内可以存储NULL型引用。
    大多数时候我们不太关心上面的问题,真正影响到我们应用的是HashSet本身的特性,hashset中不能放入相同的元素,当一个元素放入结构中的时候,会自动调用该元素的xx.hashcode()方法计算出该元素的哈希值,然后这个值会确定该元素在结构中的位置,在实际的操作过程中,结构会调用元素的equals方法判断是否有和结构中的数据相等,之后判断Hashcode,如果equals返回true,但是2个元素的hashcode不相同的话,那么数据可以成功放入,系统会认为是2个不同的数据元素,
    下面的程序中 A和B分别重写了equals方法和hashcode方法,其中A方法的equals始终返回true,B方法的hashcode返回1,这样主方法中在往结构中添加的时候都会没有问题,因为2个A的hashcode不同。2个B的equals返回为false,但是需要注意的是在类C中同时重写了 Hashcode equals方法,这样就会悲剧了,编译完全正常,结果就是只有1个c元素在结构中,在实际应用中如果不注意的话可能需要调试很久才能找到问题所在,这是很严重的。
    而且一般情况下如果重写equals方法的话那么也应该重写hashcode方法,就是说如果equals返回true那么hashcode 也应该返回相同的哈希值,这种情况下只能有1个元素被添加,如果equals true 而hashcode不同,那么相同元素会被放到结构中的不同位置中去,但是如果equals false而 hashcode 相同那么会引起更麻烦的问题,其实这里我也不懂怎么回事,调试不出来,希望大家多多交流,
     
    Code:
    1. import java.util.*;  
    2.   
    3. class A{  
    4.         public boolean equals(Object o){  
    5.   
    6.         return true;  
    7.     }  
    8.   
    9. }  
    10.   
    11. class B {  
    12.         public  int hashcode(){  
    13.       
    14.             return 1;  
    15.     }  
    16. }  
    17.   
    18. class C{  
    19.   
    20.     public int hashcode(){  
    21.   
    22.         return 2;  
    23.   
    24.     }  
    25.     public boolean equals(Object o){  
    26.   
    27.         return true;  
    28.     }  
    29. }  
    30.   
    31. public class TestHash{  
    32.   
    33.     public static void main(String[] args){  
    34.   
    35.         HashSet books = new HashSet();  
    36.         books.add(new A());  
    37.         books.add(new A());  
    38.         books.add(new B());  
    39.         books.add(new B());  
    40.         books.add(new C());  
    41.         books.add(new C());  
    42.         System.out.println(books);  
    43.     }     
    44. }  
     
    展开全文
  • HashSet为什么不能存取重复元素?(底层图解详解) 先说什么是哈希值:哈希值是系统自动分配的逻辑地址(注意:不是物理地址):例如 System.out.println("abc".hashCode()); //输出:96354,字符串"abc"的哈希值就是...
  • HashSet继承Set

    千次阅读 2018-03-09 11:20:25
     /** * 集合类HashSet的特点: * 是具体类,并且是Set接口的实现类 * * 1:内部实现哈希表结构,数组+链表 * 2:HashSet存取无序 * 3:不允许重复值 * 4:允许null值,只能是一个null值。 * 5:线...
  • HashSet集合是Set集合的一个分支,是Set接口的一个实现类.它所存储的元素是不可重复的,并且元素都是无序的.当向HashSet集合中添加一个对象时,首先会调用改对象的hashCode()方法来确定元素的存储位置,然后在调用对象的...
  • HashSet

    2019-05-01 11:29:34
    // HashSet 底层是使用哈希表来支持的,特点:存取速度快 class Person{ int id; String name; public Person(int id,String name) { this.id=id; this.name=name; } @O...
  • 一.概况  HashSet这个集合我们平时用的不是很多,但我们还是需要去了解他,先说一下HashSet的特点:  1.HashSet存取的值是不能重复的;  2.HashSet存取的值是无序的;  3.HashSet不是线现安全的;  4.
  • HashSet与HashMap的关系:(1)HashSet底层用的是HashMap来实现的(2)这个HashMap的key就是放进HashSet中的对象,value就是一个Object类型的对象(3)当调用HashSet的方法时,实际上是向HashMap中增加了一个键值对...
  • Hashset

    2016-10-18 22:22:00
    1.1.1.HashSet ---| Itreable接口 实现该接口可以使用增强for循环 ---| Collection 描述所有集合共性的接口 ---| List接口 可以有重复元素的集合 ---| ArrayList ---|...
  • hashSet

    2017-02-05 22:37:00
    import java.util.HashSet; import javax.print.attribute.HashAttributeSet; /* 集合 的体系: ------------| Collection 单例集合的根接口 ----------------| List 如果是实现了List接口的集合类,具备的...
  • HashSet

    2017-08-26 09:55:14
    HashSet类按照哈希算法来存取集合中的对象,具有良好的存取和查找性能。当向集合中加入一个对象时,HashSet会调用对象的hashCode()方法获得哈希码,然后根据这个哈希码进一步计算对象在集合中的存放位置。 import ...
  • import java.util.HashSet; //hashset方法的使用,set接口实现集合中不含有重复元素 //先调用hashcode()比较地址,然后再用equals比值 class person { int id; String name; public person(int id,String ...
  • HashSet集合

    2021-07-14 16:36:05
    HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取和查找性能。 HashSet 集合的特点 不能保证元素的排列顺序(存放的位置由这个元素的 hashCode值决定) 当向 HashSet 集合中存入一个元素时,...
  • Java HashSet

    2020-06-01 19:41:44
    HashSet 是按照 hash 算法来存储元素的,因此具有很好的存取和查找性能。 特点 不能保证元素的顺序。 HashSet 不是线程同步的,如果多线程操作 HashSet 集合,则应通过代码来保证其同步。 集合元素值可以是 null。 ...
  • Set HashSet

    2018-08-17 09:13:08
    线程是非同步 存取有序 HashSet() :快速的定位、读取,会根据hash值来存放,因此读取出来的顺序未必就是插入的顺序 问:HashSet 是如果保证元素唯一性的? 答: HashSet: 底层数据结构是哈希表。 HashSet...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,511
精华内容 7,004
关键字:

hashset的存取