20201224-刘佳昊

完整更新地址

  • Github
  • Gitee
    (本仓库强制同步自Github, 建议浏览Github原版)

知识点

java.lang.String

  • java.lang.String 是 java.lang.CharSequence 接口的一个实现类
  • String 是引用类型而不是基本类型

声明

String 有两种声明方式:

  1. "..."(字面量) 存放在常量池
  2. 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

标签

评论


© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1