问题描述
一个非常简单的问题,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
解决方案二:
在java 中 String类型是很特殊的,既可以是基本类型也可以是高级类型,String a = "1";此时String表示基本类型,a是在stack声明的变量,指向串池中的字符串"1";此处有一个变量一个对象(a是变量,"1"是串池中的字符串对象)String a = new String("1");表示高级类型,开辟一块内存,存放串池的地址,指向串池中的"1",a指向该内存。
解决方案三:
1、字符串常量在常量池 2、栈中通过ldc压入常量池引用可参考http://www.iteye.com/topic/1122533#2337877
解决方案四:
这两者的区别,不是在于a的区别,a都是一样的都是装了一个指向字符串对象的引用;而是在于生成这个字符串对象的过程的区别。看看它们的字节码的区别就知道了:String a="1"; ldc #2; //String 1astore_1String a=new String("1"); new #3; //class java/lang/Stringdupldc #2; //String 1invokespecial #4; //Method java/lang/String."<init>":(Ljava/lang/String;)Vastore_1