说明
不可被继承
是可序列化的,实现Serialzable的对象就可以通过网络或本地流进行数据传输
实现了Compareable,实现了Compareable的对象可以进行比较
底层实现
类内部声明属性value
jdk8中:
private final char value[];// 存储字符串数据的容器,一旦初始化,其地址就不可变
jdk9之后:
private final byte value[];// 存储字符串数据的容器,一旦初始化,其地址就不可变
官方变化原因:因为字符串大多数都是Latin-1,存储时使用byte能比char节省一个字节;对于汉字这种还是使用两个字节保存
字符串常量存储的位置
字符串常量都存储在字符串常量池中
字符串常量池不允许存放两个相同的字符串常量
字符串常量池,在不同的jdk版本中存放位置不同
jdk7前存储在方法区
jdk7及之后,存放在堆空间
因为堆空间是GC的主要场所,方法区一般很少去GC
不可变特性
当字符串变量重新赋值时,需要重新指定一个字符串常量的内存位置进行赋值,不能在原有的位置修改
当前对现有的字符串进行拼接/replace()操作时,需要重新开辟空间保存拼接/replace()后的字符串,不能在原有的位置修改,这时拼接后的字符串放在堆空间中,而不是字符串常量池
实例化
字面量的定义方式
String s1 = "hello";
new对象的方式
String s2 = new String("hello");
内存解析:new 对象的方式在空间会创建了几个对象?
在堆空间中创建一个对象,对象的值地址指向字符串常量池中创建的字面量
内存解析:字符串处理时存在内存的保存位置
字符串常量+变量/变量+变量时,底层实现是以StringBuilder实现的
字符串常量+常量 的结果仍然存储在字符串常量池中
字符串常量+变量/变量+变量 的结果会通过new的方式在堆空间中创建一个新的对象,地址指向字符串常量池中的字面量
常量可能是字面量,也可能是final修饰的常量
concat()方法:不管是常量还是变量调用,同样不管参数是常量还是变量,都会返回一个新new的对象
构造器
// 创建一个空字符序列
String()
// 新建一个与参数相同的字符序列
String(String original
// 通过参数中的字符数组来构造新的String
String(char[] value)
// 通过字符数组的一部分来构造新的String
String(char[] value, int offset, int count)
// 通过使用平台的**默认字符集**解码当前参数中的字节数组老构造新的String
String(byte[] bytes)
// 通过使用指定的字符集解码当前参数中的字节数组老构造新的String
String(byte[] bytes, String charsetName)
String与char[]的转换
String str = "hello";
char[] strChar = str.toCharArray();
String str1 = new String(strChar);
String与byte[]的转换
String str = "hello";
byte[] strByte = str.getBytes(); // 使用默认字符集
String str1 = new String(strByte);
byte[] strByte1 = str.getBytes("gbk"); // 使用指定字符集
String str2 = new String(strByte1, "gbk");
常见方法
// 判断字符串是否为空
boolean isEmpty()
// 返回字符串的长度
int length()
// 拼接
String concat(xx)
// 比较字符串是否想等,区分大小写
boolean equals(Object obj)
// 比较字符串是否想等,忽略大小写
boolean equalsIgnoreCase(Object obj)
// 比较字符串大小,区分大小写,按照unicode编码值比较大小;正数代表比较值大,负数代表被比较值大,0代表两个字符串相等
int compareTo(String str)
// 比较字符串大小,不区分大小写
int compareToIgnoreCase(String str)
// 将字符串中大写字母转换为小写
String toLowerCase()
// 将字符串中小写字母转换为大写
String toUpperCase()
// 去掉字符串前后的空白符
String trim()
// 结果在常量池中共享
String intern()
// 是否包含xx
boolean contains(xx)
// 从前往后找当前字符串中xx,如果有返回第一次出现的下标,要是没有返回-1
int indexOf(xx)
// 返回指定字符串在此字符串中第一次出现处的索引,从指定的索引开始
int indexOf(String string, int fromIndex)
// 从后往前找当前字符串中xx,如果有返回第一次出现的下标,要是没有返回-1
int lastIndexOf(xx)
// 返回指定字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
int lastIndexOf(String str, int fromIndex)
// 返回一个新字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串
String subString(int beginInedx)
// 返回一个新字符串,它是此字符串的从beginIndex开始截取到endIdnex(不包含)的一个子字符串
String subString(int beginInedx, int endIndex)
// 返回index位置的字符串
char charAt(index)
// 将此字符串转换为一个新的字符数组返回
char[] toCharArray()
// 返回指定数组中表示该字符序列的String
static String valueOf(char[] data)
// 返回指定数组中表示该字符序列的String
static String valueOf(char[] data, int offset, int count)
// 返回指定数组中表示该字符序列的String
static String copyValueOf(char[] data)
// 返回指定数组中表示该字符序列的String
static String copyValueOf(char[] data, int offset, int count)
// 测试此字符串是否以指定的前缀开始
boolean startsWith(xx)
// 测试此字符串从指定索引开始的子字符串是否以指定的前缀开始
boolean startsWith(String prefix, int toffset)
// 测试此字符串是否以指定的后缀结束
boolean endsWith(xx)
// 返回一个新的字符串,通过用newChar替换此字符串中出现的所有oldChar得到的,不支持正则
String replace(char oldChar, char newChar)
// 使用指定的字面量值替换序列,替换此字符串所有匹配字面值目标序列的子字符串
String replace(CharSequence target, CharSequence replacement)
// 使用指定的replacement替换此字符串所有匹配给定的正则表达式的子字符串
String replaceAll(String regex, String replacement)
// 使用指定的replacement替换此字符串匹配给定的正则表达式的第一个子字符串
String replaceFirst(String regex, String replacement)