Java 比较concatated字符串和普通字符串

Java 比较concatated字符串和普通字符串,java,string,Java,String,当我比较一个有关联的字符串并比较关联字符串和普通字符串的对象时,它显示为false。我认为Strig文本“kalyansreekar”已经存在于字符串常量池中。有人能解释一下为什么会发生这种情况,以及字符串压缩的实现代码吗。多谢各位 String a="kalyan"; String b=a+"sreekar"; String c="kalyansreekar"; System.out.println(b==c); “我希望结果为true,但实际输出为false”这里b==c比较字符串的引用,

当我比较一个有关联的字符串并比较关联字符串和普通字符串的对象时,它显示为false。我认为Strig文本“kalyansreekar”已经存在于字符串常量池中。有人能解释一下为什么会发生这种情况,以及字符串压缩的实现代码吗。多谢各位

String a="kalyan";
String b=a+"sreekar";
String c="kalyansreekar";
System.out.println(b==c);

“我希望结果为true,但实际输出为false”

这里b==c比较字符串的引用,而不是字符串的内容。

如果要比较字符串的值,请使用b.equals(c)而不是b==c

string
上的
+
在内部使用一个
StringBuilder
返回一个新的
string
实例(在Java=9上)

JVM字符串池中有“kaylan”“sreekar”“kalyansrekar”等代码常量。如果确实要使用引用进行比较,请尝试:

String a="kalyan";
String b=a+"sreekar";
b=b.intern(); // Puts it in the String pool
String c="kalyansreekar";
System.out.println(b==c); // true

我不想比较数值。我认为引用b和c都指向常量池中相同的字符串文字“kalyansreekar”字符串,因此输出应该是真的,但不是。@KalyanSreekarJhade好吧,然后您刚刚测试了它,发现不是这样。使用
intern()
可以这样做。但这并不意味着它们指向内存中的同一个位置,它们是独立的对象。
+
在字符串上不使用
StringBuilder
@JohannesKuhn,当我调试它时,它会在我的设置上使用。它对您的应用是什么?它使用
invokedynamic
@johanneskun有趣。我会检查一下,如果我找到了一个链接,我会添加一个链接。