String的构造方式
- 通过字面量定义
String s1="hello world"
; - 通过new 关键字调用构造方法定义
String s2=new String("hello world"); s1!=s2
String具有不可变型,因此需注意:
- 常量与常量拼接的结果在常量池中,且常量池中不会存放相同内容的常量
- 定义一个字符串时,只要右边有一个是变量(如果用final修饰,则它就是常量,放在常量池中),则该字符串结果在堆中,例如:
String s3=s1+s2;
- 如果拼接时调用intern()方法,则返回值在常量池中。用f
String 常见方法
方法 | 返回值 | 功能描述 |
---|---|---|
length() | int | 返回字符串长度 |
charAt(int index) | char | 返回某索引处的字符 |
isEmpty() | boolean | 判断是否为空字符 |
toLowCase() | String | 将所有字母转换为小写 |
toUpperCase() | String | 将所有字母转换为大写 |
trim() | String | 返回字符串副本,忽略前部和尾部空白 |
equals(Object obj) | boolean | 判断两字符串内容是否相等 |
equalsIgnoreCase(String str) | boolean | 忽略大小写,判断两字符串内容是否相等 |
contact(String str) | String | 连接字符串,作用类似:’+’ |
compareTo(String str) | int | 比较两个字符串的大小(ACILL值) |
---|---|---|
substring(int beginindex) | String | 截取从beginindex开始到最后的字符串 |
substring(int beginindex,int endindex) | String | 截取字符串;左闭右开 |
startsWith(String str) | boolean | 判断字符串是否以str为前缀 |
endsWith(String str) | boolean | 判断字符串是否以str为后缀 |
startsWith(String str,int index) | boolean | 判断从index开始的字符串是否以str为前缀 |
contains(String str) | boolean | 判断字符串是否包含str |
indexOf(String str) | int | 返回str第一次出现的索引 |
intdexOf(String str,int index) | int | 返回从index开始的子字符串第一次出现str的索引 |
lastindexOf(String str) | int | str最后一次出现的索引 |
lastindexOf(String str,int index) | int | 从index开始往前,str第一次出现的索引 |
replace(char old,char new) | String | 将所有的old字符换为new |
replace(String old,String new) | String | 将所有old字符串换为new字符串 |
split(String str) | String[] | 以str作为分隔,分割出多个数组元素 |
toCharArray() | char[] | 以每一个字符看做字符数组的元素 |
上述方法有的参数是正则表达式的都写成String了
String与char[]型数组进行转换
- String --> char[] :调用String的toCharArray()方法
- char[] --> String: 调用String构造器
String str=new String(str);
String与byte[]型数组进行转换
- String --> byte[]:编码(由看得懂的转换为看不懂的底层),调用getBytes()方法 出现乱码与默认的编码集和你使用的编码集有关,常见的两个编码集有:utf-8 gbk
- byte[] -->String :解码(由看不懂的转换为看得懂的),调用构造器(可以选择你需要的编码集)
String StringBuffer StringBuilder
-
String:不可变字符序列,底层用char[]储存
-
StringBuffer:可变字符序列,线程安全,效率低,底层用char[]储存
-
StringBuilder:可变字符序列,jdk5.0新增,线程不安全,效率高,底层用char[]储存
(三者效率从高到低:StringBuilder>StringBuffer>String)
源码分析:
-
String str=new String() //char[] value=new char[0]
-
String str=new String(“abc”) //char[] value=new char[3]{‘a’,‘b’,‘c’};
-
StringBuffer sb1=new StringBuffer() //char[] value=new char[16] 底层创建了一个长度为16的char型数组
-
StringBuffer sb2=new StringBuffer(“abc”) //char value=new char[sb2.length()+16] 创建了一个长度为19的char型数组
(注意一个问题:就是数组的长度和数组容量的区别 )
扩容问题:如果用append()方法添加的字符串长度大于16 ,则会创建一个新数组(地址没变),数组长度为(旧数组长度*2+2),
如果还是不够,就直接以加完后的数组做长度(地址未变) 旧数组长度是内容长度+16
用append()方法添加字符
StringBuffer常用方法
- 增:append(***)
- 删:delete(int start,int end) 左闭右开删除字符串
- 改:replace(int start,int end,String str) 用字符串代替某一段 setCharAt(int n,char ch) 代替某个位置的字符
- 查:charAt(int n) 查看n处的字符
- 插:insert(int n,**) 在n处插入内容,其他位置不变
- 长度:length()
- 反转:reverse()
- 遍历 for+charAt()