Java面试题及答案汇总(一)

 新闻资讯     |      2019-07-29 15:52

代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new string方法则重写开辟了内存空间,所以 == 结果为 false,而 k8真人下载equals 比较的一直是值,所以结果都为 true。

equals 解读

equals 本质上就是 ==,只不过 string 和 integer 等重写了 equals 方法,把它变成了值比较。看下面的代码就明白了。

首先来看默认情况下 equals 比较一个有相同值的对象,代码如下:

 1 class cat {
 2 public cat {
 3 this.name = name;
 6 private string name;
 8 public string getname {
 9 return name;
12 public void setname {
13 this.name = name;
17 cat c1 = new cat;
18 cat c2 = new cat;
19 system.out.println); // false

输出结果出乎我们的意料,竟然是 false?这是怎么回事,看了 equals 源码就知道了,源码如下:

1 public boolean equals {
2 return ;
3 }

原来 equals 本质上就是 ==。

那问题来了,两个相同值的 string 对象,为什么返回的是 true?代码如下:

1 string s1 = new string;
2 string s2 = new string;
3 system.out.println); // true

同样的,当我们进入 string 的 equals 方法,找到了答案,代码如下:

 1 public boolean equals {
 2 if  {
 3 return true;
 5 if  {
 6 string anotherstring = anobject;
 7 int n = value.length;
 8 if  {
 9 char v1[] = value;
10 char v2[] = anotherstring.value;
11 int i = 0;
12 while  {
13 if 
14 return false;
15 i++;
17 return true;
20 return false;
21 }

原来是 string 重写了 object 的 equals 方法,把引用比较改成了值比较。

总结 :== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 string、integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

不对,两个对象的 hashcode相同,equals不一定 true。

代码示例:

1 string str1 = "通话";
2 string str2 = "重地";
3 system.out.println,str2.hashcode));
4 system.out.println);

执行的结果:

str1:1179395 | str2:1179395
false

代码解读:很显然 通话 和 重地 的 hashcode 相同,然而 equals 则为 false,因为在散列表中,hashcode相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。