一、代码描述
1、HashCodeReflectTest.java
package staticimport.reflect;
import java.util.Collection;
import java.util.HashSet;
public class HashCodeReflectTest {
public static void main(String[] args) {
// Collection<ReflectPoint> reflectPoints = new ArrayList<>();
Collection<ReflectPoint> reflectPoints = new HashSet<>();
ReflectPoint reflectPoint = new ReflectPoint(3, 3);
ReflectPoint reflectPoint2 = new ReflectPoint(5, 6);
ReflectPoint reflectPoint3 = new ReflectPoint(3, 3);
//测试hashCode作用
reflectPoints.add(reflectPoint);
reflectPoints.add(reflectPoint2);
reflectPoints.add(reflectPoint3);
reflectPoints.add(reflectPoint);
//测试内存泄漏
reflectPoint.y = 12;
reflectPoints.remove(reflectPoint);
System.out.println(reflectPoints.size());
}
}
2、ReflectPoint.java
package staticimport.reflect;
public class ReflectPoint {
private int x;
public int y;
private String type = "bball";
private String edu = "itcast";
private String pe = "basketball";
public ReflectPoint(){}
public ReflectPoint(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "ReflectPoint [x=" + x + ", y=" + y + ", type=" + type + ", edu=" + edu + ", pe=" + pe + "]";
}
/****************************测试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;
ReflectPoint other = (ReflectPoint) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
}
二、重要说明
1、截图说明
图1
图2
图3
2、关键说明
① hashCode的作用?
对象存入HashSet等集合中时,需要用到hashCode进行哈希算法将对象映射存储到HashSet的不同区域(哈希取余),以便提高HashSet检索某个对象时的搜索效率。
② java中是否存在内存泄漏?为什么?
存在。比如HashSet集合修改与hashCode相关的字段时,导致与初始hashCode值不一样,会造成内存泄漏。
3、关键字
集合、hashCode、内存泄漏
三、关键点
1、hashCode与执行哈希算法的相关集合联系时才有意义。
2、对象存储至HashSet中时,必须覆盖Object的hashCode()方法才会将两个内容相等的实例对象才会只存储一个。
3、对象存储至HashSet是经过哈希算法,取余算法,映射存储到不同的区域中,以便通过哈希值提高检索效率。
4、未覆盖Object类的hashCode()方法java系统默认通过内存地址进行计算。
5、实例对象的内容有可能不相同而哈希值有可能相等。