String

构造器

1】空参构造器

String  a=new String();

空构造器将字符串常量池中的空串"" 的地址赋给了value变量

//空参构造器底层是将空字符串""对应的字符数组赋值给正在创建的对象a
public String() {   
        this.value = "".value;
    }

在这里插入图片描述


空字符串底层对应的数组什么都没有,只是创建了一个对象而已

【2】参数为String的构造器

String b=new String("abc");

//带String参数的构造器底层就是将字符串"abc"对应的字符数组赋值给正在构建的对象b

public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }



【3】参数为字符数组的构造器

//参数为字符数组的构造器底层是数组复制操作  

在这里插入图片描述

为什么要复制一份,而不是直接用,因为String底层的char[] value是final修饰的,不可变
如果直接将字符数组的地址给value,那么如果对字符数组里的元素修改了,value指向的数组也会被修改
复制一份新的,就不用担心被修改

public String(char value[]) {
        this.value = Arrays.copyOf(value, value.length);

    }

内存分析


【1】
public class TestString {
    public static void main(String[] args){
            String A="a"+"b"+"c";
            String B="ab"+"c";
            String C="abc"+"";
            String D=A+"";
    }
}

反编译后的.java文件
在这里插入图片描述

可以看出上面的常量字符串会进行编译期优化,直接合并成完整的字符串。

在这里插入图片描述

【2】

常量+常量   常量池
变量+常量   堆内存
对象.intern() 返回常量池对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值