先来学习下String str = "qw" + "er";
和String str = new String("qw") + new String("er") ;
的原理。
String str = "qw" + "er";
原理首先用"qw"和"er"拼接成"qwer"之后再直接创建"qwer"字符串,通过==
对比会发现两个引用指向同一内存地址。
String str = "qw" + "er";
String qwer = "qwer";
System.out.println(qwer==str);//结果为true
String str = "qw" + "er";
的原理,首先会在字符串常量池里分别创建"qw"和"er",之后会在字符串常量池里拼接生成"qwer"。一个引用也不可能指向多个对象(但是,一个对象可以被多个引用指向),所以要拼接出一个字符串再返回唯一地址值。
一个由多个字符串拼接成的字符串常量,也是个字符串常量。其次一个引用只能指向一个内存地址。所以会在字符串常量池里创建"qwer"字符串返回唯一内存地址。
String str = new String("qw") + new String("er") ;
原理首先用字面值方式创建"qwer"对象,之后用new
关键字分别创建"qw"和"er"对象,再用"+"来拼接。再用==
比较str
和qwer
的内存地址,返回结果为false。
String qwer = "qwer";
String str = new String("qw") + new String("er");
System.out.println(qwer==str);//结果为false
String str = new String("qw") + new String("er") ;
的原理,首先会在字符串常量池里分别创建"qw"和"er",然后会在堆中生成"qw"和"er"两个对象。由于"+"的原因会生成一个新的对象"qwer"。之后"qw"和"er"对象不再可用,垃圾回收器会回收他们。
说明String str = new String("qw") + new String("er");
创建的对象并没有在字符串常量池里添加的"qwer",而是在堆内存中创建了"qwer"对象。由于这个操作是在堆内存完成的,所以"qwer"不会再添加到字符串常量池中。
String str = "qw" + "er";
和String str = new String("qw") + new String("er")
;区别:String str = "qw" + "er";
首先会在字符串常量池里创建qw
和er
对象。之后会在字符串常量池里创建"qwer"。一共在字符串常量池里创建3个对象。String str = new String("qw") + new String("er") ;
在堆内存和字符串常量池各创建"qw"和"er"对象,之后在堆内存中创建新对象"qwer"并返回地址值给str。分别在堆内存创建3个对象(其中"qw"和"er"对象在拼接后会被垃圾回收器回收。),字符串常量池里创建2个对象。共5个对象。作者:Kawasaki_MZDA 链接:https://juejin.cn/post/6844903984650518535 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。