String 基础(一)
一:String引用类型(也有人称是一个对象),不是简单类型!默认值是null.
二:new String() 和new String("")是创建一个空字符串对象。不是null。
三:String str = "abc" 和 String str = new String("abc")的区别:
为了区别,我们引入一个概念——常量池
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的
一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
(1):String str = "abc"
首先查看字符串池中是否存在字符串"abc",如果存在则直接将"abc"赋给str,
如果不存在就在字符串池中新建一个字符串"abc",然后赋给str。也就是说,
jvm会确保字符串池中仅有一个字符串拷贝。
例如:
String str1 = "abc";
String str2 = "abc";
String str3 = "a"+"b"+"c";
System.out.println(str1==str2);
System.out.println(str1==str3);
结果:true
true
因为例子中的str1 和str2 中的”kvill”都是字符串常量,它们在编译期就被确定了,所以str1==str2为true;
而”a”和”b”,"c"也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,
所以str3 也同样在编译期就被解析为一个字符串常量,所以str3 也是常量池中” abc”的一个引用。
(2): new String("abc")
创建的字符串不是常量,不能在编译期就确定,所以new String()创建的字符串不放入常量池中,它们有自己的地址空间
例:
String str1 = "abc";
String str2 = new String("abc");
String str3 = "a"+"b"+new String("c");
System.out.println(str1==str2);
System.out.println(str1==str3);
System.out.println(str2==str3);
结果:
false
false
false
str2 因为无法在编译期确定,所以是运行时创建的新对象”abc”的引用,
str3 因为有后半部分new String(“c”)所以也无法在编译期确定,
所以也是一个新创建对象”abc”的应用;明白了这些也就知道为何得出此结果了。
四:最后总结一下
创建字符串对象不建议用new 的方式,new效率比较低,而且也占用空间。如果要用new String();建议用
StringBuffer!