目录
Java字符串类的概述和使用
不可变字符串类
String类的概念
-
java.lang.String
类用于描述字符串,该类描述的字符串内容是个常量不可更改,因此可以被共享使用。-
String str1 = "abc"; // 这条语句的作用是将"abc"的地址赋值给变量str1 // 我们可以改变str1的指向但不可改变所指向的内容。
-
-
String类由
final
关键字修饰,表示该类不能被继承。 -
从
jdk1.9
开始该类的底层不再使用char[]
来存取数据,而是改成了byte[]
加上编码标记,从而节约了一定的空间。
字符串常量池(String Pool)的概念
由于String类型描述的字符串内容是常量不可改变,因此Java虚拟机将首次出现
的字符串放入常量池中,若后续代码中出现了相同字符串内容则直接使用池中已有的字符串对象而无需申请内存以及创建对象,从而提高了性能。
为什么String类是不可变的?
- String Pool的需要
- 由于常量池的存在,使得一个字符串只有第一次出现时才会在常量池分配内存空间,后面继续创建已经存在的字符串时,会返回常量池中该字符串的引用。故如果String类是可变的,将会导致其中一个引用修改了内容时,会导致其他引用出现数据错误。
- 缓存哈希码值
- 因为String 的
hashcode
值经常被使用,例如 String 用做 HashMap 的 key。不可变的特性可以确保一个字符串所对应的hashcode
值也不发生改变,因此只需要进行一次计算,缓存该字符串所对应的hashcode
值即可,提升效率。
- 因为String 的
- 安全性
- String经常作为参数,例如在作为网络连接参数的情况下如果 String 是可变的,那么在网络连接过程中,String 被改变,改变 String 对象的那一方以为现在连接的是其它主机,而实际情况却不一定是,会带来严重的安全问题。
- 线程安全
- String 不可变性天生具备线程安全,可以在多个线程中安全地使用,而无需执行同步的需求。
常用方法
常用的构造方法
方法声明 | 功能介绍 |
---|---|
String() | 使用无参方式构造对象得到空字符序列 |
String(byte[] bytes, int offset, int length) | 使用bytes数组中下标从offset位置开始的length个字节来构造对象 |
String(byte[] bytes) | 使用bytes数组中的所有内容构造对象 |
String(char[] value, int offset, int count) | 使用value数组中下标从offset位置开始的count个字符来构造对象 |
String(char[] value) | 使用value数组中的所有内容构造对象 |
String(String original) | 根据参数指定的字符串内容来构造对象,新创建对象为参数对象的副本 |
常用的成员方法
方法声明 | 功能介绍 |
---|---|
String toString() | 返回字符串本身 |
byte[] getBytes() | 将当前字符串内容转换为byte数组并返回 |
char[] toCharArray() | 用于将当前字符串内容转换为char数组并返回 |
方法声明 | 功能介绍 |
---|---|
char charAt(int index) | 方法charAt用于返回字符串指定位置的字符。 |
int length() | 返回字符串字符序列的长度 |
boolean isEmpty() | 判断字符串是否为空 |
方法声明 | 功能介绍 |
---|---|
int compareTo(String anotherString) | 用于比较调用对象和参数对象的大小关系 |
int compareToIgnoreCase(String str) | 不考虑大小写,也就是’a’和’A’是相等的关系 |
方法声明 | 功能介绍 |
---|---|
String concat(String str) | 用于实现字符串的拼接 |
boolean contains(CharSequence s) | 用于判断当前字符串是否包含参数指定的内容 |
String toLowerCase() | 返回字符串的小写形式 |
String toUpperCase() | 返回字符串的大写形式 |
String trim() | 返回去掉前导和后继空白的字符串 |
boolean startsWith(String prefix) | 判断字符串是否以参数字符串开头 |
boolean startsWith(String prefix, int toffset) | 从指定位置开始是否以参数字符串开头 |
boolean endsWith(String suffix) | 判断字符串是否以参数字符串结尾 |
方法声明 | 功能介绍 |
---|---|
boolean equals(Object anObject) | 用于比较字符串内容是否相等并返回 |
int hashCode() | 获取调用对象的哈希码值 |
boolean equalsIgnoreCase(String anotherString) | 用于比较字符串内容是否相等并返回,不考虑大小写,如:'A’和’a’是相等 |
方法声明 | 功能介绍 |
---|---|
int indexOf(int ch) | 用于返回当前字符串中参数ch指定的字符第一次出现的下标 |
int indexOf(int ch, int fromIndex) | 用于从fromIndex位置开始查找ch指定的字符 |
int indexOf(String str) | 在字符串中检索str返回其第一次出现的位置,若找不到返回-1 |
int indexOf(Stringstr, int from Index) | 表示从字符串的fromIndex位置开始检索str第一次出现的位置 |
int lastIndexOf(int ch) | 用于返回参数ch指定的字符最后一次出现的下标 |
int lastIndexOf(int ch, int fromIndex) | 用于从fromIndex位置开始查找ch指定字符出现的下标 |
int lastIndexOf(String str) | 返回str指定字符串最后一次出现的下标 |
int lastIndexOf(Stringstr,int fromIndex) | 用于从fromIndex位置开始反向搜索的第一次出现的下标。 |
方法声明 | 功能介绍 |
---|---|
String substring(int beginIndex,int endIndex) | 返回字符串中从下标beginIndex(包括)开始到endIndex(不包括)结束的子字符串 |
String substring(int beginIndex) | 返回字符串中从下标beginIndex(包括)开始到字符串结尾的子字符串 |
可变字符串类
基本概念
- 由于String类描述的字符串内容是个常量不可改变,当需要在Java代码中描述大量类似的字符串时,只能单独申请和存储,此时会造成内存空间的浪费。
- 为了解决上述问题,可以使用
java.lang.StringBuilder
类和java.lang.StringBuffer
类来描述字符序列可以改变的字符串。 StringBuffer
类是从jdk1.0开始存在,属于线程安全的类,内部使用 synchronized 进行同步,效率比较低。StringBuilder
类是从jdk1.5开始存在,属于非线程安全的类,效率比较高。
常用方法
StringBuilder类常用的构造方法
方法声明 | 功能介绍 |
---|---|
StringBuilder() | 使用无参方式构造对象,容量为16 |
StringBuilder(int capacity) | 根据参数指定的容量来构造对象,容量为参数指定大小 |
StringBuilder(String str) | 根据参数指定的字符串来构造对象,容量为:16+字符串长度 |
StringBuilder类常用的成员方法
方法声明 | 功能介绍 |
---|---|
int capacity() | 用于返回调用对象的容量 |
int length() | 用于返回字符串的长度,也就是字符的个数 |
StringBuilder insert(int offset, String str) | 插入字符串并返回调用对象的引用,就是自己。 |
StringBuilder append(String str) | 追加字符串 |
StringBuilder deleteCharAt(int index) | 将当前字符串中下标为index位置的单个字符删除 |
StringBuilder delete(int start,int end) | 删除字符串 |
StringBuilder replace(int start,int end,String str) | 替换字符串 |
StringBuilder reverse() | 字符串反转 |
可以看到StringBuilder
的很多方法的返回值均为StringBuilder
类型。这些方法的返回语句均为:return this
。由此可见,这些方法在对StringBuilder
所封装的字符序列进行改变后又返回了该对象的引用。基于这样设计的目的在于可以连续调用。