字符串的底层原理

字符串存储的内存原理

  • 直接赋值会复用字符串常量池中的

  • new出来的不会复用,而是开辟一个新的空间

==号比较的到底是什么

  • 基本数据类型比较数据值

  • 引用数据类型比较地址值

字符串拼接的底层原理

  • 拼接的时候没有变量都是字符串,触发字符串的优化机制,在编译的时候就已经是最终的结果。

public class Test{
    public static void test(String[]args){
        String s="a"+"b"+"c";
        System.out.println(s);
    }
}

在拼接时有变量,jdk8以前底层会使用StringBuilder

public class Test{
    public static void test(String[]args){
        String s1="a";
        String s2=s1+"b";
        String s3=s2+"c";
        System.out.println(s3);
    }
}

jdk8字符串拼接的底层原理

public class Test{
    public static void test(String[]args){
        String s1="a";
        String s2="b";
        String s3="c";
        String s4=s1+s2+s3;
        System.out.println(s4);
    }
}

先预估字符串的长度然后建立一个数组,将内容放入数组中之后,将这个数组变成字符串。

字符串拼接的时候有变量参与:在内存中创建了很多对象浪费空间,时间也非常慢。

结论:

如果很多字符串常量拼接,不要直接+,在底层会创建多个对象,浪费时间,浪费性能。

StringBuilder提高效率原理图

public class Test{
    public static void main(String[]args){
        StringBulider sb=new StringBuilder();
        sb.append("a");
        sb.append("b");
        sb.append("c");
        System.out.println(sb);
    }
}

字符串的底层原理_第1张图片

StringBuilder是一个内容可变的一个容器。

所有要拼接的内容都会往StringBuilder中放,不会创建很多无用的空间,节约内存。

StringBuilder源码分析

  • 默认创建一个长度为16的字节数组

  • 添加的内容长度小于16,直接存

  • 添加的内容大于16会扩容(原来的容量*2+2=34)

  • 如果扩容之后还不够,以实际长度为准

    package StringBuilderDemo;
    public class StringBuilderDemo05 {
        public static void main(String[] args) {
            StringBuilder sb=new StringBuilder();
            //容量:最多装多少
            //长度:已经装了多少
            System.out.println(sb.capacity());//16
            System.out.println(sb.length());//0
            sb.append("abc");
            System.out.println(sb.capacity());//16
            System.out.println(sb.length());//3
            sb.append("abcdefghijklmnopqrstuvwxyz");
            System.out.println(sb.capacity());//34
            System.out.println(sb.length());//26
            sb.append("abcdefghijklmnopqrstuvwxyz0123456789");
            System.out.println(sb.capacity());//36
            System.out.println(sb.length());//36
        }
    }
    

你可能感兴趣的:(java,开发语言)