Java String的理解
2020-12-13 16:18
标签:end 编码 support ati class alt Matter bounds har 在Java中String是一个比较特殊的对象---不可继承,不可变,直接赋值创建 Sting类型是Java中最常用的一个对象,可以通过两种方式进行创建 JVM对直接赋值的String类型,会先从常量池中查询对应的String类型,如果没有则会创建一个存储到常量池中,然后返回该引用。 new关键字创建String对象 两种方式的区别 调用toString()方法 调用构造 boolean intern()方法 参考源码 Java String的理解 标签:end 编码 support ati class alt Matter bounds har 原文地址:https://www.cnblogs.com/jingwa/p/11606327.htmlJava String的理解
不可继承,不可变
public final class String
implements java.io.Serializable, Comparable
public final class String
implements java.io.Serializable, Comparable
String的创建
因为比较常用,所以 JVM对String类型进行了优化,可以对String类型直接赋值,直接将该String类型创建在常量池中,以方便引用// 直接赋值
String s = "llll";
new关键字创建的String对象的区别在于,会先在堆内存中进行初始化,然后到常量池中加载对应的String类型。返回堆内存中的地址值给引用String方法简介
构造方法
public String() {
this.value = "".value;
}
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
// 根据整个字符数组创建字符串
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
//截取部分字符数组创建字符串
public String(char value[], int offset, int count) {
if (offset >>1.
if (offset > value.length - count) {
throw new StringIndexOutOfBoundsException(offset + count);
}
this.value = Arrays.copyOfRange(value, offset, offset+count);
}
// 没有使用过。。。
public String(int[] codePoints, int offset, int count) {
if (offset >>1.
if (offset > codePoints.length - count) {
throw new StringIndexOutOfBoundsException(offset + count);
}
final int end = offset + count;
// Pass 1: Compute precise size of char[]
int n = count;
for (int i = offset; i
// 需要指定编码集,根据传递的编码集解码
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);
}
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);
}
// 根据传入的字节数组和其长度创建字符串
public String(byte bytes[], int offset, int length) {
checkBounds(bytes, offset, length);
this.value = StringCoding.decode(bytes, offset, length);
}
public String(byte bytes[]) {
this(bytes, 0, bytes.length);
}
public String(StringBuffer buffer) {
synchronized(buffer) {
this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
}
}
public String(StringBuilder builder) {
this.value = Arrays.copyOf(builder.getValue(), builder.length());
}
// 预留方法,默认访问类型,通过直接赋值创建字符串
String(char[] value, boolean share) {
// assert share : "unshared not supported";
this.value = value;
}
静态方法
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
public static String valueOf(int i) {
return Integer.toString(i);
}
public static String valueOf(long l) {
return Long.toString(l);
}
public static String valueOf(float f) {
return Float.toString(f);
}
public static String valueOf(double d) {
return Double.toString(d);
}
public static String valueOf(char data[]) {
return new String(data);
}
public static String valueOf(char data[], int offset, int count) {
return new String(data, offset, count);
}
public static String valueOf(char c) {
char data[] = {c};
return new String(data, true);
}
public static String copyValueOf(char data[], int offset, int count) {
return new String(data, offset, count);
}
public static String copyValueOf(char data[]) {
return new String(data);
}
public static String valueOf(boolean b) {
return b ? "true" : "false";
}
public static String format(String format, Object... args) {
return new Formatter().format(format, args).toString();
}
public static String format(Locale l, String format, Object... args) {
return new Formatter(l).format(format, args).toString();
}
普通方法
可以通过调用该方法指向常量池中的对象public native String intern();