精华内容
下载资源
问答
  • intern

    2019-03-20 00:07:55
    java 8 以后 将元空间取代永久代(方法区的实现)jdk1,6常量池放在方法区,jdk1.7常量池放在堆内存,jdk1.8放在元空间里面,和堆相独立。 元空间存储的本地内存,永久代存储在jvm内存中 ...intern...

    java 8 以后 将元空间取代永久代(方法区的实现)jdk1,6常量池放在方法区,jdk1.7常量池放在堆内存,jdk1.8放在元空间里面,和堆相独立。
    元空间存储的本地内存,永久代存储在jvm内存中
    java三大性能调优参数
    -Xss 设置每个线程的虚拟机栈大小
    -Xms 堆的初始值
    -Xmx 堆的最大值 (一般讲-Xms和-Xmx设置一样大,避免调整内存是程序的抖动,影响运行)
    intern()
    jdk6:当调用此方法时,如果字符串常量池先前已创建该字符串对象,则返回池中的该字符串的引用。否则,将次字符串对象添加到字符串常量池,并返回该字符串对象的引用。
    jdk6+:当调用此方法时,如果字符串常量池先前已创建该字符串对象。否则,如果该字符串对象已在java堆中,则将堆中对象的引用添加到字符串常量池中,并返回该引用;如果堆中不存在,则在池中创建该字符串并返回引用。
    new string(“aaa”)生成了两对象,一个在堆中,一个在常量池
    例子:public static void main(String[] args) {
    String s = new String(“1”);
    s.intern();
    String s2 = “1”;
    System.out.println(s == s2);

    String s3 = new String("1") + new String("1");
    s3.intern();
    String s4 = "11";
    System.out.println(s3 == s4);
    

    }
    jdk6 下false false
    jdk7 下false true

    展开全文
  • Java技术——你真的了解String类的intern()方法吗

    万次阅读 多人点赞 2016-08-23 16:40:53
    0.引言 什么都先不说,先看下面这个引入的例子: ...System.out.println(str1.intern() == str1); System.out.println(str1 == "SEUCalvin"); 本人JDK版本1.8,输出结果为: tru...

    0.引言

    什么都先不说,先看下面这个引入的例子:

    String str1 = new String("SEU")+ new String("Calvin");    
    System.out.println(str1.intern() == str1); 
    System.out.println(str1 == "SEUCalvin");
    

    本人JDK版本1.8,输出结果为:

    true
    true

    再将上面的例子加上一行代码:

    String str2 = "SEUCalvin";//新加的一行代码,其余不变
    String str1 = new String("SEU")+ new String("Calvin");    
    System.out.println(str1.intern() == str1); 
    System.out.println(str1 == "SEUCalvin"); 

    再运行,结果为:

    false
    false

    是不是感觉莫名其妙,新定义的str2好像和str1没有半毛钱的关系,怎么会影响到有关str1的输出结果呢?其实这都是intern()方法搞的鬼!看完这篇文章,你就会明白。o(_)o 

    说实话我本来想总结一篇Android内存泄漏的文章的,查阅了很多资料,发现不得不从JavaOOM讲起,讲JavaOOM又不得不讲Java的虚拟机架构。如果不了解JVM的同学可以查看此篇 JVM——Java虚拟机架构。(这篇文章已经被我修改过N多次了,个人感觉还是挺全面清晰的,每次看都会有新的理解。)

    JVM架构一文中也有介绍,在JVM运行时数据区中的方法区有一个常量池,但是发现在JDK1.6以后常量池被放置在了堆空间,因此常量池位置的不同影响到了Stringintern()方法的表现。深入了解后发现还是值得写下来记录一下的。为了确保文章的实时更新,实时修改可能出错的地方,请确保这篇是原文,而不是无脑转载来的“原创文”,原文链接为:SEU_Calvin的博客

     

    1.为什么要介绍intern()方法

    intern()方法设计的初衷,就是重用String对象,以节省内存消耗。这么说可能有点抽象,那么就用例子来证明。

    static final int MAX = 100000;
    static final String[] arr = new String[MAX];
    
    public static void main(String[] args) throws Exception {
    	//为长度为10的Integer数组随机赋值
    	Integer[] sample = new Integer[10];
    	Random random = new Random(1000);
    	for (int i = 0; i < sample.length; i++) {
    	    sample[i] = random.nextInt();
    	}
    	//记录程序开始时间
    	long t = System.currentTimeMillis();
    	//使用/不使用intern方法为10万个String赋值,值来自于Integer数组的10个数
    	    for (int i = 0; i < MAX; i++) {
    	        arr[i] = new String(String.valueOf(sample[i % sample.length]));
    	        //arr[i] = new String(String.valueOf(sample[i % sample.length])).intern();
    	    }
    	    System.out.println((System.currentTimeMillis() - t) + "ms");
    	    System.gc();
    }

    这个例子也比较简单,就是为了证明使用intern()比不使用intern()消耗的内存更少

    先定义一个长度为10Integer数组,并随机为其赋值,在通过for循环为长度为10万的String对象依次赋值,这些值都来自于Integer数组。两种情况分别运行,可通过Window ---> Preferences --> Java --> Installed JREs设置JVM启动参数为-agentlib:hprof=heap=dump,format=b,将程序运行完后的hprof置于工程目录下。再通过MAT插件查看该hprof文件。
    两次实验结果如下:

    从运行结果来看,不使用intern()的情况下,程序生成了101762String对象,而使用了intern()方法时,程序仅生成了1772String对象。自然也证明了intern()节省内存的结论

    细心的同学会发现使用了intern()方法后程序运行时间有所增加。这是因为程序中每次都是用了new String后又进行intern()操作的耗时时间,但是不使用intern()占用内存空间导致GC的时间是要远远大于这点时间的。 

     

    2.深入认识intern()方法

    JDK1.7后,常量池被放入到堆空间中,这导致intern()函数的功能不同,具体怎么个不同法,且看看下面代码,这个例子是网上流传较广的一个例子,分析图也是直接粘贴过来的,这里我会用自己的理解去解释这个例子:

    String s = new String("1");
    s.intern();
    String s2 = "1";
    System.out.println(s == s2);
    
    String s3 = new String("1") + new String("1");
    s3.intern();
    String s4 = "11";
    System.out.println(s3 == s4);

    输出结果为:

    JDK1.6以及以下:false false
    JDK1.7以及以上:false true
    

    再分别调整上面代码2.3行、7.8行的顺序:

    String s = new String("1");
    String s2 = "1";
    s.intern();
    System.out.println(s == s2);
    
    String s3 = new String("1") + new String("1");
    String s4 = "11";
    s3.intern();
    System.out.println(s3 == s4);
    

    输出结果为:

    JDK1.6以及以下:false false
    JDK1.7以及以上:false false

    下面依据上面代码对intern()方法进行分析:

     

    2.1 JDK1.6

     

    JDK1.6中所有的输出结果都是 false,因为JDK1.6以及以前版本中,常量池是放在 Perm 区(属于方法区)中的,熟悉JVM的话应该知道这是和堆区完全分开的

    使用引号声明的字符串都是会直接在字符串常量池中生成的,而 new 出来的 String 对象是放在堆空间中的。所以两者的内存地址肯定是不相同的,即使调用了intern()方法也是不影响的。如果不清楚String类的“==”和equals()的区别可以查看我的这篇博文Java面试——从Java堆、栈角度比较equals和==的区别

    intern()方法在JDK1.6中的作用是:比如String s = new String("SEU_Calvin"),再调用s.intern(),此时返回值还是字符串"SEU_Calvin",表面上看起来好像这个方法没什么用处。但实际上,在JDK1.6中它做了个小动作:检查字符串池里是否存在"SEU_Calvin"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会把"SEU_Calvin"添加到字符串池中,然后再返回它的引用。然而在JDK1.7中却不是这样的,后面会讨论。

     

    2.2 JDK1.7

    针对JDK1.7以及以上的版本,我们将上面两段代码分开讨论。先看第一段代码的情况:

    再把第一段代码贴一下便于查看:

    String s = new String("1");
    s.intern();
    String s2 = "1";
    System.out.println(s == s2);
    
    String s3 = new String("1") + new String("1");
    s3.intern();
    String s4 = "11";
    System.out.println(s3 == s4);

    String s = newString("1"),生成了常量池中的“1” 和堆空间中的字符串对象

    s.intern(),这一行的作用是s对象去常量池中寻找后发现"1"已经存在于常量池中了

    String s2 = "1",这行代码是生成一个s2的引用指向常量池中的“1”对象

    结果就是 s s2 的引用地址明显不同。因此返回了false。

     

    String s3 = new String("1") + newString("1"),这行代码在字符串常量池中生成“1” ,并在堆空间中生成s3引用指向的对象(内容为"11")。注意此时常量池中是没有 “11”对象的。

    s3.intern(),这一行代码,是将 s3中的“11”字符串放入 String 常量池中,此时常量池中不存在“11”字符串,JDK1.6的做法是直接在常量池中生成一个 "11" 的对象。

    但是在JDK1.7中,常量池中不需要再存储一份对象了,可以直接存储堆中的引用。这份引用直接指向 s3 引用的对象也就是说s3.intern() ==s3会返回true。

    String s4 = "11", 这一行代码直接去常量池中创建,但是发现已经有这个对象了,此时也就是指向 s3 引用对象的一个引用因此s3 == s4返回了true

     

    下面继续分析第二段代码:

    再把第二段代码贴一下便于查看:

    String s = new String("1");
    String s2 = "1";
    s.intern();
    System.out.println(s == s2);
    
    String s3 = new String("1") + new String("1");
    String s4 = "11";
    s3.intern();
    System.out.println(s3 == s4);

    String s = newString("1"),生成了常量池中的“1” 和堆空间中的字符串对象

    String s2 = "1",这行代码是生成一个s2的引用指向常量池中的“1”对象,但是发现已经存在了,那么就直接指向了它

    s.intern(),这一行在这里就没什么实际作用了。因为"1"已经存在了。

    结果就是 s  s2 的引用地址明显不同。因此返回了false。

     

    String s3 = new String("1") + newString("1"),这行代码在字符串常量池中生成“1” ,并在堆空间中生成s3引用指向的对象(内容为"11")。注意此时常量池中是没有 “11”对象的。

    String s4 = "11", 这一行代码直接去生成常量池中的"11"

    s3.intern(),这一行在这里就没什么实际作用了。因为"11"已经存在了。

    结果就是 s3  s4 的引用地址明显不同。因此返回了false。

     

    3 总结

    终于要做Ending了。现在再来看一下开篇给的引入例子,是不是就很清晰了呢。

    String str1 = new String("SEU") + new String("Calvin");      
    System.out.println(str1.intern() == str1);   
    System.out.println(str1 == "SEUCalvin");  
    

    str1.intern() == str1就是上面例子中的情况,str1.intern()发现常量池中不存在“SEUCalvin”,因此指向了str1 "SEUCalvin"在常量池中创建时,也就直接指向了str1了。两个都返回true就理所当然啦。

    那么第二段代码呢:

    String str2 = "SEUCalvin";//新加的一行代码,其余不变
    String str1 = new String("SEU")+ new String("Calvin");    
    System.out.println(str1.intern() == str1); 
    System.out.println(str1 == "SEUCalvin"); 

    也很简单啦,str2先在常量池中创建了“SEUCalvin”,那么str1.intern()当然就直接指向了str2,你可以去验证它们两个是返回的true。后面的"SEUCalvin"也一样指向str2。所以谁都不搭理在堆空间中的str1了,所以都返回了false。

     

    好了,本篇对intern的作用以及在JDK1.6和1.7中的实现原理的介绍就到此为止了。希望能给你带来帮助。转载请注明出处http://blog.csdn.net/seu_calvin/article/details/52291082

     

     

    展开全文
  • Intern interactivity

    2021-01-11 04:08:33
    <div><p>The goal of this issue is to look into ways Intern could be made more interactive. One way in which Intern is currently interactive is the clickable links in the ...
  • Intern tests

    2020-12-31 06:59:54
    ve added the Intern as a dev dependency and converted the tabs test suite as well as all the failing DOH test suites (collapse and popover). I fixed a couple of bugs that were causing the tests to ...
  • Intern new

    2020-12-01 13:24:27
    <p>With this PR, the primitive constructor is available and is called <code>intern, as the annotation that indicates things that cannot be programmed in Nit but are provided by the execution engine. ...
  • Add intern

    2020-12-25 19:59:33
    <div><p>This adds a recipe for <code>intern</code> (Integrated Toolkit for Extensible and Reproducible Neuroscience). It's a python package for accessing the <a href="https://docs.theboss.io">Boss...
  • Intern conversion

    2020-11-28 13:53:48
    <div><p>This pull request converts 95% of all DOH tests into Intern tests. All DOH tests are preserved in the <code>testsDOH</code> directory. Test modules that weren't converted were made into ...
  • s transition from Intern 3 to 4. Total success would be a plugin that, when loaded, would allow an existing intern config and AMD test suites to load and run with no modification. This could be built ...
  • String intern

    2019-08-23 00:33:03
    intern api描述 public String intern()返回字符串对象的规范化表示形式。 一个初始为空的字符串池,它由类 String 私有地维护。 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 ...

    intern api描述

    public String intern()返回字符串对象的规范化表示形式。 
    一个初始为空的字符串池,它由类 String 私有地维护。 
    
    当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。 
    
    它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t)true 时,s.intern() == t.intern() 才为 true。 
    
    所有字面值字符串和字符串赋值常量表达式都使用 intern 方法进行操作。字符串字面值在 Java Language Specification 的 §3.10.5 定义。 
    
    
    返回:
    一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池。
    

    也就是设计模式中的享元模式,将操作数缓存起来。

    举例说明

    TODO

    展开全文
  • intern_project-源码

    2021-02-22 12:00:29
    intern_project
  • Java intern() 方法intern() 方法返回字符串对象的规范化表示形式。它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。语法public String intern...

    Java intern() 方法

    intern() 方法返回字符串对象的规范化表示形式。

    它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。

    语法public String intern()

    参数无

    返回值

    一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池。

    实例public class Test {

    public static void main(String args[]) {

    String Str1 = new String("www.w3cschool.cn");

    String Str2 = new String("www.w3cschool.cn");

    System.out.print("规范表示:" );

    System.out.println(Str1.intern());

    System.out.print("规范表示:" );

    System.out.println(Str2.intern());

    }

    }

    以上程序执行结果为:规范表示:www.w3cschool.cn

    规范表示:www.w3cschool.cn

    展开全文
  • java intern

    2017-12-19 11:36:47
    Java intern() 方法 Java String类 intern() 方法返回字符串对象的规范化表示形式。 它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。 ...
  • Collaboration with Intern

    2021-01-10 01:58:54
    <div><p>We have a <a href="https://github.com/jquery/qunitjs.com/issues/42">ticket to document integration with CI tools, including intern, though I wonder if that is really a good investment of our ...
  • <div><p>Per #2439 implement stubs for rb_intern2(cstr, len) and rb_intern3(cstr, len, enc). Update: this will be a correct implementation of rb_intern2, but still a stub for rb_intern3.</p><p>该提问...
  • Intern CLI review

    2021-01-11 04:15:01
    <div><p>The goal of this issue is to define how Intern's CLI should behave and what capabilities it should support. <p>The current CLI is very simple and behaves in some non-standard ways, ...
  • intern()方法:public String intern()JDK源代码如下图:返回字符串对象的规范化表示形式。一个初始时为空的字符串池,它由类 String 私有地维护。当调用 intern 方法时,如果池已经包含一个等于此 String 对象的...
  • 首先我们应该清楚的是JDK1.6和JDK1.7中String类的intern方法还是有差别的:JDK1.6中的intern:调用intern方法的时候首先会去常量池中查看是否存在与当前String值相同的值,如果存在的话,则直接返回常量池中这个...
  • JDK7 中将StringPool从永久代移动到了老生代,并且可以通过-XX:...public void equalTest(){String s = new String("1").intern();String s2 = "1";System.out.println(s2 == s);}output: truepublic void e...
  • Avoid string intern

    2020-12-08 20:25:01
    <div><p>Change synchronization to avoid String.intern(). <p>Not only does String.intern() expose a surprising race condition, it is a slow call for strings not already in the pool. Which seems to be ...
  • Intern with Webpack

    2021-01-11 04:08:49
    d expect I can pass webpack as loader to the intern.js file: <pre><code> loaders: { "host-node": "some_webpack_reference", "host-browser": "some_webpack_path" } </code>...
  • Java intern() 方法intern() 方法返回字符串对象的规范化表示形式。它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。语法public String intern...
  • 理解intern

    2017-09-26 18:56:46
    下面是为了理解intern String a = "hello"; String b = new String("hel") + new String("lo"); String d = b.intern(); System.out.println(a==d); System.out.println(a==b);
  • pre_intern01-源码

    2021-03-03 03:32:29
    pre_intern01
  • java String的intern方法

    2020-09-01 23:47:03
    本文主要介绍java 中String 的intern方法,这里主要通过实例来说明不同版本的JDK,intern方法的对比,有需要的小伙伴可以参考下
  • How Intern compares

    2021-01-11 04:33:40
    <div><p>it sould be nice to add selenium-webdriver, wd.js and karma to the comparison table as columns. also REPL support as new row. btw:how mocha supports code coverage ?...theintern/intern</p></div>
  • string intern

    2016-06-23 09:41:23
    String intern 是 常量池中的string
  • <div><p>The first commits enhance the parser to accept top-level intern methods (needed for <code>exit) and intern <code>new</code> factories (analogous to extern <code>new</code> factories)....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,916
精华内容 2,766
关键字:

intern