1,string s1 = new String("abc")
newString("abc")首先会到常量池中看有没有abc,有的直接调用,没有在创建同样这个也是有地址值的,这是常量池的特点,然后在new一个对象到堆内存中,把常量池中abc的副本拷贝一份放进堆内存中.再把地址值赋给s1.今天讨论过这个问题 ,觉得没必要纠结是先创建堆的地址值还是常量池,但是肯定得到的是怼的地址值.
2, String s1 = "ab";
String s2 = "abc";
String s3 = s1 + "c";
首先你要看string的api,Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)这个叫字符串的缓冲区!!!类及其 append 方法实现的。字符串转换是通过 toString 方法实现的,该方法由 Object 类定义,并可被 Java 中的所有类继承。
首先main方法进栈,有一个string s1 然后常量池中创建ab赋给s1,然后s2创建常量值abc s2就能拿到abc的地址值,(因为是两个对象s1,s2所以创建两个).s3=s1+c,这是+号字符串串联,因为是串联所以底层先创建一个stringbuffer对象或stringBulider对象放进堆内存,然后通过append方法把abc加到一起,这个stringbuffer对象也有地址值但会先调用他的tostring方法转换成string字符串(他也是有地址值的).然后在把地最后这个string字符串的地址值赋给s3
码字挺累的我建议你自己找找笔记看看父子类,这样容易记得牢
4就没必要这么深究了,知道是转义字符,知道什么意思就够了
希望能帮到你
|