上一篇地址:赶紧收藏!2024 年最常见 100道 Java 基础面试题(三)-CSDN博客
七、Java中操作字符串都有哪些类?它们之间有什么区别?
在Java中,这两种声明方式在内部实现和内存分配上有所不同。
-
String str = "i";
:- 这种创建字符串的方式使用了字符串字面量。在这种情况下,Java虚拟机会在称为“字符串常量池”(String Constant Pool)的特殊区域查找是否存在相同的字符串值。如果字符串常量池中已经存在字符串
"i"
,则str
将直接引用常量池中的"i"
。如果常量池中不存在,则会创建一个新的字符串"i"
并将其放入常量池中,然后str
引用这个新创建的字符串。 - 这种方式是推荐的做法,特别是当处理字符串常量时,因为它节省内存,并且可以提高性能,因为字符串字面量在多个地方使用时,实际上是共享相同的内存地址。
- 这种创建字符串的方式使用了字符串字面量。在这种情况下,Java虚拟机会在称为“字符串常量池”(String Constant Pool)的特殊区域查找是否存在相同的字符串值。如果字符串常量池中已经存在字符串
-
String str = new String("i");
:- 这里使用了
new
关键字来创建一个新的String
对象。new String("i")
会创建一个匿名的String
对象,然后这个新对象会被分配到Java堆内存中。尽管这个新对象的内容是字符串"i"
,但它与字符串常量池中的"i"
是不同的实例。 - 由于每次调用都会创建一个新的对象,如果频繁地使用这种方式创建字符串,并且这些字符串具有相同的值,那么会导致内存使用增加,并且可能会影响垃圾回收的性能。
- 这里使用了
内存分配差异:
- 使用字符串字面量(
"i"
)时,内存分配在字符串常量池中,多个相同的字符串字面量共享相同的内存地址。 - 使用
new String("i")
时,每次都会为新对象分配堆内存,即使字符串的内容相同。
示例代码:
String s1 = "i"; // 字符串字面量,可能指向字符串常量池
String s2 = new String("i"); // 使用new操作符创建新的String对象
System.out.println(s1 == s2); // 可能输出false,取决于JVM的实现和字符串池的具体情况
System.out.println(s1.equals(s2)); // 输出true,因为内容相同
总结:
String str = "i";
与String str = new String("i");
在内存分配上不同,前者可能使用字符串常量池,后者总是在堆上创建新对象。- 在大多数情况下,推荐使用字符串字面量的方式来声明字符串,因为它节省内存,并且可以提高程序性能。
八、String str = "i"
与String str = new String("i")
一样吗?
答案是不一样,它们在Java中的实现和内存分配上有显著差异。
-
String str = "abc";
:- 这种方式使用的是字符串字面量。在Java中,所有的字符串字面量都是
String
类的特殊实例,它们在首次使用时会被自动创建,并且存储在字符串常量池中。字符串常量池是位于堆内存中的一个特殊的存储区域,用于存储字符串字面量和字符串结果。 - 当程序中多次出现相同的字符串字面量时,如
"abc"
,JVM会进行字符串重用,即不同的变量会指向相同的常量池中的字符串对象,从而节省内存。
- 这种方式使用的是字符串字面量。在Java中,所有的字符串字面量都是
-
String str = new String("abc");
:- 这种方式通过
new
关键字创建了一个新的String
对象实例。每次执行这个语句,都会在堆内存中创建一个新的String
对象,即使字符串的值相同。 - 使用
new String()
时,即使多个String
对象具有相同的字符串值,它们也会是不同的实例,并且每个实例都有自己的内存空间。
- 这种方式通过
内存和性能影响:
- 使用字符串字面量(
"abc"
)通常更节省内存,因为多个变量可以引用常量池中的同一个字符串实例。 - 使用
new String("abc")
可能会创建多个相同的字符串实例,增加了内存的使用,尤其是在循环或大量字符串操作的情况下,可能会对性能产生负面影响。
示例代码:
String s1 = "abc"; // 字符串字面量,可能指向字符串常量池中的实例
String s2 = new String("abc"); // 使用new操作符创建新的String对象
System.out.println(s1 == s2); // 输出结果取决于JVM的实现和字符串常量池的具体情况,可能会是false
System.out.println(s1.equals(s2)); // 输出true,因为equals方法比较字符串的内容
总结:
String str = "abc";
与String str = new String("abc");
在内存分配和对象创建上是不同的。- 使用字符串字面量通常更优,因为它利用了字符串常量池,减少了内存消耗。
- 使用
new String()
创建的每个对象都是独立的,并且每个对象都有自己的内存空间。