我理解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
中。因此,临时创建的对象不再被引用。