Java set接口

 

set接口(存放无序,不重复的元素

(1)HashSet集合:采用哈希表结构存储数据,保证元素唯一性的方式依赖于:hashCode()与equals()方法
在给哈希表中存放对象时,会调用对象的hashCode方法,算出对象在表中的存放位置,这里需要注意,
如果两个对象hashCode方法算出结果一样,这样现象称为哈希冲突,这时会调用对象的equals方法,
比较这两个对象是不是同一个对象,如果equals方法返回的是true,那么就不会把第二个对象存放在哈希表中,
如果返回的是false,就会把这个值存放在哈希表中;
(2)HashSet集合存储API类时:已经重写了hashCode方法和equals方法,如String类、Integer类等;
HashSet集合存储自定义类时:需要重写hashCode方法和equals方法,来确保HashSet集合中的对象唯一;

	public static void main(String[] args) {
		HashSet<String> set = new HashSet<String>();
		Object obj = new Object();
		System.out.println(obj.hashCode());
		set.add("111");
		set.add("222");
		set.add("333");
		set.add("333");
		for (String s : set) {
			System.out.println(s);//哈希值
			System.out.println(s.hashCode());//是String重写后的值
		}
		
	}

  

 

自定义类元素

package day09;

public class Person {
	private String name;
	private Integer age;
//	构造方法
	public  Person(String name,Integer age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	public int hashCode() {
		return name.hashCode()+age;
	}//重写 hashCode方法

	public boolean equals(Object obj) {
		if(obj ==null) {
			return false;
		}
		if(obj ==this) {
			return true;
		}
		if(obj instanceof Person) {
			Person p =(Person)obj;
			return p.name.equals(this.name)&&p.age.equals(this.age);
		}
		return false;
	}
	
	
}

  重写前重写后

LinkedHashSet:
LinkedHashSet集合保证元素的存入和取出的顺序;

public static void main(String[] args) {
//		不能存重复元素,但可以有序遍历
		LinkedHashSet<String>set =  new LinkedHashSet<String>();
		set.add("c");
		set.add("b");
		set.add("z");
		set.add("z");
		for(String s:set) {
			System.out.println(s);
		}
	}

  

LinkedHashSet是HashSet的子类

 

posted @ 2018-10-24 13:45  元气满满01  阅读(200)  评论(0编辑  收藏  举报