码迷,mamicode.com
首页 > 编程语言 > 详细

Java---27---Set集合及其子类HashSet

时间:2015-04-08 21:33:13      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:java   hashcode   equals   set   

Set中元素是无序的(存入和取出的顺序不一定一致),元素不可以重复。

 

Set中的方法和Collection中的方法是一样的。

常见子类:HashSet  TreeSet

HashSet 底层数据结构是哈希表

TreeSet 底层数据结构是二叉树


import java.util.HashSet;
import java.util.Iterator;
class Person{
	private String name;
	private int age;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	//set and get methods
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	
}
public class SetDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//method1();
		method2();
	}
	

	public static void method1() {
		HashSet hs = new HashSet();

		hs.add("01");
		hs.add("02");
		hs.add("03");
		hs.add("04");
		// 无序性
		sop(hs);

		hs.add("02");
		// 唯一性
		sop(hs);
		sop("是否添加进去:" + hs.add("02"));
	}
	/**
	 * 存入自定义对象,如果姓名和年龄相同视为同一个人,重复元素
	 */
	public static void method2 (){
		HashSet hs = new HashSet();
		
		hs.add(new Person("01",10));
		hs.add(new Person("02",11));
		hs.add(new Person("03",12));
		hs.add(new Person("04",13));
		/*打印
		Iterator it = hs.iterator();
		while (it.hasNext()){
			Person person = (Person)it.next();
			sop(person.getName()+"::"+person.getAge());
		}
		*/	
		//添加一个相同元素
		hs.add(new Person("01", 10));
		Iterator it = hs.iterator();
		while (it.hasNext()){
			Person person = (Person)it.next();
			sop(person.getName()+"::"+person.getAge());
		}
		//没解决啊。。。两个01::10
		
		
	}
	public static void sop(Object object) {
		System.out.println(object);
	}

}


我们要求 姓名和年龄相同视为是重复元素,按照Set的特性来说是不应该被保存的,结果却是存上了。。。

 

解决:覆盖元素的hashCode 方法,建立自己的哈希值,同时覆盖equals方法。

 

覆盖元素HashCode方法 是因为,在Set中存入元素,首先被判断的就是元素的哈希值,只有当元素的哈希值没有出现过的时候,才会将元素存入。

覆盖equals方法是因为,两个元素的哈希值相同,但是这两个元素不一定是相同的,因此来判断一下,并根据返回值来决定该元素最终能否被存入。



package ssssssss;
import java.util.HashSet;
import java.util.Iterator;
class Person {
	private String name;
	private int age;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		if (!(obj instanceof Person))
			return false;
		Person person = (Person) obj;
		//打印      表示此方法被调用
		System.out.println(this.name + "******equals*****" + person.name);
		
		return this.name.equals(person.name) && this.age == person.age;
	}
	//覆盖hashCode方法  建立Person自己的哈希值
	public int hashCode() {
		// TODO Auto-generated method stub
		System.out.println(this.name + "..........hashCode");
		return 13;
		//按照条件设定哈希值
		//return name.hashCode() + age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	
}
public class SetDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		method2();
	}
	/**
	 * 存入自定义对象,如果姓名和年龄相同视为同一个人,重复元素
	 */
	public static void method2 (){
		HashSet hs = new HashSet();
		
		hs.add(new Person("01",10));
		hs.add(new Person("02",11));
		hs.add(new Person("03",12));
		hs.add(new Person("04",13));
		/*打印
		Iterator it = hs.iterator();
		while (it.hasNext()){
			Person person = (Person)it.next();
			sop(person.getName()+"::"+person.getAge());
		}
		*/	
		//添加一个相同元素
		hs.add(new Person("01", 10));
		Iterator it = hs.iterator();
		while (it.hasNext()){
			Person person = (Person)it.next();
			sop(person.getName()+"::"+person.getAge());
		}
		//没解决啊。。。两个01::10
		//覆盖 hashcode方法,建立自己的哈希值
		
	}
	public static void sop(Object object) {
		System.out.println(object);
	}

}

打印结果:

01..........hashCode
02..........hashCode
02******equals*****01
03..........hashCode
03******equals*****01
03******equals*****02
04..........hashCode
04******equals*****01
04******equals*****02
04******equals*****03
01..........hashCode
01******equals*****01
01::10
02::11
03::12
04::13


返回一个相同的哈希值,通过打印结果我们不难猜出此程序的运行过程:

01先生成一个哈希值,因为此时就只有01一个元素,所以存入

02再生成一个相同的哈希值,然后跟01比较,不是同一元素,存入

03再生成相同的哈希值,然后跟01和02进行比较,确定没有相同元素,存入

04也是一样,跟01 02 03比较完后,存入

接着就是重复元素01了,比较发现跟第一次存入的01是相同的,

返回false,没有存入。

 

结论:

HashSet是如何保证元素唯一性的呢?

通过元素的两个方法:hashCode和equals

只有当元素的哈希值相等的时候才会判断equals方法

 

那如果生成不同的哈希值的话,就可以大大的减少程序的运行次数。


package ssssssss;
import java.util.HashSet;
import java.util.Iterator;
class Person {
	private String name;
	private int age;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		if (!(obj instanceof Person))
			return false;
		Person person = (Person) obj;
		//打印      表示此方法被调用
		System.out.println(this.name + "******equals*****" + person.name);
		
		return this.name.equals(person.name) && this.age == person.age;
	}
	//覆盖hashCode方法  建立Person自己的哈希值
	public int hashCode() {
		// TODO Auto-generated method stub
		System.out.println(this.name + "..........hashCode");
		//return 13;
		//按照条件设定哈希值
		return name.hashCode() + age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	
}
public class SetDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		method2();
	}
	/**
	 * 存入自定义对象,如果姓名和年龄相同视为同一个人,重复元素
	 */
	public static void method2 (){
		HashSet hs = new HashSet();
		
		hs.add(new Person("01",10));
		hs.add(new Person("02",11));
		hs.add(new Person("03",12));
		hs.add(new Person("04",13));
		/*打印
		Iterator it = hs.iterator();
		while (it.hasNext()){
			Person person = (Person)it.next();
			sop(person.getName()+"::"+person.getAge());
		}
		*/	
		//添加一个相同元素
		hs.add(new Person("01", 10));
		Iterator it = hs.iterator();
		while (it.hasNext()){
			Person person = (Person)it.next();
			sop(person.getName()+"::"+person.getAge());
		}
		//没解决啊。。。两个01::10
		//覆盖 hashcode方法,建立自己的哈希值
		
	}
	public static void sop(Object object) {
		System.out.println(object);
	}

}



Java---27---Set集合及其子类HashSet

标签:java   hashcode   equals   set   

原文地址:http://blog.csdn.net/u013476556/article/details/44947011

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!