一.String类
String 表示一个字符串,内部使用字符数组实现,该类不可变
二.存储
上图为下列语句执行的内存存储过程:
String S1 = “粪粪”;
String S2 = new String(“粪粪”);
String S3 = “粪粪”;
三.String实例(注释很详细):
public class StringDemo {
public static void main(String[] args) {
//String 的两种赋值方式的分析,推荐第一种
//1.直接赋值
String S1 = "粪粪";
//2.使用new关键字创建对象 new :表示在堆中申请内存空间,强制型的一个操作
//面试题:下面语句创建了几个对象? --->1个
String S2 = new String("粪粪");
System.out.println(S1==S2);//比较指向的地址,返回false
//String 类在运行期和编译期的分析
String S3 = "粪粪"; //常量池已有"粪粪",所以不会再创建对象,直接指向,省了内存空间
System.out.println(S1==S3); //在常量池中找,所以会返回true
System.out.println("-----------我是可爱的分割线---------");
//4种情况分析:直接赋值,字符串连接时,分析编译器和运行期
//如果在编译期值可以被确定,那就使用已有的对象,否则会创建新的对象
String a = "a";//编译时可以确定,所以直接把变量a替换成"a"
String a1 = a+1;//编译时语句是一句一句来的,会把a当成是变量,不可以确定,变量在运行的时候才有值,上一句跑了,a才有值,然后a1才会为"a1",
//所以这句话会在堆中创建一个a1对象
String a2 = "a1";//这句则在常量池中创建一个"a1",因此a1==a2 :false
System.out.println(a1==a2);
final String b="b";
String b1=b+"1"; //编译期b到这里已替换,1加不加双引号无所谓,final才可以,没有final就还是变量
String b2 = "b1";
System.out.println(b1==b2);//true
String c = getC(); //注意,方法只有在运行期才能得到结果
String c1 = c+1;
String c2 = "c1";
System.out.println(c1==c2); //false
final String d = getD();
String d1 = d+1;
String d2 = "d1";
System.out.println(d1==d2);//还是false,因为虽然d是final,但方法只有在运行时才有返回结果,因此一样是false
}
private static String getC(){
return "c";
}
private static String getD(){
return "d";
}
}
输出:
false
true
———–我是可爱的分割线———
false
true
false
false