共同学习Java源码--常用数据类型--String(二)

    private static void checkBounds(byte[] bytes, int offset, int length) {

        if (length < 0)

            throw new StringIndexOutOfBoundsException(length);

        if (offset < 0)

            throw new StringIndexOutOfBoundsException(offset);

        if (offset > bytes.length - length)

            throw new StringIndexOutOfBoundsException(offset + length);

}

这个方法是检验byte数组是否越界的方法。如果length小于0、开始位offset小于0或开始位offset+长度length大于byte数组的长度,则抛出异常。

 

 

    public 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);

    }

 

这个构造方法有四个参数。前三个无需多言,最后一个是编码名称,类似UTF-8之类的。这个方法的意义是通过输入一个byte数组以及数组起始位和要解码的数组元素长度以及编码名称来对byte数组的指定元素进行解码,并将解码后的引用赋给value。

    public String(byte bytes[], int offset, int length, Charset charset) {

        if (charset == null)

            throw new NullPointerException("charset");

        checkBounds(bytes, offset, length);

        this.value =  StringCoding.decode(charset, bytes, offset, length);

    }

这个构造方法和上面的类似,只是最后一个参数不是String类型的编码名称,而是封装了的编码对象,方法原理类似。

    public String(byte bytes[], String charsetName)

            throws UnsupportedEncodingException {

        this(bytes, 0, bytes.length, charsetName);

    }

这个方法也和上面类似,并且方法中调用了上面的方法,只是没有提供byte数组的起始位和截取长度两个参数,执行时起始位为0,截取长度为byte数组的长度,用的是String类型的编码名称作为第二个参数。

    public String(byte bytes[], Charset charset) {

        this(bytes, 0, bytes.length, charset);

    }

这个构造方法同上面类似只是第二个参数变成了编码对象。

    public String(byte bytes[], int offset, int length) {

        checkBounds(bytes, offset, length);

        this.value = StringCoding.decode(bytes, offset, length);

    }

这个构造方法参数为byte数组,数组起始位和截取长度,没有代表编码的参数,decode方法采用的是默认的编码。

    public String(byte bytes[]) {

        this(bytes, 0, bytes.length);

    }

这个构造方法调用了上面的那个构造的方法,采用0为数组起始位,截取长度为数组长度,并且采用默认的编码方式。

    public String(StringBuffer buffer) {

        synchronized(buffer) {

            this.value = Arrays.copyOf(buffer.getValue(), buffer.length());

        }

    }

这个构造方法参数为一个StringBuffer,并且给buffer对象上了同步锁,StringBuffer内部也有一个char数组的成员变量value,上锁的目的是保证value不被脏读,同时将StringBuffer的value“复制”给String的value。

    public String(StringBuilder builder) {

        this.value = Arrays.copyOf(builder.getValue(), builder.length());

    }

这个构造方法传入一个StringBuilder对象,将StringBuilder的value“复制”给String的value,但不对StringBuilder的value上锁。

    String(char[] value, boolean share) {

        // assert share : "unshared notsupported";

        this.value = value;

    }

这是最后一个构造方法,将一个char数组和一个布尔值传入,char数组传给value,布尔值变量暂时不起作用,注释也写了,不支持“unshare”,字面意思是不分享。

至此,构造方法告一段落。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值