目录
深入理解StringBuilder,StringBuffer
String
声明
public final class String
implements java.io.Serializable,
Comparable<String>,
CharSequence,
Constable, ConstantDesc
final:不可被继承
serializable:可序列化的接口,可以通过网络或者本地流进行传输
compara:可以比较大小
内部属性
jdk8中:private final char value[ ]来当存储容器
jdk9开始:private final byte value[ ]来当存储容器
private final byte coder;
通过这个属性兼容中文特殊符号等两个字节存储一个字符的情况
0代表LATIN-1,,1代表UTF-8
存储的位置
都存储在字符串常量池里(String Table),字符串常量池不能存储两个相同的字符串,jdk7之前,字符串常量池位于方法区,之后位于堆空间
String的不可变性:
1.当对字符串重新赋值时,需要重新指定一个字符串常量的位置进行赋值,不能在原有的位置上进行修改
2,当对现有的的字符串进行拼接操作时,实际上是重新开辟的新的存储空间保留了拼接之后的字符串,不是在原来的位置上进行的修改
3,在调用字符串的replace()替换现有的某个字符时,需要重新开辟新的空间保存返回的字符串,不是在原来的空间上进行的修改
String实例化的两种方法:
public class Stringtest1 {
public static void main(String[] args) {
String str1="hello";
String str2=new String("hello");
}
}
第一种栈内的str1指向堆内字符串常量池的地址,这个地址指向字符串常量池中的hello;
第二种栈内的str2指向对内但是在字符串常量池之外的地址,这个地址指向字符串常量池的hello,这个hello与str1指向的hello是同一个
String的连接操作
情况1:常量+常量,结果仍然存储在字符串常量池里,返回新的地址.
情况2:常量+变量 或 变量+常量,会通过new一个新的字符串,返回堆空间新字符串的地址
情况3:调用字符串的intern()返回的是字符串常量池的字面量的地址
情况3:concat(×××)不管是常量调用这个方法还是变量调用这个方法,也不管参数是常量还是变量,只要调用该方法,就会new一个新的对象
String的构造器
* `public String() ` :初始化新创建的 String对象,以使其表示空字符序列。 * `public String(String original)`: 初始化一个新创建的 `String` 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。 * `public String(char[] value) ` :通过当前参数中的字符数组来构造新的String。 * `public String(char[] value,int offset, int count) ` :通过字符数组的一部分来构造新的String。 * `public String(byte[] bytes) ` :通过使用平台的**默认字符集**解码当前参数中的字节数组来构造新的String。 * `public String(byte[] bytes,String charsetName) ` :通过使用指定的字符集解码当前参数中的字节数组来构造新的String。
String的常用方法
(1)boolean isEmpty():字符串是否为空 (2)int length():返回字符串的长度 (3)String concat(xx):拼接 (4)boolean equals(Object obj):比较字符串是否相等,区分大小写 (5)boolean equalsIgnoreCase(Object obj):比较字符串是否相等,不区分大小写 (6)int compareTo(String other):比较字符串大小,区分大小写,按照Unicode编码值比较大小 (7)int compareToIgnoreCase(String other):比较字符串大小,不区分大小写 (8)String toLowerCase():将字符串中大写字母转为小写 (9)String toUpperCase():将字符串中小写字母转为大写 (10)String trim():去掉字符串前后空白符 (11)public String intern():结果在常量池中共享 (11)boolean contains(xx):是否包含xx (12)int indexOf(xx):从前往后找当前字符串中xx,即如果有返回第一次出现的下标,要是没有返回-1 (13)int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始 (14)int lastIndexOf(xx):从后往前找当前字符串中xx,即如果有返回最后一次出现的下标,要是没有返回-1 (15)int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。 (16)String substring(int beginIndex) :返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。 (17)String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。 (18)char charAt(index):返回[index]位置的字符 (19)char[] toCharArray(): 将此字符串转换为一个新的字符数组返回 (20)static String valueOf(char[] data) :返回指定数组中表示该字符序列的 String (21)static String valueOf(char[] data, int offset, int count) : 返回指定数组中表示该字符序列的 String (22)static String copyValueOf(char[] data): 返回指定数组中表示该字符序列的 String (23)static String copyValueOf(char[] data, int offset, int count):返回指定数组中表示该字符序列的 String (24)boolean startsWith(xx):测试此字符串是否以指定的前缀开始 (25)boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始 (26)boolean endsWith(xx):测试此字符串是否以指定的后缀结束 (27)String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 不支持正则。 (28)String replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。 (29)String replaceAll(String regex, String replacement):使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 (30)String replaceFirst(String regex, String replacement):使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
StringBuilder,StringBuffer
> String:不可变的字符序列;底层使用char[] (jdk8及之前),底层使用byte[] (jdk9及之后) > StringBuffer:可变的字符序列;JDK1.0声明,线程安全的,效率低;底层使用char[] (jdk8及之前),底层使用byte[] (jdk9及之后) > StringBuilder:可变的字符序列;JDK5.0声明,线程不安全的,效率高;底层使用char[] (jdk8及之前),底层使用byte[] (jdk9及之后)
常用方法
因为这两个类是继承String的,所以String里的方法在这两个类里面都可以用
增: append(xx) 删: delete(int start, int end) deleteCharAt(int index) 改: replace(int start, int end, String str) setCharAt(int index, char c) 查: charAt(int index) 插: insert(int index, xx) 长度: length()
执行效率
StringBuilder>StringBuffer>String
深入理解StringBuilder,StringBuffer
这两个类底层也是用一个数组存储字符串的值,并且数组的默认长度为16,即一个空对象的长度为 16,实例化一个StringBuffer对象时,创建了一个长度为16的缓冲区,即数组的长度就会不是16了,而是实例化的对象的长度值+16,然后往里面添加数据的时候会一直往这个地址里面添加,这个不够了之后就会扩容
他的扩容方式是创建一个新的数组,数组 的长度是原数组长度×2+2,如果还是不够大就会直接扩容到需要的长度,扩容完成之后就会把原来的内容复制到新的地址,然后指针指向新的char数组