ArrayList_HashSet的比较:
ArrayList是有序集合,存放的元素允许重复,并且存放的是外面对象的引用。而HashSet存放的对象不能重复,且属于散列存放。
设计一个程序来详细说明,ArrayList和HashSet的区别:
public class ReflectPoint {
public int x;
public int y;
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ReflectPoint other = (ReflectPoint) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
}
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
public class ReflectTest {
public static void main(String[] args) {
//Collection collection=new ArrayList(); //ArrayList可以放入相同的对象的引用 打印----4
Collection collection=new HashSet(); //不能放入相同对象的引用 打印----3
ReflectPoint point1=new ReflectPoint(1, 1);
ReflectPoint point2=new ReflectPoint(1, 2);
ReflectPoint point3=new ReflectPoint(1, 1); //当reflectpoint中生成HashCode和equals,这个点将放不进去 打印---2
collection.add(point1);
collection.add(point2);
collection.add(point3);
collection.add(point1);
point1.y=4; //修改y后,下面的point1就删不掉,因为内存泄露。这样证明java中有内存泄露
collection.remove(point1);
System.out.println(collection.size());
}
}
hashcode把集合分为若干值域,把将要存入的数据转化为HashCode值后放入不同的区域,
当对象被存储进HashCode集合中以后,就不能修改这个对象中的那些参与计算哈希值得字段了,否则,对象修改后的哈希值与最近存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains 方法使用该对象当前的引用作为参数去HashSet集合检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存泄露。
HashCode的分析:
hashcode把集合分为若干值域,把将要存入的数据转化为HashCode值后放入不同的区域,
当对象被存储进HashCode集合中以后,就不能修改这个对象中的那些参与计算哈希值得字段了,否则,对象修改后的哈希值与最近存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains 方法使用该对象当前的引用作为参数去HashSet集合检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存泄露。
希望我的解答能对你有所帮助。 |