JAVA程序输出结果为什么是这样?

墨笙弘一
Java领域优质创作者
2017-01-06 04:53:21
package com.wonders.test;

public class StringTest2 {

private static String getA(){return "a";}

public static void main(String[] args) {

String a = "a";
final String c = "a";

String b = a + "b";
String d = c + "b";
String e = getA() + "b";

String compare = "ab";
System.out.println(b == compare);
System.out.println(d == compare);
System.out.println(e == compare);
}

}

为什么输出为false true false
...全文
198 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
墨笙弘一 2017-01-06
  • 打赏
  • 举报
回复
引用 6 楼 pany1209 的回复:
[quote=引用 3 楼 u012934325 的回复:] [quote=引用 2 楼 pany1209 的回复:] c是常量,编译期就确定的,所以为true
为什么前和尾是false?[/quote]字符串和变量的拼接是用stringBuilder拼接的, 例如new StringBuilder("d").append("abc").toString();toString方法是创建了一个String对象,new String,所以为false[/quote] 谢谢 明白了
墨笙弘一 2017-01-06
  • 打赏
  • 举报
回复
引用 4 楼 zy1404 的回复:
示例4: Java代码   String a = "ab";   String bb = "b";   String b = "a" + bb;   System.out.println((a == b)); //result = false 分析:JVM对于字符串引用,由于在字符串的"+"连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即"a" + bb无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给b。所以上面程序的结果也就为false。 示例5: Java代码   String a = "ab";   final String bb = "b";   String b = "a" + bb;   System.out.println((a == b)); //result = true 分析:和[4]中唯一不同的是bb字符串加了final修饰,对于final修饰的变量,它在编译时被解析为常量值的一个本地拷贝存储到自己的常量 池中或嵌入到它的字节码流中。所以此时的"a" + bb和"a" + "b"效果是一样的。故上面程序的结果为true。 详情可见:http://blog.csdn.net/gaopeng0071/article/details/11741027
明白了 谢谢
李德胜1995 2017-01-06
  • 打赏
  • 举报
回复
引用 3 楼 u012934325 的回复:
[quote=引用 2 楼 pany1209 的回复:] c是常量,编译期就确定的,所以为true
为什么前和尾是false?[/quote]字符串和变量的拼接是用stringBuilder拼接的, 例如new StringBuilder("d").append("abc").toString();toString方法是创建了一个String对象,new String,所以为false
kingbozhe 2017-01-06
  • 打赏
  • 举报
回复
帮顶,虽然能蒙对,但是还是不理解,求大神解答
  • 打赏
  • 举报
回复
示例4: Java代码   String a = "ab";   String bb = "b";   String b = "a" + bb;   System.out.println((a == b)); //result = false 分析:JVM对于字符串引用,由于在字符串的"+"连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即"a" + bb无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给b。所以上面程序的结果也就为false。 示例5: Java代码   String a = "ab";   final String bb = "b";   String b = "a" + bb;   System.out.println((a == b)); //result = true 分析:和[4]中唯一不同的是bb字符串加了final修饰,对于final修饰的变量,它在编译时被解析为常量值的一个本地拷贝存储到自己的常量 池中或嵌入到它的字节码流中。所以此时的"a" + bb和"a" + "b"效果是一样的。故上面程序的结果为true。 详情可见:http://blog.csdn.net/gaopeng0071/article/details/11741027
墨笙弘一 2017-01-06
  • 打赏
  • 举报
回复
引用 2 楼 pany1209 的回复:
c是常量,编译期就确定的,所以为true
为什么前和尾是false?
李德胜1995 2017-01-06
  • 打赏
  • 举报
回复
c是常量,编译期就确定的,所以为true
墨笙弘一 2017-01-06
  • 打赏
  • 举报
回复
up

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧