跳过正文
  1. 文章/
  2. Java/
  3. 常用API/
  4. JDK原生/

4、String

·1980 字·4 分钟· loading · loading · ·
Java 常用API JDK原生
GradyYoung
作者
GradyYoung
JDK原生 - 点击查看当前系列文章
§ 4、String 「 当前文章 」

java.lang.String
#

概述
#

  • String:字符串,使用一对""引起来表示。

  • String声明为final的,不可被继承

  • String实现了Serializable接口:表示字符串是支持序列化的。

  • 实现了Comparable接口:表示String可以比较大小

  • String内部定义了final char[] value用于存储字符串数据

  • 通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。

  • 字符串常量池中是不会存储相同内容(使用String类的equals()比较,返回true)的字符串的。

常用方法
#

  • int length():返回字符串字符长度return value.length
  • char charAt(int index):返回索引处字符return value[index]
  • boolean isEmpty():判断是否为空字符串return value.length == 0
  • String 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第一次出现在字符串的开始位置索引,不存在返回-1
  • int indexOf(String str, int fromIndex):从fromIndex开始搜索str,并返回第一次出现的开始位置索引,不存在返回-1
  • int lastIndexOf(Str):反向搜索,返回str第一次出现在字符串的开始位置索引,不存在返回-1
  • int lastIndexOf(String str, int fromIndex):从fromIndex开始反向搜索str,并返回第一次出现的开始位置索引,不存在返回-1
  • String 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):返回字符串是否匹配正则表达式regex
  • String[] 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"对象,所以s1s2的地址信息一样。

二、通过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"

image-20230524175656477

两个字符串类型对象连接,如果在编译期,可以就确定值的情况下,那么连接的结果会放入字符串常量池;只要有一个是变量,连接的结果不会进入字符串常量池。

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()
JDK原生 - 点击查看当前系列文章
§ 4、String 「 当前文章 」