javaSE中的==和equals的联系与区别是怎样的

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

本文介绍了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

(0)

相关推荐

  • 如何使用Python 代码格式化工具 Black-Python

    技术如何使用Python 代码格式化工具 Black-Python如何使用Python 代码格式化工具 Black-Python,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴

    攻略 2021年10月25日
  • Java世界常用的工具类库有哪些

    技术Java世界常用的工具类库有哪些小编给大家分享一下Java世界常用的工具类库有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Apach

    攻略 2021年12月9日
  • Spring Boot 分层打包 Docker 镜像实践及分析

    技术Spring Boot 分层打包 Docker 镜像实践及分析 Spring Boot 分层打包 Docker 镜像实践及分析Spring Boot 分层打包 Docker 镜像实践及分析
    1. 准

    礼包 2021年12月10日
  • mysql数据库常用命令的含义(mysql列出所有数据库的命令是什么)

    技术MySQL数据库的基本命令有哪些小编给大家分享一下MySQL数据库的基本命令有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、概述数

    攻略 2021年12月21日
  • XamarinAndroid组件中RecylerView适配器如何使用动画

    技术XamarinAndroid组件中RecylerView适配器如何使用动画这篇文章主要介绍XamarinAndroid组件中RecylerView适配器如何使用动画,文中介绍的非常详细,具有一定的参考价值,感兴趣的小

    攻略 2021年12月3日
  • 令字加偏旁,“令”加什么偏旁变成新字

    技术令字加偏旁,“令”加什么偏旁变成新字令字可以加令字加偏旁: 冫偏旁,组词新字是:冷。令字可以加: 山偏旁,组词新字是:岭。令字可以加: 王偏旁,组词新字是:玲。令字可以加:亻偏旁,组词新字是:伶。冷拼音:lěng

    生活 2021年10月28日