浅谈java中String源码类中构造方法

本文详细解析了Java中String类的各种构造方法,包括无参构造、基于char数组和int数组的构造,以及从byte数组、StringBuffer和StringBuilder转换的方法。探讨了不同构造方法的内部实现,如数组复制和编码转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于String类中的无参构造方法:

实例1.public String() {
    this.value = "".value;
}

此方法为初始化String类中 private final char value[];中的value值,由测试方法:

实例1测试方法:public static void main(String []args){
  String o =new String();
  o="aaa";
}

可知 首先通过实例1中的value值赋给o因此,此时o=" ",构造方法完毕之后再由“aaa”赋值给o,可以理解为o首次赋值为" "然后“aaa”赋值给o变量

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

实例1.2当初始化一个String类时Steing类里面默认value为E:\\java\\jre\\bin\\instrument.dll 然后通过Array.copyOf把数组赋值给新数组 copy(这个新数组可以点进arrays.copyOf方法进入查看实现

实例1.3 public String(char value[], int offset, int count) {
    if (offset < 0) {
        throw new StringIndexOutOfBoundsException(offset);
    }
    /*************/
    this.value = Arrays.copyOfRange(value, offset, offset+count);
}

此实例经过测试返回一个新的char[]下标从offset到count长度。

实例1.4 public String(int[] codePoints, int offset, int count) {
    /*****/
    this.value = v;
}

实例1.4接收一个int类型数组,其最后会转换成char类型的数组,原理与实例1.3相同不做过多的记录。

实例1.5 public String(byte ascii[], int hibyte, int offset, int count) {
    checkBounds(ascii, offset, count);
    char value[] = new char[count];

   /*******
}

实例1.5其中hibyte==0则返回value[]值为从右往左数截取count数组,并返回以上方法如果使用在进使用编译器进行编译的时候回提示此方法已经过时

实例1.6 public String(byte ascii[], int hibyte) { this(ascii, hibyte, 0, ascii.length); } 此方法调用实例1.5不做过多说明

实例1.7public String(byte bytes[], int offset, int length, String charsetName) throws UnsupportedEncodingException { if (charsetName == null) throw new NullPointerException("charsetName"); checkBounds(bytes, offset, length); this.value = StringCoding.decode(charsetName, bytes, offset, length); }

根据所传递的字符编码,charsetName转换成为一个新的数组

实例1.8

public String(StringBuffer buffer) {
    synchronized(buffer) {
        this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
    }
}

实例1.8方法表示获取buffer值赋值给value对象,这里为什么要用到sychronized个人认为是为了共享同一个value出现结果与预期结果不符的原因

实例1.9

public String(StringBuilder builder) {
    this.value = Arrays.copyOf(builder.getValue(), builder.length());
}

此方法与1.8实例相同,区别在于synchronized关键字的使用,使用stringbuilder相对于快一些

实例1.9

String(char[] value, boolean share) {
    // assert share : "unshared not supported";
    this.value = value;
}

实例1.9可以看出吧一个char[]数组直接复制给value,share这个参数不理解,感觉没什么用处至于为什么要加上个参数应该是为了跟另一个构造方法不重复,毕竟重载最明显的特征就是参数不一致,如果理解这个方法的话需要根据实例1.2对照看一下就能明白了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值