String变量与String常量相加问题 |
您所在的位置:网站首页 › 两个字符串相加创建了几个对象 › String变量与String常量相加问题 |
String变量与String常量相加问题
public static void main(String[] args) {
String MESSAGE = "taobao";
String a = "tao" + "bao";
String b = "tao";
String c = "bao";
String d = b+c;
System.out.println(a == MESSAGE);
System.out.println((b + c) == MESSAGE);
System.out.println(d == MESSAGE);
true还是false傻傻分不清,答案在最后,先搞清原因 首先要清楚的是,String是常量,String类是被final修饰的,String类中的字符数组也是被final修饰的。 public final class String implements java.io.Serializable, Comparable, CharSequence { /** The value is used for character storage. */ private final char value[];直接赋值而不是使用new关键字给字符串初始化,在编译时就将String对象放进字符串常量池中 taobao在字符串常量池已经存在,因此String a = “tao” + “bao”;执行后,a也指向常量池中该字符串,因此引用相同 Java对String变量(引用)的相加是通过StringBuilder实现的,先构造一个StringBuilder里面存放"tao",然后调用append()方法追加"bao",然后将值为"taobao"的StringBuilder通过toString()转化成String对象。此时会产生一个新的堆内存地址。 可以通过编译后的class文件查看: String d = (new StringBulider()).append(b).append©.toString(); 字符串常量相加,不会创建 StringBuilder 对象 很明显新返回的对象和MESSAGE不是指向同一个地方,返回的对象指向堆中String对象,MESSAGE指向常量区中字符串,即两者引用不同 true false false |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |