当前位置:实例文章 » JAVA Web实例» [文章][JVM]String str1 = new String(“yhz“)和 String str2 = “yhz“ 的区别

[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() 和直接使用双引号 `" "` 的区别](

相关标签:jvmjava开发语言
其他信息

其他资源

Top