System.out.println(s3.intern() == s3);//false//因为有些关键词在JDK中就已经在常量池中创建了``` -在1.6中,使用intern方法会将这个字符串对象尝试放入串池,如果有则不会放入,如果没有会把此对象复制一份,放入串池(不是同一个对象),并将串池对象返回,此时 ```javaStrings1=newString("a")+newString("b"); System.out.println(s1.intern() == s1);//fal...
从运行结果来看,不使用intern()的情况下,程序生成了101762个String对象,而使用了intern()方法时,程序仅生成了1772个String对象。自然也证明了intern()节省内存的结论。 细心的同学会发现使用了intern()方法后程序运行时间有所增加。这是因为程序中每次都是用了new String后又进行intern()操作的耗时时间,但是不使用inte...
第二行,str3 执行intern()方法,该方法会从字符串常量池中查找公众号霸道的程序猿对象是否存在,此时字符串常量池不存在,但是堆中存在 字符串常量池中保存的是堆中公众号霸道的程序猿对象的引用,也就是说,str3和str4的引用地址是相同,所以输出的结果为 true。 具体步骤如下: 创建"公众号" 字符串对象,存储在字符...
publicclasscom.justin.java.lang.InternTest{ publiccom.justin.java.lang.InternTest();Code:: aload_0 1: invokespecial #1// Method java/lang/Object."<init>":()V4:returnpublicstaticvoidmain(java.lang.String[]);Code::new #2// class java/lang/StringBuilder3: dup 4: invokespecial #3...
initially empty, is maintained privately by the * class {@code String}. * * When the intern method is invoked, if the pool already contains a * string equal to this {@code String} object as determined by * the {@link #equals(Object)} method, then the string from ...
运行时数据区中的方法区有一个常量池,但是发现在JDK1.6以后常量池被放置在了堆空间,因此常量池位置的不同影响到了String的intern()方法的表现。深入了解后发现还是值得写下来记录一下的。 1.为什么要介绍intern()方法 重用String对象,以节省内存消耗。这么说可能有点抽象,那么就用例子来证明。
两种情况分别运行,可通过Window ---> Preferences --> Java --> Installed JREs设置JVM启动参数为-agentlib:hprof=heap=dump,format=b,将程序运行完后的hprof置于工程目录下。再通过MAT插件查看该hprof文件。 两次实验结果如下: 从运行结果来看,不使用intern()的情况下,程序生成了101762个String对象,而使用了...
2.String的 intern 方法到底干了什么? 如果常量池中已经有了这个字符串,那么直接返回常量池中它的引用,如果没有,那就将它的引用保存一份到字符串常量池,然后直接返回这个引用。 3.s1.intern(); 和 s1 = s1.intern();一样吗? 不一样。 s1.intern(); 将s1的引用保存一份到字符串常量池。如果常量池中...
intern()方法是Java中的一个方法,它用于将字符串对象添加到字符串常量池中,并返回该字符串在常量池中的引用。 当调用intern()方法时,如果字符串常量池中已经存在该字符串,则直接返回常量池中的引用;如果常量池中不存在该字符串,则将该字符串添加到常量池中,并返回新添加的字符串引用。
简单来说,在Java8中,String类维护了一个字符串常量池(注意此常量池在运行期间位于堆中),当调用intern方法时,首先在常量池中查看是否已有相同的字符串(字符串是否相同使用String的equal方法判断),如果常量池中已有,则直接返回该字符串的引用,如果没有,则将当前字符串对象加入常量池中,并返回当前字符串的引用。