面试题2021.11.29----java基础

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)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值