作者:伊倓 | 来源:互联网 | 2024-12-02 06:04
本文详细介绍了Java中创建String对象的几种常见方式,包括直接使用双引号、通过new关键字、以及不同创建方式组合使用时的特点和注意事项。同时,文章还探讨了这些创建方式对内存的影响,特别是它们如何影响常量池和堆空间。
1. 直接使用双引号创建
这是最简单也是最常用的创建String对象的方式。例如:String str = "Hello"; 这种方式创建的字符串会首先检查常量池中是否存在相同的字符串,如果存在,则直接引用常量池中的字符串;如果不存在,则在常量池中创建一个新的字符串实例并引用之。
2. 使用new关键字创建
这种方式通过new String("Hello")来创建字符串。这种方式总是会在堆内存中创建一个新的String对象,即使常量池中已经存在相同的字符串。这意味着,使用new关键字创建的String对象不会共享相同的引用,这可能导致不必要的内存消耗。
3. 双引号字符串相加创建
例如:String str = "Hello" + "World"; 在编译期,这种表达式会被优化为一个单独的字符串常量,存储在常量池中。因此,这种方式实际上等同于直接使用双引号创建。
4. 两个new String对象相加
如:String str = new String("Hello") + new String("World"); 这种情况下,两个String对象都会在堆内存中创建,然后通过+操作符连接成一个新的String对象,这个新的对象也会被存放在堆内存中。
5. 双引号字符串与new String对象相加
例如:String str = "Hello" + new String("World"); 或者 String str = new String("Hello") + "World"; 在这两种情况下,虽然有一个字符串是直接从常量池获取的,但最终的结果字符串仍然会在堆内存中创建。
总结
1. 常量池中的字符串
只有通过双引号直接创建的字符串才会被放入常量池中。如果通过new关键字创建,则只会创建一个堆内存中的对象。
2. 堆内存中的字符串对象
使用new String()方式创建的对象总是位于堆内存中,即使常量池中已有相同内容的字符串。
3. 组合创建方式
当涉及到字符串的拼接时,如果其中至少有一个是通过new关键字创建的,那么结果字符串将始终被创建在堆内存中。
附加:public String intern()
此方法返回字符串对象的规范化表示形式,即存在于字符串常量池中的字符串。首次调用此方法时,如果常量池中没有相同的字符串,则会将当前字符串添加到常量池中,并返回其引用。如果常量池中已存在相同的字符串,则直接返回常量池中的字符串引用。