20201224-刘佳昊
完整更新地址
知识点
java.lang.String
- java.lang.String 是 java.lang.CharSequence 接口的一个实现类
- String 是引用类型而不是基本类型
声明
String 有两种声明方式:
- "..."(字面量) 存放在常量池
- new String(); 存放在堆中
这两种方式均会生成一个 String 实例
// 变量 str1 的值是 常量池中 "Hello" 实例的 地址
String str1 = "Hello";
System.out.println(System.identityHashCode(str1));
// 变量 str3 的值是 堆内存中 "Hello" 实例的 地址
String str2 = new String("Hello");
System.out.println(System.identityHashCode(str2));
== 运算符
变量类型 变量 赋值(=) 数据;
- 对于基本类型, 变量存储的数据是数值本身
- 对于引用类型, 变量存储的数据是地址
运算符 == 用于比较两个值是否相等,
- 对于基本类型比较数值本身是否相等,
- 对于引用类型比较地址是否相等
String类 重写了从 Object继承的 equals 方法
字符串连接
// JDK8(含) 之前使用 StringBuilder 连接字符串
12 new #11 <java/lang/StringBuilder>
16 invokespecial #12 <java/lang/StringBuilder.<init>>
20 invokevirtual #13 <java/lang/StringBuilder.append>
27 invokevirtual #14 <java/lang/StringBuilder.toString>
// JDK11 中使用 makeConcatWithConstants 连接字符串
14 invokedynamic #11 <makeConcatWithConstants, BootstrapMethods #0>
有变量参与的字符串连接操作都会返回新的 String 实例
String str10 = "Hello";
System.out.println("str10: " + System.identityHashCode(str10));
String str11 = "World";
System.out.println("str11: " + System.identityHashCode(str11));
// 有变量参与的字符串连接操作都会返回新的 String 实例
// 连接字符串在Java8(含)之前和之后不一样
// JDK8 之前使用 StringBuilder JDK11 中使用 makeConcatWithConstants
String str12 = str10 + str11;
System.out.println("str12: " + System.identityHashCode(str12));
String str13 = "Hello" + str11;
System.out.println("str13: " + System.identityHashCode(str13));
String str14 = str10 + "World";
System.out.println("str14: " + System.identityHashCode(str14));
// str12 != str13 != str14
System.out.println(str12 == str13 || str12 == str14 || str13 == str14);
当变量被 final修饰时, 此时变量与字面量相同, 变量连接与字面量连接相同, 返回相同的实例
// ldc #9 <HelloWorld>
String str00 = "HelloWorld";
System.out.println("str00: " + System.identityHashCode(str00));
// ldc #9 <HelloWorld>
String str01 = "Hello" + "World";
System.out.println("str01: " + System.identityHashCode(str01));
// true
System.out.println("str00 == str01: " + (str00 == str01));
System.out.println();
final String STR_10 = "Hello";
System.out.println("str10: " + System.identityHashCode(STR_10));
final String STR_11 = "World";
System.out.println("str11: " + System.identityHashCode(STR_11));
// ldc #9 <HelloWorld>
String str12 = STR_10 + STR_11;
System.out.println("str12: " + System.identityHashCode(str12));
// ldc #9 <HelloWorld>
String str13 = "Hello" + STR_11;
System.out.println("str13: " + System.identityHashCode(str13));
// ldc #9 <HelloWorld>
String str14 = STR_10 + "World";
System.out.println("str14: " + System.identityHashCode(str14));
// str00 == str01 == str12 == str13 ==str14
System.out.println(str00 == str12 && str12 == str13 && str12 == str14);
getChars(); & toCharArray();
// getChars(); 将字符序列中 [srcBegin, srcEnd) 的 字符复制到 dst[] 中, 从 dstBegin 开始
char[] chars1 = new char[10];
s.getChars(2, 6, chars1, 2);
System.out.println(chars1);
// toCharArray(); 将 字符序列 转换为 char[], 返回 char[]
char[] chars2 = s.toCharArray();
System.out.println(chars2);
StringJoiner
- JDK8 提供了 StringJoiner 来 操作 字符序列
- 如果需要频繁拼接字符串建议使用 StringJoiner 来实现
构造方法
创建一个被 delimiter 分割的字符串, 并在字符串开始添加 prefix , 字符串末尾添加
suffix
public StringJoiner(CharSequence delimiter);
public StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix);
merge();
- merge(); 方法用于合并两个StringJoiner实例, 返回 调用实例
// public StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix);
stringJoiner1 = new java.util.StringJoiner(", ", "< ", " >");
// add(); 用于添加字符串
stringJoiner1.add("1");
stringJoiner1.add("2");
stringJoiner1.add("3");
// toString(); 用于转换为字符串
// < 1, 2, 3 >
System.out.println(stringJoiner1.toString());
System.out.println(System.identityHashCode(stringJoiner1));
// public StringJoiner(CharSequence delimiter);
stringJoiner2 = new java.util.StringJoiner(". ");
stringJoiner2.add("4");
stringJoiner2.add("5");
stringJoiner2.add("6");
// 4. 5. 6
System.out.println(stringJoiner2.toString());
System.out.println(System.identityHashCode(stringJoiner2));
java.util.StringJoiner stringJoiner = null;
// merge(); 方法用于合并两个StringJoiner实例, 返回 调用实例
stringJoiner = stringJoiner1.merge(stringJoiner2);
// < 1, 2, 3, 4. 5. 6 >
System.out.println(stringJoiner);
// stringJoiner == stringJoiner1
System.out.println(System.identityHashCode(stringJoiner));
stringJoiner = stringJoiner2.merge(stringJoiner1);
// 4. 5. 6. 1, 2, 3
System.out.println(stringJoiner);
// stringJoiner == stringJoiner2
System.out.println(System.identityHashCode(stringJoiner));
_(:з」∠)_
- 连接字符串用的是StringBuilder不是StringBuffer
近期评论