面试中String字符是比较喜欢出题的一个地方,再次通过查询资料总结一下.
Java的字符串,有一些必须注意的特性:
字符串常量与字符串池.
不可变动(Immutable)字符串.
1.字符串常量与字符串池
来看个程序片段,你觉得以下会显示true还是false?
char[] name = { 'm', 'e', 'n', 'm', '9', '1' };
String name1 = new String(name);
String name2 = new String(name);
System.out.println(name1 == name2);
输入结果为:false.
因为name1与name2分别创建出来的.
下面的代码呢?
String name1 = "menm91";
String name2 = "menm91";
System.out.println(name1 == name2);
输出结果为:true.
代表name1与name2参考到同一对象.
在Java中为了效率考虑,以""包括的字符串称为字符串常量(String literal),只要内容相同(序列、大小写相同),无论在程序代码中出现几次,JVM都只会创建一个 String 实例,并在字符串池(String pool)中维护.在上面程序片段的第一行,JVM会创建一个 String 实例放在字符串池中,并给 name1 参考,而第二行则是让 name2 直接参考至字符串池中的 String 实例,如下图:
再看下题:
String name1 = "menm91";
String name2 = "menm91";
String name3 = new String("menm91");
String name4 = new String("menm91");
System.out.println(name1 == name2);
System.out.println(name1 == name3);
System.out.println(name3 == name4);
输出结果为:true false false
因为"menm91"会建立String实例并在字符串池中维护,所以 name1 与 name2 参考的是同一个对象,而 new 一定是建立新对象,所以 name3 与 name4 分别参考至新建的 String 实例.
2.不可变动字符串
以下会显示true还是false?
String text1 = "Ja" + "va";
String text2 = "Java";
System.out.println(text1 == text2);
有的人会这么说:
因为用了+连接字符串,所以产生新字符串,所以text1 == text2应
该是false吧。如果你这么认为,那就上当了。答案是true。反编译之后就知道为什么了:
String s = "Java";
String s1 = "Java";
System.out.println(s == s1);
编译程序是这么认为的:既然你写死了"Ja" + "va",那你要的不就是"Java"吗?根据以
上反编译之后的程序代码,显示true的结果就不足为奇了。
参考:<<Java JDK 7学习笔记>>