ArrayList与HashSet比较及HashCode分析

 

ArrayList与HashSet比较             

              ArrayList是一种有顺序的集合

          HashSet通过比较两个对象是否相等,相同则不加入HashSet集合,不允许重复。如何比较? HashSet集合对象中必须重写equals()方法和hashCode()方法         

 

HashCode分析

             目的提高hash集合中查找元素的效率,这种方法将集合分成若干个存储区域,每个对象可以计算出一个哈希码。将哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储在哪个区域。

           HashSet就是采用哈希算法存取对象的集合,内部采用对某个数字n取余的方式对哈希码进行分组和划分对象的存储区域。

           Object类中定义了一个hashCode()方法来返回每个Java对象的哈希码,当从HashSet集合中查找某个对象时,Java系统首先调用对象的hashCode()方法来获取该对象的哈希码,然后根据哈希码找到相应的存储区域,最后

           取出该存储区域的每个元素与该对象进行equals()方法比较。这样就不用遍历集合中的所有元素就可以得到结论。

           HashSet集合具有很好的对象检索性能,但是HashSet集合存储对象的效率要低。

public static void main(String[] args) {
		// TODO Auto-generated method stub
		Collection collections = new HashSet();

		ReflectTest2 r1 = new ReflectTest2(3, 3);
		ReflectTest2 r2 = new ReflectTest2(5, 5);
		ReflectTest2 r3 = new ReflectTest2(3, 3);

		collections.add(r1);
		collections.add(r2);
		collections.add(r3);
		collections.add(r1);
		// !!!如果对象已经存储到了hashSet集合中,就不要再修改对象参与hashCode计算的属性的值
		// 如果改掉r1属性y的值,hashSet函数将执行不了该对象方法
         	r1.y = 2;
		collections.remove(r1);

		// 如果让r1,r3属于同一个对象,必须在ReflectTest2中重写equals()方法和hashcode()方法
		// hashcode()方法使r1,r3的哈希码也相等
		// 如不是hashSet集合。根本没必要
		// 在ReflectTest2类中重写equals()方法和hashCode()方法后结果为2.否则是3
        	System.out.println(collections.size());
	}
public class ReflectTest2 {
	private int x;
	public int y;
//重写equals()和hashcode()方法
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + x;
		result = prime * result + y;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		ReflectTest2 other = (ReflectTest2) obj;
		if (x != other.x)
			return false;
		if (y != other.y)
			return false;
		return true;
	}

}

PS:如果对象已经存储到了hashSet集合中,就不要再修改该对象参与hashCode计算的属性的值。改变后该对象将产生一个新的哈希码,例子中的collections.remove(r1);语句将不能执行成功,造成内存泄露!!!!
 


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值