Set的主要实现类 HashSet的特点及实现

/*
* Set接口:存储无序的,不可重复的元素
* 1.无序性: 无序性不等于随机性。真正的无序性,指的是元素在底层存储的位置是无序的.
* 2.不可重复性:当向set中添加进相同的元素时,后面的这个不能添加进去。
*
* 说明:要求添加进Set中的元素所在的类,一定要重写equals()和hasCode()方法。
* 进而保证Set中的元素的不可重复性。
*
* Set中的元素是如何存储的呢?使用哈希算法.
* 当向Set中添加对象时,首先调用此对象所在类的hasCode()方法,计算此对象的哈希值,此哈希值、
* 决定了此对象在Set中的存储位置。若此位置之前没有对象存储,则这个对象直接存储到此位置。若此位置已有
* 对象存储,再通过equals()方法比较这两个对象是否相同。如果相同,后一个对象就不能再添加进来。
* 万一返回false呢,都存储(不建议)
* >要求:hasCode()与equals()方法一致。

@Test
	public void testHashSet() {
		Set set =new HashSet();
		set.add(123);
		set.add(456);
		set.add("AA");
		set.add("AA");
		set.add("BB");
		set.add(null);
		Person p1 =new Person("GG",23);
		Person p2 =new Person("MM",22);
		Person p3 =new Person("GG",23);//当Person没有重写equals方法和hashCode可以添加成功
		set.add(p1);
		set.add(p2);
		set.add(p3);
		System.out.println(set.size());
		System.out.println(set);
	}
	@Test
	/*
	 * LinkedHashSet:使用链表维护了一个添加进集合中的顺序.导致当我们遍历LinkedHashSet集合元素,
	 * 是按照添加进去的顺序遍历的。
	 */
	public void testLinkedHashSet() {
		Set set =new LinkedHashSet();
		set.add(123);
		set.add(456);
		set.add("AA");
		set.add("AA");
		set.add("BB");
		set.add(null);
		System.out.println(set);
		Iterator itetator = set.iterator();
		while(itetator.hasNext()) {
			System.out.println(itetator.next());
			
		}
		
	}

}

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;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	public Person() {
		super();
	}
	@Override
	public int hashCode() {// age.hashCode() + name.hashCode() 没有下述的健壮性好
		final int prime = 31;
		int result = 1;
		result = prime * result + ((age == null) ? 0 : age.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age == null) {
			if (other.age != null)
				return false;
		} else if (!age.equals(other.age))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值