java基金会成立Set

1、设置

当向集合Set中添加对象时。首先集合计算要添加对象的hashcode,依据该值得到一个位置用来存放当前的对象,当在该位置没有一个对象存在的时候,集合set觉得该对象在集合中不存在,直接添加进去。假设在该位置有一个对象存在。接着将准备添加到集合中的的对象与该位置上的对象进行equals比較。若返回false,在进行一次散列。将该对象放到散列后计算出的新地址。若返回true,不会再将该对象添加到集合中

 

2、当重写equals方法时,必需要重写hashcode方法

假设一个类的两个对象。使用equals方法比較时。结果为true,那么这两个对象必须具有同样的hashcode


3、请參考下面代码执行。查看输出结果来理解以上说法

test1和test2比較的是String,因为String重写了equals方法和hashcode方法。所以,String = “abc"。和 string = new String("abc")比較equals方法时候是返回true,因此test1和test2输出结果一致。Person类没有重写equals方法。而Person1重写了,所以test3和test4输出结果不一致。

/**
 * author Ding Chengyun
 * 2014-2-23
 */
package test;

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

/**
 * @author Ding Chengyun
 * 2014-2-23
 */
public class SetTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		test4();
	}
	
	public static void test1() {
		Set<String> s1 = new HashSet<String>();
		s1.add("abc");
		s1.add("xyz");
		s1.add("abc");
		for (Iterator<String> iter = s1.iterator(); iter.hasNext();) {
			System.out.println(iter.next());
		}
//		输出:
//		abc
//		xyz
	}
	
	public static void test2() {
		Set<String> s1 = new HashSet<String>();
		s1.add(new String("abc"));
		s1.add(new String("xyz"));
		s1.add(new String("abc"));
		for (Iterator<String> iter = s1.iterator(); iter.hasNext();) {
			System.out.println(iter.next());
		}
		
//		输出:
//		abc
//		xyz

	}
	
	public static void test3() {
		Set<Person> s = new HashSet<Person>();
		s.add(new Person("zhangsan"));
		s.add(new Person("lisi"));
		s.add(new Person("zhangsan"));
		for (Iterator<Person> iter = s.iterator(); iter.hasNext();) {
			System.out.println(iter.next().getName());
		}
		
//		输出:
//		zhangsan
//		zhangsan
//		lisi

	}

	public static void test4() {
		Set<Person1> s = new HashSet<Person1>();
		s.add(new Person1("zhangsan"));
		s.add(new Person1("lisi"));
		s.add(new Person1("zhangsan"));
		for (Iterator<Person1> iter = s.iterator(); iter.hasNext();) {
			System.out.println(iter.next().getName());
		}
//		输出:
//		lisi
//		zhangsan
	}
}

class Person {
	String name;
	public Person(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
}

class Person1 {
	String name;
	public Person1(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj instanceof Person1) {
			Person1 p = (Person1)obj;
			if (this.name.equals(p.getName())) {
				return true;
			}
		}
		return false;
	}
	
	public int hashCode() {
		return name.hashCode();
	}
}


版权声明:本文博客原创文章。博客,未经同意,不得转载。

posted @ 2015-07-17 09:16  lcchuguo  阅读(310)  评论(0编辑  收藏  举报