String

String存储结构改变?

  有char改为byte,String再也不用char[]来存储,改为byte[]加上编码标记,节约了一些空间

 

复制代码
        String s1 = "a";
        String s2 = "b";
        String s3 = “ab”;
     String s4 = s1+s2;

等价于StringBuilder s = new StringBuilder();
    s.append("a");
    s.append("b");

此时S3不等于S4,它先是通过StringBuilder的tostring方法,然后是new String()重新创建了一个对象,而s3是常量池中的,s4是堆中的。
复制代码
        final   String s1 = "a";
        final  String s2 = "b";
        String s3 = "ab";
        String s4 = s1+s2;

用final修饰,此时s3==s4

 

 

String s1 = new String(“ab”)创建了2个对象,一个在堆中,一个在常量池中。此时s1的引用是指向堆中的,堆中的那个引用才是指向字符串常量池。

String s1 = new String(“a”) + new String(“b”)创建了6个对象。

    对象1:“变量+变量”,所以创建了一个StringBuilder

    对象2 3 : new String(“a”),这边创建了2个,一个堆中,一个字符串常量池

    对象4 5: new String(“b”),同理创建了2个

    对象6:在上面创建了StringBuilder之后,它是调用他的toString方法,创建出new String(char[a,b]),参数是字符数组,对应的构造方法不同,所以不用在字符串常量池创建ab

 

 

 

intern()的作用?

  判断改字符是否在常量池中存在,没有则创建字符并返回该地址引用。

 

 

        String a1 = new String("1") + new String("1");
        a1.intern();
        String a2 = "11";
        System.out.println(a1 == a2);

在jdk1.6中,a1不等于a2;在jdk1.7之后,a1等于a2.

在jdk1.6之前,字符串常量池是在永久代中,不存在于堆中,当调用intern时,他会重新创造一个对象“11”,也有新的地址。

在jdk1.7及以后,字符串常量池是存放在堆中,当调用intern时,我们堆中此时已经有了对象“11”,所以字符串常量池会直接拷贝堆中“11”的地址,所以此时a1等于a2.

posted @   WXY_WXY  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示