欢迎访问宙启技术站
智能推送

Java中字符串常见题之String相关讲解

发布时间:2023-05-18 03:43:15

在Java中,字符串是一种非常常见的数据类型。我们经常需要对字符串进行一些操作,比如拼接、比较、截取等等。今天我们就来讲解一下Java中字符串相关的一些知识点。

### 一、String类的常见方法

String是Java中的一个类,我们可以通过new关键字创建一个String对象。下面是String类中常见的方法:

- length():返回字符串的长度

- charAt(int index):返回字符串中指定位置的字符

- equals(Object anObject):将字符串与指定的对象进行比较,如果相同返回true,否则返回false

- equalsIgnoreCase(String anotherString):将字符串与另一个字符串进行比较,忽略大小写

- compareTo(String anotherString):将字符串与另一个字符串进行比较,返回一个整数,表示它们的大小关系

- indexOf(int ch):返回指定字符在字符串中 次出现的位置

- indexOf(int ch, int fromIndex):返回指定字符在字符串中从fromIndex开始 次出现的位置

- substring(int beginIndex):返回字符串从beginIndex位置开始到结尾的子串

- substring(int beginIndex, int endIndex):返回字符串从beginIndex位置开始到endIndex位置的子串

- toUpperCase():将字符串转换成大写

- toLowerCase():将字符串转换成小写

- trim():返回一个删除了前导空格和尾部空格的字符串

- split(String regex):将字符串分割成数组

### 二、StringBuilder和StringBuffer

在Java中,我们知道String对象是不可变的。如果需要修改字符串,我们通常会使用StringBuffer或StringBuilder类。StringBuffer和StringBuilder类都继承自AbstractStringBuilder类,它们的方法基本相同,但是StringBuffer是线程安全的,而StringBuilder不是。

下面是StringBuilder的一些常用方法:

- append(String str):在字符串的末尾添加指定的字符串

- insert(int offset, String str):在字符串的指定位置插入指定的字符串

- delete(int start, int end):删除字符串的指定位置

- replace(int start, int end, String str):用指定的字符串替换从start到end位置的字符

### 三、字符串的不可变性

在Java中,字符串的值是不可变的。为了理解这个概念,我们可以看下面的例子:

String str1 = "hello";
str1.concat(" world");
System.out.println(str1);

运行上面的代码,输出结果是“hello”,而不是“hello world”。这是因为concat方法返回一个新的字符串,而不是修改原始的字符串。因此,如果我们想要将“hello world”保存到str1中,可以这样写:

String str1 = "hello";
str1 = str1.concat(" world");
System.out.println(str1);

### 四、字符串的常量池

在Java中,字符串常量池是一个特殊的字符串存储区域。当我们创建一个字符串时,如果该字符串已经在字符串常量池中存在,那么它会直接从常量池中返回该字符串的引用,而不是创建一个新的字符串。这样可以减少内存消耗,提高性能。

下面是一个例子:

String str1 = "hello";
String str2 = "hello";

System.out.println(str1 == str2); // true

在上面的代码中,str1和str2都指向字符串常量池中的同一个对象。如果我们使用new关键字创建一个字符串,它将不会保存在字符串常量池中,而是在堆内存中创建一个新的对象。

String str1 = "hello";
String str2 = new String("hello");

System.out.println(str1 == str2); // false

在这个例子中,str1和str2是不同的对象,它们的引用地址也不同。因此,我们应该尽可能地避免使用new关键字创建字符串,以减少内存消耗。

### 五、字符串的性能优化

如果我们需要对一个字符串进行多次修改,应该使用StringBuilder或StringBuffer类来优化性能。这是因为String类是不可变的,每次修改都需要创建一个新的字符串对象,会浪费大量的时间和内存。

String str = "hello";
for (int i = 0; i < 10000; i++) {
    str += " world";
}

在上面的代码中,每次循环都会创建一个新的字符串对象,并且将它赋值给str变量。这样会导致性能非常低下。如果我们使用StringBuilder或StringBuffer类来优化,就可以避免这个问题。

StringBuilder sb = new StringBuilder("hello");
for (int i = 0; i < 10000; i++) {
    sb.append(" world");
}
String str = sb.toString();

在上面的代码中,我们首先使用StringBuilder类创建了一个可变的字符串对象sb,然后在循环中对其进行修改。最后,我们通过调用toString方法将其转换成不可变的字符串。这样可以大幅度提高性能。