1.String对象不属于8中基本数据类型,String是一个对象
String对象的默认初始值为null;String为一个特殊的对象,有一些其他对象没有的特点;
2.new String()与new String(" ")都是申请一个新的空字符串,是空字符串而不是null;
3.String str = ”a“ 与 String str = new String("a")的区别;
此处需明白常量池的
意义(constant pool),常量池是指在编译器被确定的并被保存在编译完成的.
class文件中。包括了类、方法、
接口等中的常量,也包括字符串常量;
public class Test01 {
public static void main(String[] args){
String str1 = "abcd";
String str2 = "abcd";
String str3 = "ab"+"cd";
System.out.println(str1 == str2);
System.out.println(str1 == str3);
}
}
输出结果为:
true
true
程序中的str1与str2均为字符串常量,在编译过程中即被保存在.class文件中;str3是被两个字符串连接而成,并且他也是一个字符串常量,所以str3在编译期也会被
解析为一个字符串常量,它也是常量池中"abcd”的一个引用;因此str1==str2==str3;
但是用new String()创建的字符串不是字符串常量不能被保存在常量池中,
他们有自己的地址空间;
public class Test02 {
public static void main(String[] args){
String str1 = "abcd";
String str2 = new String("abcd");
String str3 = "ab"+new String("cd");
System.out.println(str1 == str2);
System.out.println(str1 == str3);
System.out.println(str2 == str3);
}
}
输出结果:
false
false
false
在程序Test02中str1还是一个字符串常量,但是str2与str3均不再是字符串常量;str1被保存在常量池中,str2与str3均在运行时创建了新的对象(具有新的地址空间,且str2与str3的地址是不同的)
4.String.intern()方法扩充常量池
当一个String实例调用intern()方法时会查找常量池中是否具有相同的Unicode字符串常量,如果有则返回其的引用;如果没有则在常量池中增加一个与其相同的Unicode字符串并返回其引用;
public class Test03 {
public static void main(String[] args){
String str1 = "abcd";
String str2 = new String("abcd");
String str3 = new String("abcd");
System.out.println(str1 == str2);
System.out.println("**************");
//str2虽然调用了intern()方法但是并未返回给其引用
str2.intern();
//str2调用了intern()方法并返回其引用
str3 = str3.intern();
System.out.println(str1 == str2);
System.out.println(str1 == str3);
}
}
输出结果:
false
**************
false
true
5.String实例是不可变的
String str3 = "ab"+"cd"
存在ab cd 以及abcd三个字符串常量;会造成
内存的浪费所以对字符串一般采用StringBuffer
6.附加
public class Test {
public static void main(String[] args){
String str1 = "abcd";
String str2 = "cd";
//str2由于+号后存在str2的引用无法在编译期进行确定与str1地址是不同的
String str3 = "abcd"+str2;
System.out.println(str1 == str3);
}
}
输出结果:
false
邪恶的面试题
public class Test{
public static void main(String[] args){
String a = "a1";
String b = "a"+ 1;
System.out.println("------>"+a==b);
}
}