.equals的问题
发布网友
发布时间:2022-04-26 10:13
我来回答
共2个回答
热心网友
时间:2022-06-27 05:48
==测试的是两个引用是否指向同一个对象.
a指向的对象在堆中,"abc"在字符串常量池中,所以用==返回false
要想测试两个字符串是否相等要用equals方法
jvm运行的时候,将内存分为两个部分,一部分是堆,一部分是栈,椎中存放的
的是创建的对象,栈中存放的是方法调用过程中的变量或引用.
你后边的例子就要关系到字符串常量池了
(java字符串对象内存实现的时候
,在堆中又开辟了一块很小的内存,称之为字符串常量池,专门用来存放特定的对象)
用s[1][3]="abc";这种方法创建字符串对象就会去字符串常量池中找看有没有和"abc"相同的字符串对象,有就让引用指向它,如果没有就会在字符串常量池中创建一个字符串对象,然后引用指向创建的对象.
s[1][3]指向的是字符串常量池中的对象.而()中的"abc"返回的是字符串常量池中和s[1][3]指向的同一个对象的引用
所以你后边的例子指向的是同一个对象,所以返回true;
如果用new创建字符串对象,和上边的方式是不一样的.
new创建对象会先在堆中(不是字符串常量池)中创建一个字符串对象,并将引用指向该对象,然后去字符串常量池中看是是否有和该对象相同的对象,若有就将new创建的对象和字符串常量池中的对象联系起来,若没有就在字符串常量池中创建一个对象,并将该对象和new创建的对象联联系起来.
如
String a="abc";
String b="abc";
String c=new("abc");
a==b 为true;
a==c 为false;
热心网友
时间:2022-06-27 05:49
通常情况下==和equals都是比较两个对象是否存储在同一位置(是否有相同的地址),但是String类重写了Object类的equals方法。String的equals方法是比较2个String的hashcode是否相同,String的hashcode是基于内容的,所以就是如果2个String的内容一样,equals就是true。
除非是str1=str2;这种赋值,否则==就是false
只有new运算符才会在堆上开辟内存。这个题sca是在堆上的,a是在栈上的