在Java中使用String intern方法时创建的对象数



我理解String的intern方法。

String s1 = "Hello";             
String s4 = new String("Hello").intern();  

(s1 == s4)的输出将为true,如果我们不使用intern,则为false

我的问题是,在执行上述两个语句时,将创建多少个对象??一个还是两个?新的操作符会再创建一个对象吗?

我知道String s4 = new String("Hello")将创建两个对象,但与使用intern混淆了。

这将是两个

一个用于

String s1 = "Hello"; 

另一个用于

String s4 = new String("Hello")

当您需要优化代码时,应该使用intern,因为通过引用比较字符串更快。

至于您的语句,将只创建两个对象。

请注意,过多地使用intern可能会导致内存异常,因为它们存储在通常很小的PermGen中,所以请确保正确配置JVM。

将创建多少个对象??一个还是两个?

二。但其中只有一个被保留。另一个可以立即进行垃圾收集。

新操作员会再创建一个对象吗?

是的。短暂地但随后调用其.intern方法并保存结果。它的.intern方法将返回与s1指向的相同的中间字符串,因此通过new创建的对象(再次)立即符合GC的条件。

如果我们查看字节码,我们可以看到这一点:

public static void main(java.lang.String[]);代码:0:ldc#2//字符串你好2:astore_13:new#3//class java/lang/String6:重复7:ldc#2//字符串你好9:invokespecial#4//方法java/lang/String。":(Ljava/lang/String;)V12:invokevirtual#5//方法java.lang/String.inter:()Ljava/lang/String;15:astore_216:getstatic#6//字段java/lang/System.out:Ljava/io/PrintStream;19:aload_220:invokevirtual#7//方法java.io/PrintStream.println:(Ljava/lang/String;)V23:getstatic#6//字段java/lang/System.out:Ljava/io/PrintStream;26:aload_127:aload_228:if_acmpne 3531:iconst_132:转到3635:iconst_036:invokevirtual#8//方法java/io/PrintStream.println:(Z)V39:返回

3-9从"Hello"创建一个新的String对象,将其引用留在堆栈上,然后我们立即调用intern(从堆栈中弹出对新字符串的引用),并将intern的返回值存储在s4中。因此,临时创建的对象不再被引用。

最新更新