简单理解HashSet

简单理解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一定相同吗?
    答:一定相同的

**

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值