首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java的String.intern()的目的是什么?

Java的String.intern()的目的是什么?
EN

Stack Overflow用户
提问于 2018-09-26 01:54:49
回答 2查看 0关注 0票数 0

我知道有两种方法可以在Java中创建String:

代码语言:javascript
复制
String a = "aaa";
String b = new String("bbb");

第一种方式,Java肯定会在字符串池中创建一个String对象并a引用它。(假设“aaa”之前不在游泳池里。)

如果这是真的,那么每次使用new String("bbb");,在池中创建一个对象“bbb”,这意味着通过上面的任何一种方式,java将始终在池中创建一个字符串对象。然后intern()用于什么?

EN

回答 2

Stack Overflow用户

发布于 2018-09-26 10:18:51

String在Java编程语言中的一个不可变对象中,这意味着一旦构造就无法改变。因此,JVM能够维护文字池,这有助于减少内存使用并提高性能。每次String使用文字时,JVM都会检查文字池,如果文字已经可用,则会返回相同的引用。如果不是,则会在文字池中创建并添加新的String对象。

当尝试创建String类似基元或文字/常量时,将应用此理论。

代码语言:javascript
复制
String str = "bbb";

但是当你创建一个新的String对象时

代码语言:javascript
复制
String str = new String("bbb"));

覆盖上述规则并始终创建新实例。

但是,即使创建了一个using 运算符internString该类中的API 也可用于Stringliteral池中选择引用。请查看下面给出的示例。虽然使用运算符创建,因为我们使用了JVM从池中获取引用的方法。Stringnewstr3newinternliteral

代码语言:javascript
复制
public class StringInternExample {

    public static void main(final String args[]) {

        final String str = "bbb";
        final String str1 = "bbb";
        final String str2 = new String("bbb");
        final String str3 = new String("bbb").intern();

        System.out.println("str == str1 : "+(str == str1));
        System.out.println("str == str2 : "+(str == str2));
        System.out.println("str == str3 : "+(str == str3));
    }
}

上述代码的输出:

代码语言:javascript
复制
str == str1 : true
str == str2 : false
str == str3 : true
票数 0
EN

Stack Overflow用户

发布于 2018-09-26 11:46:31

new String("abc")将在内存中创建一个新对象,因此建议避免使用它。请查看Josh Bloch的Effective Java第5项“避免创建不必要的对象”,其中更好地解释:

作为不该做的极端例子,请考虑以下声明: String s = new String("stringette"); // DON'T DO THIS! 该语句在每次执行时都会创建一个新的String实例,并且这些对象创建都不是必需的。String构造函数(“stringette”)的参数本身就是一个String实例,在功能上与构造函数创建的所有对象完全相同。如果这种用法发生在循环或频繁调用的方法中,则可以不必要地创建数百万个String实例。改进版只是以下内容: String s = "stringette"; 此版本使用单个String实例,而不是每次执行时都创建一个新实例。此外,保证对象将被同一虚拟机中运行的任何其他代码重用,恰好包含相同的字符串文字[JLS,3.10.5]。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100002747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档