String
最终类,没有子类;Java中的所有的字符串直接量都是string类的对象。
string类的对象都是常量,字符串都是常量,值创建后不能被改变,
因为字符串底层都是依赖于不可改变的字符数组来实现的,创建之后不能改变。
如果string类的对象的内容一致时,则会共享一个常量池里的引用。
如果等号右边的值都是直接常量,编译时进行优化,即将最终结果进行存储。
字符串的底层实现
//字符串创建对象的形式
String str1 = "ab";
String str2 = new String("ab");
String str3 = "ab";
String str4 ="a"+"b";
String str5 ="a";
str5 = str5 + "b";
//比较地址值
System.out.println(str1==str2);//false 因为创建了新的对象 即new了
System.out.println(str1==str3);//true
System.out.println(str1==str4);//true
System.out.println(str1==str5);//false
System.out.println(str2==str5);//false
/* String str1 = "ab"; 指向常量池
* 方法区 = 静态常量池 + 运行常量池(所有的常量)
* 堆的地址存于方法区的常量池
* 栈中存储的是方法区常量的地址
* 栈通过指向方法区的地址间接的访问堆的地址
* String str2 = new String("ab"); 指向堆
* 在堆内存中存储常量的地址
* 栈内存中存储的是堆内存的地址
* String str3 = "ab"; 指向常量池
* String str4 ="a"+"b"; 指向常量池
* byte b = 128-1; 直接量进行运算时,编译时直接进行优化拼接 相当于 “ab”.
* String str5 ="a";str5 = str5 + "b"; 不是直接量的优栈内存和常量池的地址的指向
*/