HashSet

  • 简单理解Hashset
  • 方法摘要
  • 初始化和遍历方法
  • 存取实例
  • HasSet原理:
  • Hash表的数据结构
  • HashSet去除重复自定义对象
  • 面试题


简单理解Hashset

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

方法摘要

java获取hashmap第一个值 hashset获取第一个元素_ide

初始化和遍历方法

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);
		}
		 
		  
//		 
	}

结果:

java获取hashmap第一个值 hashset获取第一个元素_HashSet      集合_02

HasSet原理:

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

Hash表的数据结构

java获取hashmap第一个值 hashset获取第一个元素_自定义对象_03

HashSet去除重复自定义对象

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

**

面试题

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

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

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

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

**