java.lang.String
是 Java 编程语言中的一个核心类,用于表示字符串。字符串在 Java 中是不可变的,这意味着一旦创建了一个 String
对象,就不能修改它的值。每次对字符串进行修改操作时,实际上都会创建一个新的 String
对象。
String
类提供了大量的方法来处理字符串,如 substring
、concat
、replace
等。String
类本身是一个类,但在 Java 中,字符串字面量(即用双引号括起来的文本)会被自动转换为 String
对象。
字符串在 Java 中的应用非常广泛,包括但不限于:
String
对象是不可变的?原因:String
对象的不可变性是由其设计决定的。不可变性带来了线程安全性和缓存哈希值的优点,但也有一些缺点,比如每次修改都会创建新的对象,可能导致内存消耗增加。
解决方法:如果需要频繁修改字符串,可以考虑使用 StringBuilder
或 StringBuffer
类。StringBuilder
是非线程安全的,但性能更高;StringBuffer
是线程安全的,但性能稍低。
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" World");
String result = sb.toString(); // "Hello World"
String
对象的 equals
方法和 ==
操作符结果不同?原因:==
操作符比较的是两个对象的引用是否相同,而 equals
方法比较的是两个对象的内容是否相同。由于 String
对象是不可变的,Java 会对相同的字符串字面量进行优化,使它们共享同一个内存地址。
解决方法:在比较字符串内容时,应该使用 equals
方法而不是 ==
操作符。
String s1 = "Hello";
String s2 = "Hello";
System.out.println(s1 == s2); // true,因为它们指向同一个对象
System.out.println(s1.equals(s2)); // true,因为它们的内容相同
String
对象的 substring
方法可能导致内存泄漏?原因:在旧版本的 Java 中,substring
方法会共享原始字符串的字符数组。如果原始字符串非常大,而子字符串只使用了其中的一小部分,这会导致原始字符串的字符数组无法被垃圾回收,从而导致内存泄漏。
解决方法:从 Java 7 开始,substring
方法的行为发生了变化,它会创建一个新的字符数组来存储子字符串的内容,从而避免了内存泄漏的问题。
String original = "Hello World";
String sub = original.substring(0, 5);
// 在 Java 7 及以上版本中,original 和 sub 的字符数组是独立的
领取专属 10元无门槛券
手把手带您无忧上云