2021-07-14

java基础面试题 (二)

1、常见java面试题之== 和 equals 的区别是什么?
在代码中,我们经常会比较两个数值,或者两个对象是否相等,这时候我们一般都会用到 == 或者 equals ,那这两个的用法有什么区别呢
首先 先说第一个区别 ,针对的类型 : == 可以用于比较任何类型,包括基本类型和引用类型,当然也可以用来比较枚举类 ,而equals比较针对的是引用类型

通过这个例子可能理解更加深刻,声明两个字符串常量 x 和 y ,在创建一个新的字符串对象,在我们的常量吃中,直接声明的字符串会放到常量池中,而常量池是在我们的方法区中,所以x 和 y 指向的是同一个引用,所以 == 也是 true,x 和 y 指向的是同一个引用,所以 equals 也是 true,
String x = “string”;
String y = “string”;
String z = new String(“string”);
System.out.println(xy); // true
System.out.println(xz); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true
然而而 new String()方法则重写开辟了内存空间,存储的实际位置是在堆内存中,在栈中存储的是引用地址,指向堆内存,而== 比较的是引用,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。

equals方法:
Car c1 = new Cat(“长安”);
Car c2 = new Cat(“长安”);
System.out.println(c1.equals(c2)); // false
因为car中没有重写object中的equals方法;所以为false,若重写则为true

再看一个例子:
String str1 = new String(“李四”);
String str2 = new String(“李四”);
System.out.println(str1.equals(str2)); // true
string中默认重写了 equals 方法;
总结 :== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

2、两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?

不对, 两个对象的 hashCode() 相同,equals() 不一定 true。

我们简单来了解一下hashcode的计算过程

public static void main(String[] args) {

//字符串对象的哈希码根据以下公式计算 s[0]31^(n-1) + s[1]31^(n-2) + … + s[n-1]
//使用 int 算法,这里 s[i] 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。空字符串的哈希值为 0。
//s[i]对应的字符可以理解成将字符(char类型)转成数字类型;
String s1 = “ba”;
String s2 = “ic”;
// 98
31^(2-1) + 97 * 31^0 = 3135;
// 105
31^(2-1) + 99 * 31^0 = 3354;
char n = ‘你’;
int temp_int = Character.valueOf(n);
System.err.println(temp_int);
int i = s1.hashCode();
int j = s2.hashCode();
System.out.println(i + “-----” + j);
//使用Integer.valueOf就可以直接将char类型的数据转为十进制数据表现形式.
System.out.println(Integer.valueOf(‘b’));
System.out.println(Integer.valueOf(‘a’));
System.out.println(Integer.valueOf(‘i’));
System.out.println(Integer.valueOf(‘c’));
}
输出:在这里插入图片描述

这里是Hash算法体现处,可以看到H是一个哈希值,每次是将上次一算出的hash值乘以31然后再加上当前字符编码值,由于这里使用的是int肯定会有一个上限,当字符长时产生的数值过大int放不下时会进行截取,一旦截取HashCode的正确性就无法保证了,所以这点可以推断出HashCode存在不相同字符拥有相同HashCode

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值