HashSet使用

HashSet使用
1.HashSet 特点:
    1.无序,不可重复
    2.容量自动增长。
    
2.存储原理:
    向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算次对象的哈希值,
    此哈希值决定了此对象在Set中存放的位置;若此位置没有被存储对象则直接存储,
    若已有对象则通过对象所在类的equals()比较两个对象是否相同,相同则不能被添加。
    
    添加进Set集合中的元素所在的类一定要重写equals() 和 hashCode()。
    要求重写equals() 和 hashCode()方法保持一致。

3.使用场景:
   所有的技术都是为了转化为生产力,所以要知道如何取使用技术
   如购物车对象转化为订单对象,获取购物车不重复的库存地址
   
4.hashSet没有get方法,所以遍历的时候,有两种方法,一种是通过迭代器,一种是通过增强for循环

例子

没有重写equals()和hashCode类添加相同元素,可以添加进去:

package test;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class TestSet {
	
     public static void main(String[] args){
    	  Set<Person> set = new HashSet<>();
    	  set.add(new Person(1, 1));
    	  set.add(new Person(1, 3));
    	  set.add(new Person(1, 1));
    	//  1.迭代器
    	  Iterator iterator = set.iterator();
    	  while (iterator.hasNext()) {
			Person person = (Person) iterator.next();
			System.out.println("迭代器:"+person);
		} 	 
     }

}

    结果:

           迭代器:Person [x=1, y=3]
           迭代器:Person [x=1, y=1]
          迭代器:Person [x=1, y=1]

重写了equals()方法和hashCode()后

package test;

public class Person {
    private  int x;
    private  int y;
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
	@Override
	public String toString() {
		return "Person [x=" + x + ", y=" + y + "]";
	}
	public Person(int x, int y) {
		super();
		this.x = x;
		this.y = y;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + x;
		result = prime * result + y;
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (x != other.x)
			return false;
		if (y != other.y)
			return false;
		return true;
	}  
       
	
}
package test;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class TestSet {
	
     public static void main(String[] args){
    	  Set<Person> set = new HashSet<>();
    	  set.add(new Person(1, 1));
    	  set.add(new Person(1, 3));
    	  set.add(new Person(1, 1));
    	//  1.迭代器
    	  Iterator iterator = set.iterator();
    	  while (iterator.hasNext()) {
			Person person = (Person) iterator.next();
			System.out.println("迭代器:"+person);
		} 	 
        /*  2.增强for循环
         * for(Person p:set){
        	 System.out.println(p);
         }*/
    	  
     }

}

结果:

       迭代器:Person [x=1, y=1]
       迭代器:Person [x=1, y=3]

所以一定要重写equals()和hashCode()方法


Set接口有两个子类:HashSet和TreeSet 。
|-  HashSet
    |-  特点:在不存在重复元素的基础上,还可以进行高速的存取元素。
     |-  要求:需要为您的类重写hashCode()和equals()方法。
|-  TreeSet
    |-  特点:在不存在重复元素的基础上,还可以将元素自动排序。
     |-  要求:需要为您的类实现Comparable接口,并重写compareTo方法。  
    |-  重写compareTo() 可以同时完成两份工作   排序和消除重复。

猜你喜欢

转载自blog.csdn.net/try_and_do/article/details/81166171