总结昨天遇到的一个String类型的知识
在记录题目之前先补充几个知识点
1.String a=“abc”;与string b=new String("abc");
此时的变量a、b两个对象不相等。 a==b不成立 但是 a.equal(b)成立
并且无论a,b的定义位置如何,都不会影响到该结论
2.String a="abc";
String b=new String("abc") 新建一个对象,中间有一个对象的问题。由对象引用指向字符串常量池中的某一个字符串
String c=a; 将字符串常量池中的某个字符串地址赋给变量c。注意中间没有对象池的问题。
String d=b; 将对象池中的对象引用赋给变量d 注意这个赋值不直接涉及到字符串常量池
String e="a"+"bc"; 在编译的过程中就已经将其便以为字符串abc ,相当于直接把字符串abc赋值给变量e
String f="a";
String h=f+"bc"; 相当于 new StringBuffer().append("a").append("bc").toString(); 注意此时已经新建了一个StringBuffer对象
a、b、c、d、e、h几个对象之间的equal 成立(成立的意思是两两之间的equal的值为true)
对于== 说明
a!=b 新建的对象跟原来的对象不一样。
c==a
d==a
d!=a
e==a
h!=a
3.intern() 粗略说明一下
当a.intern()时,当字符串常量池中存在变量a对象的字符串时,返回字符串常量池中的字符串;如果不存在该字符串,则将此对象添加到字符串常量池中,并返回刚添加的字符串对象的引用
假设字符串常量池中存在字符串"number",不存在字符串"number1";
如果变量 a String a="number"; 则a直接取自字符串常量池中的字符串number ,并返回的是字符串的引用赋值给变量a 。(假设 String a= "number1"; 则需要在字符串常量地址池中添加一个字符串number1,变量a 等于新添加的字符串number1的引用)
变量 b String b=new String("number");
当变量c String c=a.intern(); 由于变量a已经定义并赋值,a.intern()会返回字符串常量池中的字符串“number”。
当变量d String d="number1".intern();由于字符串常量池中不存在字符串number1,所以会先把字符串number1存入字符串常量池中,然后,把刚添加的字符串number1返回