# String 类

StringJava 中非常常用的一个类,它代表了一个字符串对象。在 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 对象,值为 "HelloWorld"

​ 另外,String 类还有一种常用的创建方式,即使用字符串字面值创建对象。这种方式在 Java 虚拟机中被优化,称为字符串常量池(String Pool)。当使用字符串字面值创建一个 String 对象时,Java 虚拟机会首先在字符串常量池中查找是否已存在该值的字符串对象,如果存在则返回该对象的引用,否则创建一个新的 String 对象并加入字符串常量池。例如:

String str1 = "Hello"; // 创建新的 String 对象并加入字符串常量池
String str2 = "Hello"; // 直接返回字符串常量池中的引用,与 str1 引用同一个对象
String str3 = new String("Hello"); // 创建新的 String 对象,不在字符串常量池中

​ 由于 String 的不可变特性和字符串常量池的存在,可以安全地共享字符串对象,从而提高程序的性能和安全性。

# String 类有很多实用的方法,例如:

  • length() :获取字符串的长度。
  • charAt(int index) :获取指定索引位置的字符。
  • substring(int beginIndex, int endIndex) :获取指定索引范围内的子字符串。
  • concat(String str) :将指定字符串连接到此字符串的末尾。
  • indexOf(String str) :返回指定子字符串第一次出现的索引。
  • equals(Object anObject) :将此字符串与指定对象进行比较。
  • toUpperCase() :将字符串中的所有字符转换为大写。
  • toLowerCase() :将字符串中的所有字符转换为小写。
  • ...

以下是 String 类的常用方法的例子:

  1. length() 方法:获取字符串的长度。
String str = "Hello World!";
int length = str.length(); // length = 12
  1. charAt(int index) 方法:获取指定位置的字符。
String str = "Hello World!";
char c = str.charAt(1); // c = 'e'
  1. substring(int beginIndex, int endIndex) 方法:获取指定位置范围内的子字符串。
String str = "Hello World!";
String subStr = str.substring(0, 5); // subStr = "Hello"
  1. indexOf(String str) 方法:获取指定字符串在该字符串中第一次出现的位置。
String str = "Hello World!";
int index = str.indexOf("World"); // index = 6
  1. lastIndexOf(String str) 方法:获取指定字符串在该字符串中最后一次出现的位置。
String str = "Hello World!";
int index = str.lastIndexOf("l"); // index = 9
  1. equals(Object obj) 方法:比较字符串是否相等。
String str1 = "Hello";
String str2 = "Hello";
boolean isEqual = str1.equals(str2); // isEqual = true
  1. startsWith(String prefix) 方法:判断字符串是否以指定字符串开头。
String str = "Hello World!";
boolean startsWith = str.startsWith("Hello"); // startsWith = true
  1. endsWith(String suffix) 方法:判断字符串是否以指定字符串结尾。
String str = "Hello World!";
boolean endsWith = str.endsWith("World!"); // endsWith = true
  1. replace(char oldChar, char newChar) 方法:用指定字符替换字符串中的所有指定字符。
String str = "Hello World!";
String newStr = str.replace('o', '*'); // newStr = "Hell* W*rld!"
  1. toLowerCase() 方法和 toUpperCase() 方法:将字符串转换为小写或大写。
String str = "Hello World!";
String lowerCaseStr = str.toLowerCase(); // lowerCaseStr = "hello world!"
String upperCaseStr = str.toUpperCase(); // upperCaseStr = "HELLO WORLD!"

# String 类其他特性

String 类还支持字符串拼接操作。在 Java 5 之前,通常使用字符串拼接操作符 + 来实现字符串拼接,例如:

String str = "Hello" + " " + "world!";

​ 在 Java 5 及之后的版本中,还引入了 StringBuilderStringBuffer 两个类来优化字符串拼接操作。这两个类可以动态地添加、修改和删除字符串中的字符,并且能够避免频繁创建新的字符串对象。例如:

StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("world!");
String str = sb.toString();

​ 当需要在多线程环境下使用字符串拼接操作时,应该使用 StringBuffer 类。如果在单线程环境下使用字符串拼接操作,或者需要更高的性能,应该使用 StringBuilder 类。

​ 总之, String 类是 Java 中非常常用的一个类,它不仅支持字符串的基本操作,还提供了丰富的字符串处理方法,对于 Java 程序开发来说是一个必不可少的类。

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

沉鱼 微信支付

微信支付

沉鱼 支付宝

支付宝

沉鱼 贝宝

贝宝