java String字符串的比较问题

2025-04-30 22:57:19
推荐回答(5个)
回答1:

1.需要引入字符串池的概念(String pool),但要创建字符串对象的时候,首先会搜索字符串池是否已经存在,如果存在则不创建。
2.==是比较对象的引用,也就是对应内存的地址是否一样。
3.这样的问题,在通常的开发中不会应用,但会出现在面试中。
4.s1和s2引用了同一个地址,所以是true。而s3是由三个字符串对象创建新的字符串,因此不是同一个对像,为false。
5.要对字符串的intern()进行了解及 The Java Language Specification
的3.10.5 String Literals。参考jdk api。package testPackage;
class Test {
public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");
System.out.print((other.Other.hello == hello) + " ");
System.out.print((hello == ("Hel"+"lo")) + " ");
System.out.print((hello == ("Hel"+lo)) + " ");
System.out.println(hello == ("Hel"+lo).intern());
}
}
class Other { static String hello = "Hello"; }

回答2:

与String池有关:java 虚拟机中本身含有了一些字符了。如果没有某字符串,才创建个字符串。这样一来就可以多个变量去引用某个字符串了。
s1 == s3 为false是因为s3 指向 a + b + c 变量的运算结果,未来节省空间。会创建1个StringBuffer 来存放数据。最后toString()返回字符串,是新分配的。

回答3:

s1 和 s2 是引用了栈内存中的"abc"字符串 所以是同一个对象
s3则是经过a b c三个对象的计算产生了新的对象在堆内存中,
而==操作符是比较两边的对象是否是同一个对象。

回答4:

个人推测:右边是双引号的情况下,String对象声明并初始化的时候返回的是同一个对象,所以s1==s2是成立的;

右边是对象的情况下,String对象声明并初始化的时候返回的是新的对象,所以s1==s3不成立。

建议String比较的话使用equals方法
s1.equals(s3)

回答5:

==比较的是两边的对象是否是同一个对象 并且值相等
equals比较值
s3是 新产生的对象和s1不等所以false
而System.out.println(s1.equals(s3));值为true