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”,字面意思是不分享。
至此,构造方法告一段落。