一个非常简单的问题,
String a="1";
String a=new String("1");
问题如下:
两个内存机制不一样是肯定的吧,
String a=new String("1");里面a是引用,a装的是1在内存里面的地址,也就是占用了两块内存
String a="1";里面a装的直接是值,只占用一块内存????
String a="1"; a指向String的常量池中的“1”;
String a=new String("1"); 在内存中生成一个String的对象,同时在内存中生成一个一个指向刚才创建的String对象的一个引用,也就是a
这两者的区别,不是在于a的区别,a都是一样的都是装了一个指向字符串对象的引用;而是在于生成这个字符串对象的过程的区别。
看看它们的字节码的区别就知道了:
String a="1";
[code="java"]ldc #2; //String 1
astore_1
[/code]
String a=new String("1");
[code="java"]new #3; //class java/lang/String
dup
ldc #2; //String 1
invokespecial #4; //Method java/lang/String."":(Ljava/lang/Strin
g;)V
astore_1
[/code]
1、字符串常量在常量池 2、栈中通过ldc压入常量池引用
可参考
[url]http://www.iteye.com/topic/1122533#2337877[/url]
在java 中 String类型是很特殊的,既可以是基本类型也可以是高级类型,
String a = "1";此时String表示基本类型,a是在stack声明的变量,指向串池中的字符串"1";此处有一个变量一个对象(a是变量,"1"是串池中的字符串对象)
String a = new String("1");表示高级类型,开辟一块内存,存放串池的地址,指向串池中的"1",a指向该内存。