java se中的==和=的联系与区别是怎样的

  

这篇文章给大家介绍java se中的==和=的联系与区别是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

写在前面:

==和=是我们面试中经常会碰到的问题。那么它们之间有什么联系和区别呢?今天我们就来聊聊吧!

典型问题

这里先抛出一些比较典型笔试问题:

 <代码> int x=10;
int y=10;str1=
字符串   新的字符串(“abc"); str2=
字符串   新的字符串(“abc"); str3=
字符串   “abc" str4=,
字符串   “abc"
system . out。println (x==y);//输出?
system . out。println (str1==str2);//输出?
System.out.println (str1.equals (str2));//输出?
system . out。println (str3==str4);//输出?
system . out。println (str1==str3);//输出?
System.out.println (str1.equals (str3));//输出?

整数f1=100=100 f2、f3=150, f4=150;
system . out。println (f1==f2);//输出?
system . out。println (f3==f4);//输出?


正文

我们通常就是说“==坝美磁卸狭礁霰淞恐涞牡闹凳欠裣嗟取1淞坑址治臼堇嘈捅淞亢鸵美嘈汀H绻腔臼堇嘈偷谋淞恐苯颖冉现刀美嘈鸵冉隙杂Φ囊玫哪诖娴氖椎刂贰6?方法通俗来说就是用来比较两个对象长得是否一样。判断两个对象的某些特征(内容)是否一样,实际上就是调用对象的=方法进行比较,那么我们来看看=方法吧!

=方法其实是属于对象类的方法,因为对象类是所有类的直接或间接父类,也就是说所有的类中的equals()方法都继承自对象类,而通过源码我们发现,对象类中=()方法底层实现其实就是是“==焙拧?/p>

 <代码>公共布尔=(对象obj) {
,,返回(这==obj);
}

那么,在所有没有重写=()方法的类中,调用=()方法其实和使用“==焙诺男Ч谎?也是比较的对象地址值,然而,Java提供的所有类中,绝大多数类都重写了=()方法,重写后的equals()方法一般都是比较两个对象的值,比如字符串类,日期类,基本数据类型的包装类等。可以看哈字符串类的源码:

 <代码>,,公共布尔
  var1=(对象){
,,,,如果(这==var1) {
,,,,,,返回true;
,,,,}   其他{
,,,,,,如果(var1 instanceof字符串){
,,,,,,,,字符串var2=(String) var1;
,,,,,,,int var3=this.value.length;
,,,,,,,,如果(var3==var2.value.length) {
,,,,,,,,,char [] var4=this.value;
,,,,,,,,,,char [] var5=var2.value;
,,,,,,,,,for (int var6=0;var3——!=0;+ + var6) {
,,,,,,,,,,,,如果(var4 [var6] !=var5 [var6]) {
,,,,,,,,,,,,,,返回false。
,,,,,,,,,,,}
大敌;,,,,,,,,}
大敌;,,,,,,,,,返回true;
,,,,,,,}
大敌;,,,,}
大敌;,,,,,返回false。
,,,}
大敌;代码,}

解决

看了上面的描述,相信你可以做对或者回答起大多数这类的问题。但是还需要注意以下两点:

 <代码>字符串str3=癮bc" str4=, 
字符串   “abc"
system . out。println (str3==str4);//输出真正的
<李>

这里为什么会是真的呢?按理说str3和str4是两个对象,“==氨冉系氖堑刂?应该会是假的才对。如果你是这么想的,那你就不是很了解字符串类.String类,我们都知道它是不可变的字符序列,存储在常量池中,所以当你声明了一个str3=癮bc"时,就会在常量池中开辟一个内存空间来存放“abc”,下次再声明时,就会在常量池中去找,有,就直接把当前地址赋给变量,没有,就再创建,因此,此处的str3和str4是指向的同一个内存地址。

 <代码>整数f1=100=100 f2、f3=150, f4=150; 
system . out。println (f1==f2);//输出真正的
system . out。println (f3==f4);//输出假
<李>

看到上面的答案是不是感到十分的诧异。其实这里隐藏着一个知识点。就是包装类的缓存问题。下面简单描述一下:整型,字符类型所对应的包装类,在自动装箱时,对于-128 ~ 127年之间的值会进行缓存处理。当然其目的就是提高效率。缓存处理的原理为:如果数据在-128 ~ 127这个区间,那么在类加载时就已经为该区间的每个数值创建了对象,并将这256个对象存放到一个名为缓存的数组中。每当自动装箱过程发生时(或者手动调用返回对象的值()时),就会先判断数据是否在该区间,如果在则直接获取数组中对应的包装类对象的引用,如果不在该区间,则会通过新调用包装类的构造方法来创建对象。此处以整数类为例,源码参考:公共静态整数返回对象的值(int i){如果(我在=IntegerCache。低,,我& lt;=IntegerCache.high)返回IntegerCache。缓存(i + (-IntegerCache.low));返回新的整数(i);//超过范围就是新的的整数对象}这段代码中我们需要解释下面几个问题:1。IntegerCache类为整数类的一个静态内部类,仅供整数类使用,作用就是初始化数组缓存的,这个过程会在类加载时完成。感兴趣可以去看哈源码,这里就不再粘贴了。2。一般情况下IntegerCache.low为-128年,IntegerCache.high为127年,IntegerCache。缓存为内部类的一个静态属性。

java se中的==和=的联系与区别是怎样的