整理好了!2024年最常见 100 道 Java基础面试题(二十六)

上一篇地址:整理好了!2024年最常见 100 道 Java基础面试题(二十五)-CSDN博客

五十一、String 类的常用方法都有那些?

String 类在 Java 中是一个非常强大和常用的类,提供了多种方法来操作字符串。以下是一些 String 类的常用方法:

  1. length() - 返回字符串的长度。

  2. charAt(int index) - 返回指定索引处的字符。

  3. substring(int beginIndex) - 返回一个新字符串,它是原字符串从指定位置开始的子串。

  4. substring(int beginIndex, int endIndex) - 返回一个新字符串,它是原字符串从 beginIndexendIndex - 1 的子串。

  5. equals(Object another) - 检查字符串是否与另一个对象相等。

  6. equalsIgnoreCase(String another) - 检查字符串是否与另一个字符串相等,忽略大小写。

  7. startsWith(String prefix) - 检查字符串是否以指定的前缀开始。

  8. endsWith(String suffix) - 检查字符串是否以指定的后缀结束。

  9. contains(CharSequence s) - 检查字符串是否包含指定的字符序列。

  10. indexOf(int ch) - 返回指定字符在字符串中第一次出现的索引。

  11. indexOf(String str) - 返回指定字符串在原字符串中第一次出现的索引。

  12. lastIndexOf(int ch) - 返回指定字符在字符串中最后一次出现的索引。

  13. concat(String str) - 将指定字符串连接到原字符串的结尾。

  14. replace(char oldChar, char newChar) - 返回一个新的字符串,其中所有出现的 oldChar 都被 newChar 替换。

  15. replaceAll(String regex, String replacement) - 使用给定的 replacement 替换字符串中所有匹配 regex 的子串。

  16. replaceFirst(String regex, String replacement) - 使用给定的 replacement 替换字符串中第一个匹配 regex 的子串。

  17. toLowerCase() - 将字符串转换为小写。

  18. toUpperCase() - 将字符串转换为大写。

  19. trim() - 返回一个新字符串,移除原字符串两端的空白字符。

  20. split(String regex) - 根据匹配给定的正则表达式 regex 来拆分字符串。

  21. valueOf(Object obj) - 返回一个字符串,表示 obj 的字符串表示形式。

  22. toString() - 返回字符串本身(String 类重写了 Object 类的 toString() 方法)。

示例

String str = "Hello, World!";
int length = str.length(); // 13
String sub = str.substring(0, 5); // "Hello,"
boolean startsWithH = str.startsWith("Hello"); // true
boolean containsWorld = str.contains("World"); // true
String lower = str.toLowerCase(); // "hello, world!"
String upper = str.toUpperCase(); // "HELLO, WORLD!"
String replaced = str.replace("World", "Java"); // "Hello, Java!"

注意事项

  • String 类中的很多方法都返回新的 String 对象,因为 String 对象是不可变的。
  • 字符串操作可能会导致性能问题,尤其是在处理大量数据时,应该注意字符串操作的性能影响。

总结

String 类提供了丰富的方法来处理字符串,这些方法可以用于字符串的比较、查找、替换、转换大小写、拆分和连接等操作。了解这些常用方法对于日常的字符串处理任务非常重要。

五十二、String 的底层实现是怎样的?

在Java中,String对象的底层实现历经了多个版本的变迁,但主要是基于字符数组或类似数组的结构来存储字符串数据。以下是String对象底层实现的一些关键点:

1. 不可变性

String对象在Java中是不可变的(Immutable)。这意味着一旦一个String对象被创建,它的内容就不能被改变。任何修改操作都会产生一个新的String对象。

2. 字符数组

在Java 8及以前的版本中,String类的内部通常使用一个char数组来存储字符串数据:

public final class String {
    private final char value[];
    // ... 其他代码
}

这里的value[]是一个字符数组,用于存储字符串的字符序列。

3. 压缩的String(Java 9+)

从Java 9开始,为了节省内存,String类的实现采用了一种新的存储结构。如果字符串只包含拉丁字符(如ASCII),则底层结构会使用byte数组加上一个表示每个字节编码多少个字符的标志位(coder)。对于包含非拉丁字符的字符串,仍然使用char数组。

public final class String {
    private final byte[] value;
    private final byte coder;
    // ... 其他代码
}

在这个结构中,coder的值可以是:

  • LATIN1:表示value是一个Latin-1 (ISO-8859-1) 编码的字节数组。
  • UTF16:表示value是一个标准的char数组。

4. 字符串常量池

在Java中,字符串常量会被存储在字符串常量池中。字符串常量池是一个特殊的存储区域,用于存储在程序中多次出现的字符串字面量,以节省内存。

5. 字符串的创建

当通过字符串字面量或String构造函数创建字符串时,Java虚拟机会首先检查字符串常量池中是否已经存在一个相同的字符串对象。如果存在,就会返回那个对象的引用;如果不存在,就会在常量池中创建一个新的String对象。

示例

String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2); // 输出 true,因为它们引用常量池中的同一个对象

注意事项

  • 由于String的不可变性,频繁修改字符串(如在循环中拼接字符串)可能会导致性能问题和内存浪费。在这种情况下,推荐使用StringBuilderStringBuffer
  • 字符串的不可变性也意味着它是线程安全的,不需要额外的同步措施就可以在多线程环境中使用。

总结

String类的底层实现细节随着Java版本的更新而有所变化,但其核心概念保持不变。理解String的不可变性、存储结构和字符串常量池对于编写高效的Java程序非常重要。

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值