ArrayList和HashSet对的比较及HasCode分析
2016-04-03 00:12
309 查看
实例代码:
ReflectPoint.java文件代码:
ReflectTest2.java文件代码:
运行结果:
从打印可以看出ArrayList在内存中存放时不考虑对象是否相同,但用HashSet就会考虑对象是否相同,当实现了hashCode(在ReflectPoint类中,当然重载了hashCode也要重载equals)方法时,那么不同对象相同的元素的值相同也只存储一次。从上面注释的两行代码可以看出,当用HashSet集合存储后不应该修改元素的值,要不然指向的对象就会丢失,就会造成内存泄露。
ReflectPoint.java文件代码:
package cn.yzx.day1; public class ReflectPoint { private int x; public int y; public String str1 = "ball"; public String str2 = "basketball"; public String str3 = "itcast"; public ReflectPoint(int x, int y) { super(); this.x = x; this.y = y; } @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; ReflectPoint other = (ReflectPoint) obj; if (x != other.x) return false; if (y != other.y) return false; return true; } @Override public String toString() { return str1 + ":" + str2 + ":" + str3; } }
ReflectTest2.java文件代码:
package cn.yzx.day1; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; public class ReflectTest2 { public static void main(String[] args) { // TODO Auto-generated method stub Collection collections = new ArrayList(); ReflectPoint pt1 = new ReflectPoint(3, 3); ReflectPoint pt2 = new ReflectPoint(5, 5); ReflectPoint pt3 = new ReflectPoint(3, 3); collections.add(pt1); collections.add(pt2); collections.add(pt3); collections.add(pt1); Collection collections1 = new HashSet(); collections1.add(pt1); collections1.add(pt2); collections1.add(pt3); collections1.add(pt1); //下面两行代码不注释结果为1,只是后结果为2 System.out.println(collections.size()); System.out.println(collections1.size()); //从打印可以看出ArrayList在内存中存放时不考虑对象是否相同, //但用HashSet就会考虑对象是否相同,当实现了hashCode(在ReflectPoint类中,当然重载了hashCode也要重载equals)方法时, //那么不同对象相同的元素的值相同也只存储一次。从上面注释的两行代码可以看出,当用HashSet集合存储后不应该修改元素的值,要不然指向的 //对象就会丢失,就会造成内存泄露 } }
运行结果:
从打印可以看出ArrayList在内存中存放时不考虑对象是否相同,但用HashSet就会考虑对象是否相同,当实现了hashCode(在ReflectPoint类中,当然重载了hashCode也要重载equals)方法时,那么不同对象相同的元素的值相同也只存储一次。从上面注释的两行代码可以看出,当用HashSet集合存储后不应该修改元素的值,要不然指向的对象就会丢失,就会造成内存泄露。
相关文章推荐
- 输出随机认证码图片
- 1012 最小公倍数LCM
- CTF——ASCII码而已
- 13.11编程练习
- 数组与Object的关系及其反射类型
- 数组的反射
- 1011 最大公约数GCD
- 1006 最长公共子序列Lcs
- 网络精灵系统
- BZOJ 4012 HNOI 2015 开店 动态点分治
- CTF——图片里的英语
- 【C++ Primer plus】【第八章】函数探幽
- java之命令行参数main(String [] args)
- hdoj 2024 C语言合法标识符
- 构造方法的反射应用
- 对接收数组参数的成员方法进行反射
- ScrollView中ListView显示不全解决方法
- [Unity] Shader(着色器)之固定管线
- 为用户设置批量登录到属性!
- 成员变量反射的综合案例