当前位置: 首页 > 工具软件 > ABC > 使用案例 >

String s=“abc“ 和 String s1=new String(“abc“)和String s2=new String(“abc“)之间的关系

尹欣怿
2023-12-01

这篇文章针对困扰新手初学java基础时常遇到的难以理解的一个问题!!!

==∶它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)。


equals():它的作用也是判断两个对象是否相等。但它一般有两种使用情况:


·情况1:类没有覆盖equals()方法。则通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象。


·情况2:类覆盖了equals()方法。一般,我们都覆盖equals()方法来比较两个对象的内容是否相等;若它们的内容相等,则返回true(即,认为这两个对象相等)。
 

初学java时常常会碰到String s ="abc"和String s1= "abc",String s="abc" 和 String s1=new String("abc"),String s1=new String("abc")和String s2=new String("abc"),然后就让我们比较他们其中的关系,比如s==s1是true or false、s1==s2是true or false、s1.equals(s2)等,这些个问题常常会让刚接触java的同学们一头雾水,我深有感触呀!

那么,接下来,就让我用简单通俗的话来解释这个问题

考察的是引用和内存,建议可以先简单了解一下java虚拟机,了解他的内存结构划分,便于理解。

String s=”abc”

s是栈内变量,也是引用变量,它的内存保存的是常量池的常量字符串对象对象”abc”的内存地址,但是常量池中的每个值只有一份地址

简单解释就是:jvm为了减少内存消耗,把这些相同的常量都放在常量池里面,并且不让他们重复,也就是常量池中只有一个“abc”字符串常量,只有一个指向为“abc”的内存地址,需要用他的时候只要调用他的引用地址指向他即可,不需要new一个新的"abc"

所以当String s1 = “abc”时,s1内存保存的也是常量池的常量字符串对象对象”abc”的地址;

s和s1两个变量指向的是同一个地址,也可以说s和s1都是一个引用,引用的地址都是一样的,因此s==s1结果为true

String s2=new String(“abc”);


s2是栈内变量,也是引用变量,它的内存保存的是堆中的new String对象的地址,new String在堆中生成对象,并用常量池的字符串对象”abc”初始化堆中的对象,所以堆中的对象的内存的内容和常量池对象的内存的内容一样,但是他们的地址不一样,也就是内容一样的对象地址不一样,所以是不同的两个对象(就好比你认识三个人,他们就叫张三,每个人都是一个对象,虽然他们都叫张三(内容一样)但是他们不是一个对象啊,所以jvm要用不同的地址值来分辨他们)。so,s1==s2的结果显而易见为false。

因此s==s2的结果是false。==比较的是两对象的引用,s这个引用是引用了字符串常量的地址,而s2是引用new String(“abc”)这个变量的地址,显然结果为false.

s.equals(s2)的结果是true,因为String的equals方法比较的是对象的内容。
 

 类似资料: