[JVM]String str1 = new String(“yhz“)和 String str2 = “yhz“ 的区别
发布人:shili8
发布时间:2025-02-20 04:37
阅读次数:0
**Java 虚拟机中的字符串创建**
在 Java 中,`String` 是一个非常重要的类,它代表了一个字符序列。然而,在实际开发中,我们经常会遇到两个看似相同但却有区别的写法:`new String()` 和直接使用双引号 `" "`。
本文将深入探讨这两种创建字符串的方式之间的差异,包括它们在 Java 虚拟机(JVM)中的表现、性能和内存占用等方面的影响。
**1. 使用 `new String()`**
javaString str1 = new String("yhz");
在这个例子中,我们使用了 `new` 关键字来创建一个新的 `String` 对象,并将其赋值给变量 `str1`。这里的 `"yhz"` 是一个字符串字面值,它被传递给 `String` 构造函数。
**2. 使用双引号 `" "`**
javaString str2 = "yhz";
在这个例子中,我们直接使用双引号来创建一个字符串字面值,并将其赋值给变量 `str2`。这里的 `"yhz"` 是一个编译时常量,它被直接存储在类文件中。
**区别**
现在,让我们逐一分析这两种方式之间的差异:
### **1. 内存占用**
使用 `new String()` 时,JVM 会为每个字符串创建一个新的对象,这意味着会额外分配一些内存来存储这个新对象。相反,直接使用双引号 `" "` 时,JVM 会将该字符串字面值直接存储在类文件中,不需要额外的内存分配。
javapublic class MemoryUsage { public static void main(String[] args) { String str1 = new String("yhz"); System.out.println(str1); // Output: yhz String str2 = "yhz"; System.out.println(str2); // Output: yhz } }
在上面的例子中,我们可以看到 `str1` 和 `str2` 的内存占用是不同的。使用 `new String()` 时,JVM 会为每个字符串创建一个新的对象,这意味着会额外分配一些内存来存储这个新对象。
### **2. 性能**
在大多数情况下,直接使用双引号 `" "` 的性能比使用 `new String()` 要好。因为直接使用双引号时,JVM 会将该字符串字面值直接存储在类文件中,不需要额外的内存分配和对象创建。
javapublic class Performance { public static void main(String[] args) { long startTime = System.nanoTime(); for (int i =0; i < 10000000; i++) { String str1 = new String("yhz"); } long endTime = System.nanoTime(); System.out.println("Using new String(): " + (endTime - startTime) /1000000.0 + " ms"); startTime = System.nanoTime(); for (int i =0; i < 10000000; i++) { String str2 = "yhz"; } endTime = System.nanoTime(); System.out.println("Using double quotes: " + (endTime - startTime) /1000000.0 + " ms"); } }
在上面的例子中,我们可以看到直接使用双引号 `" "` 的性能比使用 `new String()` 要好。
### **3. 线程安全**
使用 `new String()` 时,JVM 会为每个字符串创建一个新的对象,这意味着会额外分配一些内存来存储这个新对象。相反,直接使用双引号 `" "` 时,JVM 会将该字符串字面值直接存储在类文件中,不需要额外的内存分配。
javapublic class ThreadSafety { public static void main(String[] args) { String str1 = new String("yhz"); System.out.println(str1); // Output: yhz String str2 = "yhz"; System.out.println(str2); // Output: yhz } }
在上面的例子中,我们可以看到 `str1` 和 `str2` 的线程安全性是不同的。使用 `new String()` 时,JVM 会为每个字符串创建一个新的对象,这意味着会额外分配一些内存来存储这个新对象。
### **4. 内容**
最后,让我们看看这两种方式之间的内容差异:
javapublic class Content { public static void main(String[] args) { String str1 = new String("yhz"); System.out.println(str1); // Output: yhz String str2 = "yhz"; System.out.println(str2); // Output: yhz } }
在上面的例子中,我们可以看到 `str1` 和 `str2` 的内容是相同的。
**结论**
综上所述,使用 `new String()` 和直接使用双引号 `" "` 有一些区别。使用 `new String()` 时,JVM 会为每个字符串创建一个新的对象,这意味着会额外分配一些内存来存储这个新对象。相反,直接使用双引号 `" "` 时,JVM 会将该字符串字面值直接存储在类文件中,不需要额外的内存分配和对象创建。
因此,在大多数情况下,直接使用双引号 `" "` 的性能比使用 `new String()` 要好。同时,也要注意到使用 `new String()` 时,JVM 会为每个字符串创建一个新的对象,这意味着会额外分配一些内存来存储这个新对象。
最后,让我们看看这两种方式之间的内容差异:
javapublic class Content { public static void main(String[] args) { String str1 = new String("yhz"); System.out.println(str1); // Output: yhz String str2 = "yhz"; System.out.println(str2); // Output: yhz } }
在上面的例子中,我们可以看到 `str1` 和 `str2` 的内容是相同的。
**参考**
* [Java 虚拟机中的字符串创建]( />* [String 类]( />* [new String() 和直接使用双引号 `" "` 的区别](