class Code {
public static void main(String[] args) { String a = "abc";
String b="abc";
String c="ab"+"c";
String d="ab";
String e=d+"c";
System.out.println(a==b); //true
System.out.println(a==c); //true
System.out.println(a==e); //false
System.out.println(a+" "+b+" "+c+" "+d+" "+e); //abc abc abc ab abc
}
} String c="ab"+"c";
String e=d+"c";
这两句有什么不同。内存中是怎么分配的?
public static void main(String[] args) { String a = "abc";
String b="abc";
String c="ab"+"c";
String d="ab";
String e=d+"c";
System.out.println(a==b); //true
System.out.println(a==c); //true
System.out.println(a==e); //false
System.out.println(a+" "+b+" "+c+" "+d+" "+e); //abc abc abc ab abc
}
} String c="ab"+"c";
String e=d+"c";
这两句有什么不同。内存中是怎么分配的?
解决方案 »
- jdk写了一个helloworld,如何用JIT把它变成本地代码?
- 关于java迭代器的一个问题
- 高手进!!!!!
- 构造函数的疑惑
- 散分啦白得啦?请问哪里可以下载到《csdn电子杂志-java版》啊?找了半天没找到。
- 在win2000中java程序不能引入外部jar文件中的包是怎么回事?
- 新手问题,如何实现图片循环移动?
- 请问为何在别的机器上浏览不了打包的appelt?
- 用jdbc连接oracle数据库时,关于DriverManager.getConnection(url,name,password)方法的问题
- 求大神
- JXL 如何创建数值型的excel表格!!
- 一个toy小程序(TCP方面),想增加一个功能,大家帮帮忙,谢谢,听说标题越长越好
新版本的JDK 会把 String c="ab"+"c"; 优化成 String c="abc";
理论上,String e=d+"c";是要先创建一个对象 String tempObj ="c", 然后再和对象b相加,得到一个新对象赋给 e。事实上这个也可以优化,因为string是不可变对象,所以在d为常量的情况下,e也初始化为一个常量,没有使用上的差别。具体可以看看编译的java byte
c在编译时也会优化会一个字符串对象
但e是在java程序运行时才产生的‘abc’对象
这个string对象是在堆里创建的!
而上面的字符串对象是在常量池里。当然比较时就不会‘==’
楼主请看,String c="ab"+"c";
是将常量池中的ab 和 C ,放到一个新的内存里面
而 String d="ab";
而d的地址指向常量池中匿名对象指向的ab . 差别不大 ,没必要追究。