浏览 1427 次
锁定老帖子 主题:String 创建
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-03-01
最后修改:2010-08-31
import org.junit.Test; public class TestString { public void test1() { String s = new String("abc"); String s1 = "abc"; String s2 = new String("abc"); System.out.println(s == s1); System.out.println(s == s2); System.out.println(s1 == s2); System.out.println(s == s.intern()); System.out.println(s1 == s.intern()); System.out.println(s1.intern() == s2.intern()); 上述代码中: String s = new String("abc"); 请问在内存中创建了几个对象?分别在什么地方? 创建了两个对象,分别在String Pool(常量池)和Heap(堆)里. 首先生成了一个对象,叫"abc",在String Pool里面,先在常量池里查找是否有 "abc",发现没有就把"abc"放入String Pool里面. 接下来,执行new String("abc")构造方法,new出来的对象都放在Heap里面. 在Heap里又创建了一个"abc"的对象.这时内存里就有两个对象了,一个在String Pool 里面,一个在Heap里面. 只有String类型 有String Pool(常量池),String类是不可变的类.在创建对象,先在常量池里查找是否有 "abc"的常量,如果没有则创建一个新的,如果有则不会再创建,使用原来已经存在的. 其中s只是一个对象的引用(存放对象的地址),而不是对象. 在执行完第二句String s1 = "abc";后内存里创建了几个对象?为什么? 在执行完String s1 = "abc";后内存里一个对象也没有创建.因为在它先在String Pool里面检查是否有 内容为"abc"的字符串对象存在,发现已经有一个了,就不会再创建.(因为在执行完第一句已经存在一个"abc"了). 在执行完第三句String s2 = new String("abc");后内存中创建了几个对象?为什么? 在执行完第三名,内存创建了一个对象.因为此句中的"abc"先在String Pool里面查找是否有 内容为"abc"的对象,发现已经在在就不会再创建新的了.然后new String("abc")会在堆里 创建一个新的"abc"对象,只要new出来的,不管内容是否相同,都会在Heap中创建一个对象. 所以此句执行后只在Heap中创建了一个对象. s == s.intern() 其中s.intern()会首先在String Pool里查找是否有内容为"abc"的对象, 发现存在,就会返回String Pool里面内容为"abc"的对象,地址也指向它.所以此句输出false. s1 == s.intern() 同样,s1指向的是String Pool里面内容为"abc"的对象,所心此句输出true. s1.intern() == s2.intern() 同样,s1.intern()和s2.intern()指向的都String Pool里面内容 为"abc"的对象,所以此句输出true. *********************************************** s == "hel" + "lo"当加号两边都是常量值时,就会组成一个新的常量值在String Pool里面. 如果String Pool已经有相同内容的就不会再创建.输出true. "hel" + s2 当加号两边有一个不是常量值,会在堆里面创建一个新的"hello"对象.输出false s1 + s2 同上,输出false. } public void test2() { String s = "hello"; String s1 = "hel"; String s2 = "lo"; System.out.println(s == "hel" + "lo"); System.out.println(s == "hel" + s2); System.out.println(s == s1 + s2); } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |