DESKTOP-7HC873M_20200828-李宗宝
问题
1,规范化表示形式(方法)
String t = x.intern();
理解:首先判断x指向的string对象是否存在与字符串池中,如果存在则t直接指向池中的字符串,否则就在字符串池中新建一个String实例,然后t指向池中的string实例
注:
新建一个String实例时,是将x对应的String实例直接添加到字符串池中(将原有的String实例的地址复制到池中)
在创建一个字符串时,只要是双引号(“ ”)中的内容,都是存放在字符串池中
2,
String x = "疑是" ;
String y = "地上霜" ;
String s = "疑是地上霜" ;
// StringBuilder builder = new StringBuilder( x ); // 在缓冲区中存放 "疑是"
// builder.append( y ); // 在缓冲区末尾追加 "地上霜"
// String p = builder.toString(); // 将缓冲区中的内容 构造 成 String实例 (即创建新的String实例)
String p = x + y ; // 注意这里的 + 起连接作用(连接字符串)
System.out.println( s == p ); // false
String p = x + y ; // 注意这里的 + 起连接作用(连接字符串)
这里的p是new出来的变量,存放在堆中
@Override
@HotSpotIntrinsicCandidate
public String toString() {
// Create a copy, don't share the array
return isLatin1() ? StringLatin1.newString(value, 0, count)
: StringUTF16.newString(value, 0, count);
}
public static String newString(byte[] val, int index, int len) {
if (String.COMPACT_STRINGS) {
byte[] buf = compress(val, index, len);
if (buf != null) {
return new String(buf, LATIN1);
}
}
int last = index + len;
return new String(Arrays.copyOfRange(val, index << 1, last << 1), UTF16);
}
心得
稀里糊涂又是一周结束,很累,但也学到很多!!!
点赞