String创建问题?

参考博文:https://blog.csdn.net/qq_34490018/article/details/82110578
1.String类是使用了final修饰,内置char[] 也是使用了fianl修饰,当你改变String的时候,通常会重新new一个对象,String实例的值是通过字符数组实现字符串存储的。

2.什么时候创建呢,一般都是先查找字符串常量池有没有该对象,有的话直接将常量池对象的内存地址引用过来(也就是没有新建对象),没有则创建新的地址,并存到常量池里.

举例子:

  • +拼接字符串 编译期就已经拼接了
    String a=“a”+“b”+“c”+“d” ;创建了几个对象? //0个或者1个对象
    右边是"+“号拼接,而且都是常量不是对象引用,编译时相当于拼接了"abcd”,
    接着才去运行时常量池查找对象地址是否存在,有的话直接引用地址,没有就创建一个.
    等价: String a=new StringBuilder(“abcd”);
    //常量池查找"abcd"

  • new对象
    String b=new String(“abcd”);
    这里 可以拆分两步,等价于 String a=“abcd”; String b=new String(a);
    那么,常量池没有"abcd" 就会创建一个, 之后new一个,一共2个对象;

public class Test {
    public static void main(String[] args) {
       String a="a"+"b"+"c"+"d";
       String b=new String(a);
       String c="abcd";
        System.out.println(a==b);	//false
        System.out.println(a==c);  //true

    }
}
  • 混合使用,假设常量池不存在 13,1,14,1314
    String a=”1”+”3”+new String(“1”)+”4”;
    相当于 String n1=“13”,String n2=“4”; //创建2个对象,13和4
    String a=n1+new String(“1”)+n2; //new创建了2个, 里面的对象是个String
    String a=“1314” ; //1314拼接后又创建1个
    一共是4个对象
  • new+new
    String a=new String(“1”)+new String(“1”);
    相当于, 创建了对象 String n=“1”; //创建一个"1"
    String a=new String(n)+new String(n); //new了两个对象
    //最后拼接了 “11” 创建一个
    //一共四个对象
    ps:JDK6中的常量池是放在永久代的,永久代和Java堆是两个完全分开的区域
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章