你要明白,何时分配堆内存,何时分配栈内存。
String a = "aaa";
用这种方式的时候java首先在内存中寻找"aaa"字符串,如果有,就把aaa的地址给它
如果没有则创建
String a = new String("aaa");
是不管内存中有没有"aaa"
都开辟一块新内存保存它
可以用以下方法验证下
String a = "aaa";
String b = "aaa";
String c = new String("aaa");
System.out.println(a==b);
System.out.println(a==c);
结果应该是:
true
false
此题作为java程序员笔试题几率比较高。
你要好好记住哦!O(∩_∩)O~
不是这样的,java5.0以后出现了一个对象池的概念,Java虚拟机在启动的时候会实例化9个对象池,这9个对象池分别用来存储8种基本类型的包装类对象和String对象,String str = "abc"这样写是从对象池中取abc的对象,如果对象池中已经有了abc这个对象,那么就不会从新给它分配新的空间了,如果这样写String str = new String("abc");就会分配新的空间
字符串常量本来就是一个匿名对象,string
s="哈哈"这条语句的结果是,将“哈哈”的引用,也就是在字符串常量池中的首地址赋值给s,string
s=new
string("哈哈");这句的结果是:首先会在字符串常量池中产生"哈哈"这个对像,然后再用"哈哈"这个已经存在的对象,去构造s这个对象,这样就会产生两个对象,这似乎并不是我们要的结果
这个你可以用一个小程序自己测试下,印象更深刻~