本文介绍了javaSE中==和equals之间的联系和区别,内容非常详细。感兴趣的朋友可以参考一下,希望对你有所帮助。
写在前面:
==和equals是我们面试中常见的问题。那么它们之间有什么联系和区别呢?今天就来聊聊吧!
典型问题
以下是一些典型的书面问题:
int x=
10;
int y=
10;
字符串str1=
新字符串(' ABC ');
字符串str2=
新字符串(' ABC ');
字符串str3=
ABC ';
字符串str4=
ABC ';
system . out . println(x==y);
//输出?
system . out . println(str 1==str 2);//输出?
system . out . println(str 1 . equals(str 2));//输出?
system . out . println(str 3==str 4);//输出?
system . out . println(str 1==str 3);//输出?
system . out . println(str 1 . equals(str 3));//输出?
整数f1=100,f2=100,f3=150,f4=150
system . out . println(f1==F2);//输出?
system . out . println(F3==F4);//输出?
主体
我们通常说“==”是用来判断两个变量之间的值是否相等。变量分为基本数据类型变量和引用类型。如果基本数据类型的变量直接比较值,而引用类型比较相应引用内存的第一个地址。一般来说,equals方法用于比较两个对象是否看起来相同。确定两个对象的某些特征(内容)是否相同。其实就是调用对象的equals方法进行比较。然后我们来看看equals方法!
equals方法实际上是一个属于Object类的方法。因为Object类是所有类的直接或间接父类,也就是说所有类中的equals()方法都是从Object类继承而来的,通过源代码我们发现Object类中equals()方法的底层实现实际上是'=='。
公共布尔等于(对象对象){ 0
return(this==obj);
}然后,在所有没有重写equals()方法的类中,调用equals()方法实际上和使用'=='符号是一样的,它也是要比较的对象的地址值。但是,在Java提供的所有类中,大多数类都重写了equals()方法,重写后的equals()方法一般会比较两个对象的值,比如String类、Date类等等。您可以看到字符串类的源代码:
公共布尔值
等于(对象变量1){ 0
if(this==var1){ 0
返回真;
}
else {
if(字符串的变量1实例){ 0
String var2=(String)var1;
int var3=
this . value . length;
if(var3==var2 . value . length){ 0
char[] var4=
这个值;
char[]var5=var2 . value;
(=NationalBureauofStandards)国家标准局
p;for(int var6 =
0; var3-- !=
0; ++var6) {
if (var4[var6] != var5[var6]) {
return false;
}
}
return true;
}
}
return false;
}
}
解决
看了上面的描述,相信你可以做对或者回答起大多数这类的问题。但是还需要注意以下两点:
String str3 =
"abc";
String str4 =
"abc";
System.out.println(str3 == str4);
// 输出true
-
这里为什么会是true呢?按理说str3和str4是两个对象,"=="比较的是地址,应该会是false才对。如果你是这么想的,那你就不是很了解String类。String类,我们都知道它是不可变的字符序列,存储在常量池中,所以当你声明了一个str3=“abc"时,就会在常量池中开辟一个内存空间来存放"abc”,下次再声明时,就会在常量池中去找,有,就直接把当前地址赋给变量,没有,就再创建。因此,此处的str3和str4是指向的同一个内存地址。
Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
System.out.println(f1 == f2);// 输出true
System.out.println(f3 == f4);// 输出false
-
看到上面的答案是不是感到十分的诧异。其实这里隐藏着一个知识点。就是包装类的缓存问题。下面简单描述一下:整型、char类型所对应的包装类,在自动装箱时,对于-128~127之间的值会进行缓存处理。当然其目的就是提高效率。缓存处理的原理为:如果数据在-128~127这个区间,那么在类加载时就已经为该区间的每个数值创建了对象,并将这256个对象存放到一个名为cache的数组中。每当自动装箱过程发生时(或者手动调用valueOf()时),就会先判断数据是否在该区间,如果在则直接获取数组中对应的包装类对象的引用,如果不在该区间,则会通过new调用包装类的构造方法来创建对象。此处以Integer类为例,源码参考:public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); // 超过范围就是new的Integer对象 } 这段代码中我们需要解释下面几个问题:1. IntegerCache类为Integer类的一个静态内部类,仅供Integer类使用,作用就是初始化数组cache的,这个过程会在类加载时完成。感兴趣可以去看哈源码,这里就不再粘贴了。 2. 一般情况下 IntegerCache.low为-128,IntegerCache.high为127,IntegerCache.cache为内部类的一个静态属性。
看到这,相信你对上面抛出的问题,已经可以迎刃而解。答案参考:
int x =
10;
int y =
10;
String str1 = new String("abc");
String str2 = new String("abc");
String str3 =
"abc";
String str4 =
"abc";
System.out.println(x == y);
// 输出true
System.out.println(str1 == str2);
// 输出false
System.out.println(str1.equals(str2));
// 输出true
System.out.println(str3 == str4);
// 输出true
System.out.println(str1 == str3);
// 输出false
System.out.println(str1.equals(str3));
// 输出true
Integer f1 =
100, f2 =
100, f3 =
150, f4 =
150;
System.out.println(f1 == f2);// 输出true
System.out.println(f3 == f4);// 输出false
关于javaSE中的==和equals的联系与区别是怎样的就分享到这里了,希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/131715.html