字符串( String )
总结: 在 Java 中, String 是处理字符串的核心类,位于 java.lang 包下,具有不可变性、丰富的操作方法等特性,在字符串处理场景中被广泛使用。
1. 不可变性
String 对象一旦创建,其内容(字符序列)就不可被修改。当对 String 进行拼接、替换等操作时,实际上是创建了一个新的 String 对象,而原对象的内容保持不变。这种不可变性带来了一些优势:
- 线程安全:多个线程可以共享同一个 String 对象,无需额外的同步措施,因为不会有线程对其内容进行修改,避免了线程安全问题。
- 字符串常量池优化:字符串常量池可以存储字符串常量,当需要使用相同内容的字符串时,可以直接从常量池获取,避免了重复创建字符串对象,节省了内存空间。
- 哈希值缓存:字符串的哈希值在创建时就可以计算并缓存起来,因为字符串内容不会改变,所以在需要多次使用哈希值(如在 HashMap 等集合中作为键)时,不需要重复计算,提高了效率。
2. 创建方式
- 直接赋值: String str = "abc"; ,此时 str 指向字符串常量池中的 "abc" 对象。
- 通过 new 关键字创建: String str = new String("abc"); ,会在堆内存中新建一个 String 对象,该对象的内容是 "abc" 。
3. 常用方法
- 获取长度: int length() ,返回字符串的长度。
- 获取字符: char charAt(int index) ,返回字符串中指定索引位置的字符。
- 字符串拼接:
- 使用 + 运算符: String str = "a" + "b"; ,但由于 String 的不可变性,频繁使用 + 进行拼接会产生大量中间对象,性能较差,推荐在频繁拼接时使用 StringBuilder (单线程)或StringBuffer(多线程)
使用 concat(String str) 方法: String str1 = "a"; String str2 = str1.concat("b"); ,返回拼接后的新字符串。
字符串查找:
- int indexOf(String str) :返回子字符串在原字符串中第一次出现的索引,若不存在则返回 -1 。
- int lastIndexOf(String str) :返回子字符串在原字符串中最后一次出现的索引,若不存在则返回1 。
字符串截取: String substring(int beginIndex, int endIndex) ,返回从 beginIndex 到 endIndex 1 索引位置的子字符串。
字符串替换: String replace(CharSequence target, CharSequence replacement) ,将原字符串中所有的 target 子字符串替换为 replacement 子字符串,返回新的字符串。
字符串分割: String[] split(String regex) ,根据正则表达式 regex 将原字符串分割为字符串数组。
字符串转换:
- 转大写: String toUpperCase() 。
- 转小写: String toLowerCase() 。
- 去前后空格: String trim() 。
- 判断方法:
- boolean equals(Object anObject) :比较字符串内容是否相等(重写了 Object 类的 equals 方法)。
- boolean equalsIgnoreCase(String anotherString) :忽略大小写比较字符串内容是否相等。
- boolean startsWith(String prefix) :判断字符串是否以指定前缀开头。
- boolean endsWith(String suffix) :判断字符串是否以指定后缀结尾。
4. 与其他类的配合
与 StringBuilder / StringBuffer 配合:当需要频繁修改字符串(如大量拼接、插入、删除操作)时,使用 StringBuilder (单线程,效率高)或 StringBuffer (多线程,线程安全),操作完成后可通过 toString() 方法转换为 String 。
- 与包装类配合: String 提供了 valueOf 方法,可将基本类型或包装类对象转换为字符串;包装类也提供了 parseXxx 方法(如 Integer.parseInt(String s) ),可将字符串转换为基本类型。
5. 字符串常量池
字符串常量池是 Java 为了优化字符串存储而设计的一个内存区域。当使用直接赋值方式创建字符串时,会先检查常量池中是否存在该字符串,若存在则直接引用;若不存在则创建该字符串并放入常量池。通过 intern() 方法也可以将字符串对象放入常量池(若常量池不存在该字符串)。
1万+

被折叠的 条评论
为什么被折叠?



