2021.11.29----java基础
1.请你解释为什么会出现4.0-3.6=0.40000001这种现象?
答:这是因为二进制数没办法准确的表示十进制数的数,十进制的小数在转化为二进制是会有误差,导致该运算结果的诞生。
2.请你说说Lamda表达式的优缺点。
答:优点:简洁,便于书写,应用的越来越多,将会影响未来的编码形式。
缺点:效率没有传统的直接写函数或是for的效率高,而且代码的可读性降低。难以调试
3. 请你说明符号“==”比较的是什么?
答:分为两种情况,在对象对比时,他比较的是引用的地址,而比较的如果是基本数据类型,那他比较的就是基本数据类型的值。
4.请你解释Object若不重写hashCode()的话,hashCode()如何计算出来的?
答:hashcode的方法是本地方法,是由c++实现的该方法返回的是对象的内存地址。
public final native hashcode()
5.为什么重写equals()就一定要重写hashCode()方法?
答:首先HashMap,HashSet集合添加元素时要进行两次检查,检查hashcode是否相等再检查equals是否相等,两个都不相等才能添加这个元素,保证元素不重复。
我们再回到Object类说起,Objiecr类的equals()是对两个对象的内存地址进行判断,hashcode()也只是返回对象的内存地址。
我们创建两个不同的对象,让他们的值一样,因为它们两个的内存地址不同,所以HashMap()还是默认能添加这两个的。
但就数据意义来看,它们就是相同的。所以添加一个就行了。
Student s1 = new Student("lisi",12);
Student s2 = new Student("lisi",12);
这有时候原有的不能满足我们的要求,我们需要重写,使得equals()和hashcode()都判定这两个对象相同。
这就我们去重写。
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
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;
Student other = (Student) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
所以,不能只改动euqals(),也要改动hashcode来让两个都判定一致。
同时这样重写也能提高效率。
因为,hashcode()和equals()遵循以下规则:
如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同!!!
如果两个对象的hashCode不同,那么他们肯定不同(即用equals比较返回false)
所以,都重写后有时候只需要判断hashCode一次就可以了。
小补充:String对equals和hashcode的重写:
String中的equals
1.同一对象 (true)
2.同一类型&&长度相等&&值相等 ( true)