java比较两字符串是不是相等。。。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java比较两字符串是不是相等。。。相关的知识,希望对你有一定的参考价值。

代码如下,我不明白为什么 一个输出true,一个输出false。

String string1 = "i love you";
String string2 = "i love you";
//输出 true
System.out.println(string1 == string2);

String string3 = new String("i love you");
String string4 = new String("i love you");
//输出 false
System.out.println(string3 == string4);

以下是我的思考过程,麻烦看看我哪里考虑错了。

string1,string2,string3,string4 都应该是引用类型吧,既然是引用类型,双等号的意思就是判断两者的内存地址是否一样。 那么,同样是String类型,为什么 string1 和string2 的内存地址就一样,而string3,string4 的内存地址就不一样呢?

String string1 = "i love you";

String string2 = "i love you";

在栈中分配两个空间,

其名为string1和string2 

其值为两个相同的同时指向"i love you"的地址,"i love you"存放在data segment中只有一个。

String string3 = new String("i love you");

String string4 = new String("i love you");

在栈中分配两个空间,

其名为string3和string4

string3指向堆中为new String("i love you");(对象一)

新分配的空间,其值为指向这里的地址

string4指向堆中为new String("i love you")(对象二)

分配的空间;这是另一片空间,其值为指向这里的地址。

参考技术A 1、字符串是常量;它们的值在创建之后不能更改。
2、String string1 = "i love you";
String string2 = "i love you"
当创建第一个String 变量时,会分配一个区域存储“i love you”,创建第二个 string 变量时他会先查看是否有和之前创建完全相同的string数据,如果有他会指向同一个区域。∴ true

String string3 = new String("i love you");
String string4 = new String("i love you");
这里要注意new 这个关键字,只要理解了他,答案就出来了。
new关键字的作用就是在你声明了一个对象后,给对象分配相应内存

这里的string3和string4是两个不同的对象,他们吸是内容相同,但是他们的哈希值不同,∴ false

"=="不但要内容相同,还要他们的哈希值相同。
参考技术B String str = "i love you"这种形式,虚拟机会在一个池里面找是否有"i love you",找不到就创建一个放在那里,然后给str
第二次str1 = "i love you",同样会在一个池里找,结果找到了,给str1,所以str和str1相等

String s1 = new String("i love you")
String s2 = new String("i love you")
s1和s2所得的"i love you"都是一样的,但是s1和s2的地址不相同,我的意思是,只要使用new来创建的对象,就一定是一个新的地址,只不过s1和s2的内容都是"i love you",但是他们都是使用new来创建的,所以地址就不一样。你可以想象一下,s1和s2在内存里是两个同的地址,而他们引用的内容都是虚拟机里的一个池的"i love you"字符串,但是比较的时候是比较s1和s2的地址,不是他们的内容
参考技术C String string1 = "i love you";
String string2 = "i love you";
"="将一个字符串对象指定给一个引用名称,其意义就是为改变名称所引用的对象。在JAva 执行时,会维护String池。对一些可以共享的字符串对象会先在String池中查找是否存在相同的String内容,如果有旧直接返回,而不是直接创造一个新对象。如上面声明的,实际是指向同一个字符串对象。

在java中如果==被使用于两个引用名称时,它是用于比较两个引用名称是否同一对象,所以上面比较时会显示True结果。

String string3 = new String("i love you");
String string4 = new String("i love you");
虽然两个字符串对象的字符值完全相同,但实际上在这个程序片段中,产生了两个String的实例,Srt3与Str4分别引用于不同的实例。所以使用==比较时会显示false。
所以如果比较两个字符串对象的字符值是否相同,要使用equals()放法比较,结果显示true。

小的不才只知道这些,欢饮有更好的放法解读
参考技术D 1创建了一个 "i love you"的字符串,然后指向该字符串的内存地址。
2遍历常量池,找到了已经存在的字符串,然后指向同一个内存地址。
new String表示一定会创建新的字符串,所以3和4创建了2个新的字符串,并分别指向它们。
因为String的值其实是一个指针,1和2指向同一个地址的指针。3和4指向的指针不同。
如果想要比较值,应该用equals()

java中string能比较大小吗

字符串的比较用string.compareTo(str);不过不是单纯的类似数字的比较大小。具体可以看源码。

这个方法是作用:
1.从两个字符串最开始位置匹配到两个字符串较短的最后,即从0到Math.min(len1, len2),然后获取每个位置的字符char1和char2,如果char1和char2不想等,返回char1-char2
2.如果0到Math.min(len1, len2)的位置的字符都相等,返回两字符串长度的差,即length1-length2
具体来说
"a".compareTo("c")、"abc".compareTo("c")都返回-2。上述情况1
"abc".compareTo("abcdefg")返回-4。上述情况2
参考技术A 比较字符的大小。

以上是关于java比较两字符串是不是相等。。。的主要内容,如果未能解决你的问题,请参考以下文章

Java中怎么比较两个字符串是不是相等?

判断字符是不是相等?

JAVA比较两个字符串是不是相等用啥

为啥JAVA不可以用“==”来比较两个字符串是不是相等?

Java中比较字符串的内容是不是相等内部是如何比较的?还有比较字符串与比较它的哈希值哪个快?

java中如何比较两个数组确定是不是相等?