java毕向东听课笔记24(集合框架-Set集合HashSet)

         Set集合在之前讲过,里面的元素是无序的,这里的无序指的是存入和取出的顺序不一定一致,而且元素不可以重复。

         Set集合的功能和Collection是一致的。

         Set集合常见的子类有两个:HashSet,TreeSet。其中HashSet底层数据结构是哈希表。

         

import java.util.*;

class HashSetDemo{
	public static void sop(Object obj){
		System.out.println(obj);
	}
	
	public static void main(String[] args){
		HashSet hs = new HashSet();
		
		hs.add("java1");
		hs.add("java1");
		hs.add("java2");
		hs.add("java3");
		hs.add("java4");
		
		Iterator it = hs.iterator();
		
		while(it.hasNext())
			sop(it.next());
		
	}
}

可见,HashSet中存放元素是无序的(这里有点特殊,呈现了倒序),而且即使有重复的元素,集合中也只存放一个,这一点可以根据add方法的返回值类型是boolean来验证

import java.util.*;

class HashSetDemo{
	public static void sop(Object obj){
		System.out.println(obj);
	}
	
	public static void main(String[] args){
		HashSet hs = new HashSet();
		
		sop(hs.add("java1"));
		sop(hs.add("java1"));
		hs.add("java2");
		hs.add("java3");
		hs.add("java4");
		
		Iterator it = hs.iterator();
		
		while(it.hasNext())
			sop(it.next());
		
	}
}

可见第一次存放java1成功,第二次存放java1失败。
-----------------------------------------------------------------------------------

HashSet存放自定义元素

添加自定义元素,打印自定义元素,去除重复元素

import java.util.*;

public class HashSetTest{
	public static void main(String[] args){
		HashSet hs = new HashSet();
		
		hs.add(new Person("a1",11));
		hs.add(new Person("a2",12));
		hs.add(new Person("a2",12));
		hs.add(new Person("a3",13));
		hs.add(new Person("a4",14));
		
		Iterator it = hs.iterator();
		
		while(it.hasNext()){
			Person p = (Person)it.next();
			sop(p.getName()+"::"+p.getAge());
		}
	}
	
	public static void sop(Object obj){
		System.out.println(obj);
	}
}

class Person{
	private String name;
	private int age;
	Person(String name,int age){
		this.name = name;
		this.age = age;
	}
	public boolean equals(Object obj){
		
		if(!(obj instanceof Person))
			return false;
		Person p =(Person)obj;
		
		return this.name.equals(p.name)&&this.age == p.age;//这里的equals是字符串中的equals
	}
	public String getName(){
		return name;
	}
	public int getAge(){
		return age;
	}
}



这里发现,即使在Person类中复写了equals方法,还是出现了重复元素。这是因为对于HashSet,首先判断的是地址值,如果地址值都不一样,那么就不用调用equals方法。

现在要做的就是要在Person类中复写HashCode方法,建立自己的哈希值,根据判断条件建立(这里是根据姓名与年龄),因为每个字符串都有自己的哈希值,所以:

import java.util.*;

public class HashSetTest{
	public static void main(String[] args){
		HashSet hs = new HashSet();
		
		hs.add(new Person("a1",11));
		hs.add(new Person("a2",12));
		hs.add(new Person("a2",12));
		hs.add(new Person("a3",13));
		hs.add(new Person("a4",14));
		
		Iterator it = hs.iterator();
		
		while(it.hasNext()){
			Person p = (Person)it.next();
			sop(p.getName()+"::"+p.getAge());
		}
	}
	
	public static void sop(Object obj){
		System.out.println(obj);
	}
}

class Person{
	private String name;
	private int age;
	Person(String name,int age){
		this.name = name;
		this.age = age;
	}
	public int hashCode(){
		return name.hashCode()+age;
	}
	public boolean equals(Object obj){
		
		if(!(obj instanceof Person))
			return false;
		Person p =(Person)obj;
		
		return this.name.equals(p.name)&&this.age == p.age;//这里的equals是字符串中的equals
	}
	public String getName(){
		return name;
	}
	public int getAge(){
		return age;
	}
}

事实上,因为相同字符串的哈希值也一样,所以实际上,本代码中第二次添加“a2”,12的时候,程序先比较了哈希值,发现哈希值相同,接着调用了被复写的equals方法,发现还是相同,才没有被写入到集合中去
结论:HashSet是如何保证元素的唯一性的呢?是通过元素的两个方法:hashCode和equals来完成。如果元素的HashCode值相同,才会判断equals是否为true。如果元素的hashCode值不同,才会调用equals()。

--------------------------------------------------------------------

HashCode判断和删除

对于判断元素是否存在,以及删除等操作,以来的方法是元素的hashcode和equals方法,先判断前者



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值