java.lang.String #
概述 #
-
String:字符串,使用一对
""引起来表示。 -
String声明为
final的,不可被继承 -
String实现了
Serializable接口:表示字符串是支持序列化的。 -
实现了
Comparable接口:表示String可以比较大小 -
String内部定义了
final char[] value用于存储字符串数据 -
通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
-
字符串常量池中是不会存储相同内容(使用String类的
equals()比较,返回true)的字符串的。
常用方法 #
int length():返回字符串字符长度return value.lengthchar charAt(int index):返回索引处字符return value[index]boolean isEmpty():判断是否为空字符串return value.length == 0String toLowerCase():使用默认语言环境,将String中所有字符转小写String toUpperCase():使用默认语言环境,将String中所有字符转大写String trim():清空字符串前后,Unicode编码小于等于\u0020的字符并返回,例如回车、换行、制表、空格等boolean equals(Object obj):比较两个字符串内容是否相同boolean equalsIgnoreCase(String str):忽略大小写比较两个字符串是否相等String concat(String str):连接字符串,等价于+int compareTo(String str):比较字符串大小String substring(int begin):从begin处开始截取到最后一个字符,并返回String substring(int begin,int end):从begin处开始截取到end(不包含),并返回boolean endsWith(String suffix):判断字符串是否以suffix结束boolean startsWith(String prefix):判断字符串是否以prefix开始boolean startsWith(String prefix, int toffset):判断字符串从toffset开始是否以prefix开始boolean contains(CharSequence s):判断字符串是否包含指定char值序列int indexOf(String str):返回str第一次出现在字符串的开始位置索引,不存在返回-1int indexOf(String str, int fromIndex):从fromIndex开始搜索str,并返回第一次出现的开始位置索引,不存在返回-1int lastIndexOf(Str):反向搜索,返回str第一次出现在字符串的开始位置索引,不存在返回-1int lastIndexOf(String str, int fromIndex):从fromIndex开始反向搜索str,并返回第一次出现的开始位置索引,不存在返回-1String replace(char oldChar,char newChar):批量替换字符串中所有的字符oldChar为newChar,并返回新字符串String replace(CharSequence oldChar,CharSequence newChar):批量替换字符串中所有的字符序列oldChar为newChar,并返回新字符串String replaceAll(String regex,String newStr):批量替换字符串中所有匹配正则表达式regex的字符串为newStr,并返回新字符串String replaceFirst(String regex,String newStr):替换字符串中第一个匹配正则表达式regex的字符串为newStr,并返回新字符串boolean matches(String regex):返回字符串是否匹配正则表达式regexString[] split(String regex):按照给定正则表达式匹配拆分字符串String[] split(String regex, int limit):按照给定正则表达式匹配拆分字符串,如果拆分大于limit,剩下的就全放到最后一个字符串
String类两种赋值方法的区别 #
一、通过字面量定义的方式=赋值
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);
输出
true
=赋值,会将"abc"存入字符串常量池中,由于字符串常量池内不会存放重复的字符串,在常量池中指向同一个"abc"对象,所以s1和s2的地址信息一样。
二、通过new + 构造器的方式
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);
输出
false
此类赋值方法,s1和s2指向堆空间中的不同的String类型的对象,而这两个不同的String类型对象的char[],指向常量池中的同一个“abc”对象,所以,s1和s2的地址信息不一样。
String s = new String("abc");方式创建对象,在内存中创建了几个空间?- 两个,一个是堆空间中
char[],另一个是char[]对应的常量池中的数据:"abc"
- 两个,一个是堆空间中
两个字符串类型对象连接,如果在编译期,可以就确定值的情况下,那么连接的结果会放入字符串常量池;只要有一个是变量,连接的结果不会进入字符串常量池。
StringBuffer、StringBuilder类 #
三者的对比 #
- String : 不可变的字符序列;底层使用
char[]存储 - StringBuffer : 可变的字符序列;线程安全的,效率低;底层使用
char[]存储 - StringBuilder : 可变的字符序列;jdk5.0新增的,线程不安全,效率高;底层使用
char[]存储
三者的执行效率对比 #
从高到低排列:StringBuilder > StringBuffer > String
常用方法(StringBuffer、StringBuilder) #
- 增:
append(xxx) - 删:
delete(int start,int end) - 改:
setCharAt(int n,char ch) / replace(int start,int end,String str) - 查:
charAt(int n ) - 插:
insert(int offset , xxx) - 长度:
length() - 缓冲区长度:
capacity() - 遍历:
for() + charAt() / toString()