Java面试题 String储存 常量池
结果
false true
字面变量赋值在常量池中
字符变量相加在堆空间中开辟空间
(+号实际使用的是StringBuffer。append(s1).apeend(s2)
字面常量相加在常量池中开辟空间
故s3,s4指向地址不同
因"abcxyz"已存在常量池中,s5直接指向这个地址,s4,s5地址相同
true true(JDK1.8之后)false true(JDK1.7之前)
使用intern方法,如果常量池中没有,就把对象赋值一份(或对象引用)放到常量池中,返回常量池中的对象,如果长了池中存在,则直接返回
JDK1.7之前是复制一份放入常量池,JDK1.8之后则把对象引用到常量池
这里说1.8之后:
s3地址指向堆中“abcxyz”,调用intern()后,由于常量池中没有,把对象引用(“s3中地址”)放到常量池中,把地址赋值返回给s4(并不是指向这个地址,要是指向,肯定是false,JDK1.7之前是把堆中值复制过去,s4指向常量池,故是false),故s3,s4相同
true
特殊
false
java等一些特殊字符已经在常量池中,intern会直接返回常量池中底子,而s3是指向堆中的