String s = new String("abc")创建了两个对象,首先创建了一个“abc"字符串对象,然后用它作为参数传递进s的构造方法中创建了s对象。在内存中这两个对象是不同的实例,"abc"对象由于没有外部指针指向它,它所占有 的内存最终将在某个时候被虚拟机回收Integer i = new Integer(123)只创建了1个Integer对象。
"abc"实在常量池里面创建,如果之前已经存在,不会再创建Integer i = new Integer(123) 这句话改成Integer i = 123效率会高一些
String s = new String("abc")创建了两个对象,首先创建了一个“abc"字符串对象,然后用它作为参数传递进s的构造方法中创建了s对象。在内存中这两个对象是不同的实例,"abc"对象由于没有外部指针指向它,它所占有 的内存最终将在某个时候被虚拟机回收Integer i = new Integer(123)只创建了1个Integer对象。
String s = new String("abc") ;先回去常量池中查找是否已有"abc" ,如果没有,则创建了一个“abc"字符串对象 ,放入常量池中 ;取出常量池的"abc”,作为参数创建一个String对象,s是指向这个String对象的引用,这个对象放在堆存储空间中 ;Integer i = new Integer(123)只创建了1个Integer对象。123 是常量池中的数据,是基本类型int; 个人理解哦
"abc"实在常量池里面创建,如果之前已经存在,不会再创建Integer i = new Integer(123) 这句话改成Integer i = 123效率会高一些
如果Integer中的数大于127那就另当别论了。
小弟还是有点。。
此时 s对象指向的不是存放“abc”这个字符串的内存地址吗??
怎么会是 “abc”对象没有外部引用呢?
不是这样的,这样说好了,内存中会有两个“abc”,一个被s指向,一个无外部指针。
如果在仔细的想一下
刚才这段话说了这么几个点:
1."abc"是在常量池中。(是一个对象吧?)
2.然后new String()这个对象是在堆中(是一个对象吧?)
3.然后引用s 是在 栈中,指向过程就是栈中的s (是一个对象吧?)
如果回到一开始的话。这段代码有2个对象; 这时候上面的这三个问号 肯定有一个是不算对象的。
个人理解哦
new String是堆中对象
s不是对象,是栈内的一个变量,只是它引用了堆中的对象另外,12L的[不是这样的,这样说好了,内存中会有两个“abc”,一个被s指向,一个无外部指针。]说法不完全正确,常量池的"abc"和堆中的对象有一定的联系,如果没有外部指针,就没法找到常量池的对象了
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1==s2); //false
String s3 = s2.intern();
System.out.println(s1==s3); //true
即通过intern方法,可以指向常量池中的对象