javaSE HashSet集合,元素不可以重复。 需要重写hashCode()和equals()方法

Collection(集合):容器,用于存放对象(引用类型。基本类型需要自动装箱)   查看
List(列表):元素有序,元素可以重复 (有索引)。 通过元素的equals()方法判断是否重复。  查看
Set(集):元素无序,不可重复 (没有索引)。 遍历只能用Iterator迭代器和增强for, 不能使用普通for遍历。 查看
ArrayList(数组列表): 查询快,增删慢。   查看
LinkedList(链表): 查询慢,增删快。查看
HashSet(哈希表): 查询快,增删慢。 (底层其实就是Map) 。 存放的引用类型需重写hashCode()和equals()方法。 
LinkedHashSet(哈希链表): 查询慢,增删快。 有序的,存放顺序和取出顺序一致。 查看


Demo.java:

package cn.xxx.demo;

import java.util.HashSet;

import cn.xxx.demo.Person;

/*
 *  HashSet集合的自身特点:
 *    底层数据结构,哈希表
 *    存储,取出都比较快
 *    线程不安全,运行速度快
 */
public class Demo {
	public static void main(String[] args) {
		/*HashSet<String> set = new HashSet<String>();
		set.add(new String("abc"));
	    set.add(new String("abc"));
		set.add(new String("bbc"));
		set.add(new String("bbc"));
		System.out.println(set);*/
		
		
		//将Person对象中的姓名,年龄,相同数据,看作同一个对象
		//判断对象是否重复,依赖对象自己的方法 hashCode,equals
		HashSet<Person> setPerson = new HashSet<Person>();
		setPerson.add(new Person("a",11));
		setPerson.add(new Person("b",10));
		setPerson.add(new Person("b",10));
		setPerson.add(new Person("c",25));
		setPerson.add(new Person("d",19));
		setPerson.add(new Person("e",17));
		System.out.println(setPerson);
	}
}
Person.java(存放的引用类型重写hashCode()和equals()方法):
package cn.xxx.demo;

public class Person {
	private String name;
	private int age;
	/*
	 * Person对象如果存放到HashSet集合中,必须重写hashCode()和equals()方法。
	 * HashSet集合存放对象,是根据对象的hashCode()值进行存放的。 两个对象的hashCode如果相同,然后判断是否equals,如果相同就是重复元素。HashSet集合不会存放重复元素
	 * hashCode()和equals()方法可以由Eclipse工具自动生成。
	 * 重写的原则:
	 *      equals()为true的两个对象的hashCode必须相同。  通过equals()方法判断集合中的元素是否重复。
	 *     hashCole()值相同的两个对象,equals()不一定为true。
	 *     
	 * 8种基本数据类型对应的引用类型(8种包装类)以及String类型,已经自动重写了hashCode()和equals()方法。
	 * 
	 */

	public int hashCode(){  // 重写hashCode()方法。
		return name.hashCode()+age*55;
	}

	public boolean equals(Object obj){  // 重写equals()方法。
		if(this == obj)
			return true;
		if(obj == null)
			return false;
		if(obj instanceof Person){
			Person p = (Person)obj;
			return name.equals(p.name) && age==p.age;
		}
		return false;
	}
	
	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 Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public Person(){}
	
	public String toString(){
		return name+".."+age;
	}
	
}


猜你喜欢

转载自blog.csdn.net/houyanhua1/article/details/80665181