9 java常用类
9.1 字符串相关的类
9.1.1 String类
9.1.2 String的概述和String的不可变性
String:字符串,使用一对" "引起来表示。
①String声明为final的,不可被继承
②String实现了Serializable接口:表示字符串是支持序列化的。
实现了Comparable接口:表示String可以比较大小。
③String内部定义了final char[] value用于存储字符串数据(JDK 9及以后是 byte[] value)
④String:代表不可变的字符串序列。简称:不可变性。
体现:对字符串重新赋值;对字符串进行连接操作;调用字符串的replace() 等方式修改字符串时,需重新指定内存区域赋值,不会使用原有的value进行赋值。
⑤通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串声明在常量池中。
⑥字符串常量池中不会储存相同内容的字符串。
java
public final class String implements Serializable, Comparable<String>, CharSequence, Constable, ConstantDesc {
// Java 8 及之前(String.java)
private final char[] value;
// Java 9 及之后(String.java)
private final byte[] value;
private int hash;
java
public class MyString {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
// true,a和b都"abc",内存地址指向常量池中的同一个
System.out.println(a == b);
// 405662939;405662939 ,a和b的HashCode是一样的
System.out.println(System.identityHashCode(a) + ";" + (System.identityHashCode(b)));
a = a.replace("a", "b");
// a = bbc; b = abc,原来指向a的内存地址不变,会重新指定一个内存地址给a
System.out.println("a = " + a + "; b = " + b);
// 987405879;405662939 ,a和b的HashCode不一样,b还是原来的HashCode,a换了一个新的HashCode
System.out.println(System.identityHashCode(a) + ";" + (System.identityHashCode(b)));
}
}
9.1.3 String不同实例化方式对比
方式一:通过字面量定义的方法(声明在常量池中)
方式二:通过new+构造器的方式(定义在堆空间中)