String概述
String被声明为 final,代表的是字符串常量,因此它不可被继承。每个用双引号括起来的字符串都是 String类的一个实例
String e = "hello";
Java 8 中,String 内部使⽤ char 数组存储数据。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
而在 Java 9 之后,String 类的实现改⽤ byte 数组存储字符串,同时使⽤ coder 来标识使⽤了哪种编 码
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final byte[] value;
/** The identifier of the encoding used to encode the bytes in {@code
value}. */
private final byte coder;
value 数组被声明为 final,这意味着 value 数组初始化之后就不能再引⽤其它数组。并且 String 内部没 有改变 value 数组的⽅法,因此可以保证 String 不可变。
创建字符串
String s1 = "Runoob"; // String 直接创建
String s2 = "Runoob"; // String 直接创建
String s3 = s1; // 相同引用
String s4 = new String("Runoob"); // String 对象创建
String s5 = new String("Runoob"); // String 对象创建
String str = “hello word” //直接引用常量区
String str = new String(“hello world”) //在堆内存创建对象
new String("hello world") 使⽤这种⽅式⼀共会创建两个字符串对象(前提是常量池中没有此对象)
String s = "hello word" 和 String s = new String("hello word") 区别?
两个语句都会先去字符串常量池中检查是否已经存在 “hello word”,如果有则直接使用,如果没有则会在常量池中创建 “hello word” 对象。另外,String s = new String("hello word") 还会通过 new String() 在堆里创建一个内容与 "xyz" 相同的对象实例。
String常用方法
boolean equals(Object obj):比较字符串的内容是否相同
boolean equalsIgnoreCase(String str): 比较字符串的内容是否相同,忽略大小写
boolean startsWith(String str): 判断字符串对象是否以指定的str开头
int length():获取字符串的长度,其实也就是字符个数
char charAt(int index):获取指定索引处的字符
int indexOf(String str):获取str在字符串对象中第一次出现的索引
String substring(int start):从start开始截取字符串
String substring(int start,int end):从start开始,到end结束截取字符串。前闭后开
Java String API文档
更多详情,请参考参看 Java String API 文档: