String
最终类
java中所有的字符串常量都是String类的对象
String类底层是根据不可改变字符数组来实现数据存储,String类对象的内容无法改变(常量)
Java中所有的常量存储方式在方法区的运行时常量池
当常量池中已经存在引用,如果后续有同名的引用那么共享同一个引用(共享)
StringBuilder与StringBuffer
从JDK1.0开始String类做拼接使用的是StringBuffer,安全可靠但是拼接效率较低
从JDK1.5开始String类做拼接使用的是StringBuffer,不安全但是拼接效率较高
package cn.r.string;
public class StringDemo1 {
public static void main(String[] args) {
//字符串常量存储在方法区的运行时常量池中
//s1指向方法区常量池
String s1="ab";
//s2指向堆内存
String s2=new String ("ab");
//当常量池中已经存在引用,如果后续有同名的引用那么共享同一个引用
//s3和s1指向同一个常量池
String s3="ab";
//byte b=128-1;
//当参与运算的都是常量那么在编译时期就会进行优化直接计算结果再进行赋值
//String s4="ab";s4和s1指向同一个常量池
String s4="a"+"b";
String s5="a";
//s5=s5+="b";
//有String类不能直接拼接
//所以底层是由 s5=new StringBuilder("a").append("b").toString();
//toString方法底部是new一个新的String类对象返回
//s5指向堆内存
s5+="b";
//s1指向方法区,s2指向堆内存,地址值不一样
System.out.println(s1==s2);//false
//s3和s1指向同一个常量池,地址值一样
System.out.println(s1==s3);//true