# String 类
String
是 Java
中非常常用的一个类,它代表了一个字符串对象。在 Java
中,字符串是不可变的,也就是说,一旦一个字符串对象被创建,它的值就不能被改变。因此,每次对字符串进行修改,都会创建一个新的字符串对象。
# String 类为什么是不可变的?
String 类的不可变特性指的是 String 实例的值一旦被创建就不能被修改。这意味着对一个 String 对象进行操作时,如果需要修改其值,实际上是创建了一个新的 String 对象,并将新对象的引用赋给原对象。这种特性有助于提高程序的性能和安全性。
从源码层面来看,String 类中的不可变特性是通过使用 final 关键字和 private 修饰符来实现的。String 类中的每个方法都不会修改原有的 String 对象,而是返回一个新的 String 对象,以保持原有的 String 对象的不可变性。
例如,String 类中的 concat
方法可以将两个字符串连接起来,返回一个新的 String 对象,而不会修改原有的字符串:
| String str1 = "Hello"; |
| String str2 = "World"; |
| String str3 = str1.concat(str2); |
另外,String 类还有一种常用的创建方式,即使用字符串字面值创建对象。这种方式在 Java 虚拟机中被优化,称为字符串常量池(String Pool)。当使用字符串字面值创建一个 String 对象时,Java 虚拟机会首先在字符串常量池中查找是否已存在该值的字符串对象,如果存在则返回该对象的引用,否则创建一个新的 String 对象并加入字符串常量池。例如:
| String str1 = "Hello"; |
| String str2 = "Hello"; |
| String str3 = new String("Hello"); |
由于 String 的不可变特性和字符串常量池的存在,可以安全地共享字符串对象,从而提高程序的性能和安全性。
# String 类有很多实用的方法,例如:
length()
:获取字符串的长度。charAt(int index)
:获取指定索引位置的字符。substring(int beginIndex, int endIndex)
:获取指定索引范围内的子字符串。concat(String str)
:将指定字符串连接到此字符串的末尾。indexOf(String str)
:返回指定子字符串第一次出现的索引。equals(Object anObject)
:将此字符串与指定对象进行比较。toUpperCase()
:将字符串中的所有字符转换为大写。toLowerCase()
:将字符串中的所有字符转换为小写。- ...
以下是 String 类的常用方法的例子:
length()
方法:获取字符串的长度。
| String str = "Hello World!"; |
| int length = str.length(); |
charAt(int index)
方法:获取指定位置的字符。
| String str = "Hello World!"; |
| char c = str.charAt(1); |
substring(int beginIndex, int endIndex)
方法:获取指定位置范围内的子字符串。
| String str = "Hello World!"; |
| String subStr = str.substring(0, 5); |
indexOf(String str)
方法:获取指定字符串在该字符串中第一次出现的位置。
| String str = "Hello World!"; |
| int index = str.indexOf("World"); |
lastIndexOf(String str)
方法:获取指定字符串在该字符串中最后一次出现的位置。
| String str = "Hello World!"; |
| int index = str.lastIndexOf("l"); |
equals(Object obj)
方法:比较字符串是否相等。
| String str1 = "Hello"; |
| String str2 = "Hello"; |
| boolean isEqual = str1.equals(str2); |
startsWith(String prefix)
方法:判断字符串是否以指定字符串开头。
| String str = "Hello World!"; |
| boolean startsWith = str.startsWith("Hello"); |
endsWith(String suffix)
方法:判断字符串是否以指定字符串结尾。
| String str = "Hello World!"; |
| boolean endsWith = str.endsWith("World!"); |
replace(char oldChar, char newChar)
方法:用指定字符替换字符串中的所有指定字符。
| String str = "Hello World!"; |
| String newStr = str.replace('o', '*'); |
toLowerCase()
方法和 toUpperCase()
方法:将字符串转换为小写或大写。
| String str = "Hello World!"; |
| String lowerCaseStr = str.toLowerCase(); |
| String upperCaseStr = str.toUpperCase(); |
# String 类其他特性
String
类还支持字符串拼接操作。在 Java 5
之前,通常使用字符串拼接操作符 +
来实现字符串拼接,例如:
| String str = "Hello" + " " + "world!"; |
在 Java 5
及之后的版本中,还引入了 StringBuilder
和 StringBuffer
两个类来优化字符串拼接操作。这两个类可以动态地添加、修改和删除字符串中的字符,并且能够避免频繁创建新的字符串对象。例如:
| StringBuilder sb = new StringBuilder(); |
| sb.append("Hello"); |
| sb.append(" "); |
| sb.append("world!"); |
| String str = sb.toString(); |
当需要在多线程环境下使用字符串拼接操作时,应该使用 StringBuffer
类。如果在单线程环境下使用字符串拼接操作,或者需要更高的性能,应该使用 StringBuilder
类。
总之, String
类是 Java
中非常常用的一个类,它不仅支持字符串的基本操作,还提供了丰富的字符串处理方法,对于 Java
程序开发来说是一个必不可少的类。