在Java中,toString().intern()这个表达式通常用在一个对象的字符串表示上,用于将该字符串对象放入字符串池(String Pool)中,并返回字符串池中该字符串的引用。...intern() : 这是String类的一个方法。当调用一个字符串对象的intern()方法时,JVM会检查字符串池中是否存在相同内容的字符串。...性能提升: 比较两个通过intern()方法处理过的字符串时,由于它们可能指向同一个内存地址(如果内容相同),比较操作更快。...一致性: 在某些需要确保字符串唯一性或比较相等情况的场景下,使用intern()可以帮助维持数据的一致性。...Hello" 需要注意的是,过度使用intern()可能导致内存占用增加,尤其是在处理大量唯一字符串时。
序 本文主要研究一下java String的intern String-Pool-Java1.png String.intern() java.base/java/lang/String.java...} 当调用intern方法时,如果常量池已经包含一个equals此String对象的字符串,则返回池中的字符串 当调用intern方法时,如果常量池没有一个equals此...的intern方法执行的时候,由于常量池中没有tomcat,因而添加到常量池,intern()返回的是指向heap中的tomcat的引用;stringLiteral是tomcat这个literal string...,由于stringObject.intern()已经将tomcat添加到常量池了并指向heap中的tomcat的引用,所以stringLiteral返回的是指向heap中的tomcat的引用 由于stringLiteral...都是interned的 doc 浅谈String的intern Why does String.intern() return different results under JDK8 and JDK9
一、概述 JDK7 之前和之后的版本,String 的 intern() 方法在实现上存在差异,本文的说明环境是 JDK8,会在文末说明 intern() 方法的版本差异性。...s1 == s2.intern() 返回 true,当 s2 调用 intern() 方法的时候,发现常量池中已经存在该字符串,则直接返回了该引用(s1 的引用)。...s2.intern() == s3.intern() 返回 true,前面说明 s2 的 intern() 返回的是 s1 的引用,s3 的 intern() 也是一样的道理,因此 s2 的 intern...() 和 s2 的 intern() 返回的都是 s1 的引用,所以相等。...三、和 JDK6 的版本差异 JDK7 之后的 intern() 方法和之前版本的差异主要体现在:如果常量池中不存在该字符串时的处理机制。
(); 从上面代码块中得知,String::intern方法是一个native方法,其底层实现是通过c/cpp实现的。...当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。...然而在JDK6与JDK7+由于虚拟机的调整,intern返回的对象有所不同。 仅讨论hotspot的实现 下面代码在JDK6与JDK8中会有不同的结果。...当执行intern方法时,首先判断永久代中字符串常量池中是否存在该字符串,如果存在返回字符串常量池中的字符串对象实例,否则复制首次出现的实例到字符串常量池,并返回。...因此intern返回的对象与StringBuilder创建出来的是同一个引用。
1.概要 驻留池(Intern Pool)是一个用于存储字符串的内部数据结构。这个概念是由.NET提供的一项优化,主要用于减少系统对内存的使用。...// 创建一个新的字符串实例 string d = String.Intern(c); // 强制将字符串添加到驻留池,这样 'd' 和 'a' 引用的其实是同一个字符串实例 此时,c 和 d 是内容相同的字符串...请注意,过度使用 String.Intern() 可能会导致内存问题,因为一旦字符串被添加到驻留池,就无法被垃圾收集器回收,除非应用程序结束。所以在大多数情况下,你应当让.NET自己管理驻留池。...这也是为什么要小心使用String.Intern()方法的原因之一。过度使用这个方法会导致大量的字符串被驻留,从而消耗大量的内存,而这部分内存在应用程序运行期间无法被回收。...System.String类提供了两个方法来处理驻留池:Intern()和 IsInterned()。 Intern(string str):此方法用于将一个字符串添加到驻留池。
前言 在知乎上遇到一个刚学Java就接触的字符串比较的问题: 通常,根据"==比较的是地址,equals比较的是值"介个定理就能得到结果。...intern() 先看一下intern()这个方法的描述: 用二级英文水平翻译一波,大意就是一个string调用intern()的时候,如果池中有和这个字符串值相等的字符串对象,就会将字符串池中的字符串对象返回...从上面的代码中也得出结论:intern()可以将堆中创建的且字符串池没有等值引用的字符串引用放入字符串池。 同时,这也能说明String为什么不可变这个问题。...因为这样可以保证多个引用可以同时指向字符串池中的同一个对象。如果字符串是可变的,其中的一个引用操作改变了对象的值,对其他引用会有影响,这样显然是不可以的。 言归正传 回到知乎上的问题。...结语 Java中有时候很小的问题也会发散出很多知识点,不论是底层还是JVM的理论学习,结合应用案例会理解的更加深刻。就像文中提到的常量池就是class文件结构和类加载理论学习的一部分。
,而 str2 是通过 intern() 方法从常量池中获取的引用。...这样可以减少内存使用,但是需要注意的是,由于多个线程同时访问常量池,可能会导致线程安全问题。因此,在多线程环境下使用 `intern()` 方法时,需要采取相应的同步措施来确保线程安全。...另外,需要注意的是,使用 `intern()` 方法也可能会带来一些性能问题。由于在常量池中查找字符串需要进行哈希计算和比较操作,因此在大量使用 `intern()` 方法时可能会影响程序的性能。...,锁定某个特定的对象,我这个示例其实随意创建一个对象都可以,只要保证每次都取的是唯一的就可以了,借此引出intern()的部分使用场景。...记得曾经推特的工程师使用intern()对地址进行内存优化,使得原本相同的地址占用不同的内存问题得到了释放,intern()虽然会有性能影响,但是看你的使用场景。
When---什么时候需要了解String的intern方法: 面试的时候(蜜汁尴尬)!...虽然不想承认,不过面试的时候经常碰到这种高逼格的问题来考察我们是否真正理解了String的不可变性、String常量池的设计以及String.intern方法所做的事情。...但其实,我们在实际的编程中也可能碰到可以利用String.intern方法来提高程序效率或者减少内存占用的情况,这个我们等下会细说。...上面是jdk源码中对intern方法的详细解释。简单来说就是intern用来返回常量池中的某字符串,如果常量池中已经存在该字符串,则直接返回常量池中该对象的引用。...()); // jdk1.7之前为false,之后为true 下面我们延伸一下来讲讲字符串拼接的优化问题: 1 String a = "1";
()if type(person) is Person: # 记住这里最好使用is,不要使用== python的intern机制 由于变量的存储机制,python增加了字符串的intern机制,也就是说值同样的字符串对象...---- intern机制的优点是:在创建新的字符串对象时,会先在缓存池里面找是否有已经存在的值相同的对象(标识符,即只包含数字、字母、下划线的字符),如果有则直接拿过来用(引用),避免频繁的创建和销毁内存...因为Python的内置函数intern()能显式的对任意字符串进行intern,就说明并不是实现难度的问题,解决这个问题最好是查看Python的源码,可以找到答案,在源代码StringObject.h中的注释能够找到...它们不都只是包含字母吗,没有空格应该是被主动intern的呀?的确是不错,但是你忽略了一个事实。...5、极少数特殊情况下(如上述最后一个例子时),也不会主动开启intern机制。 6、在Python的小整数池[-5,256]这个范围内也是默认开启intern机制。
那么String.intern的性能怎么样呢?我们一起来看一下。...String.intern和G1字符串去重的区别 之前我们提到了,String.intern方法会返回字符串常量池中的字符串对象的引用。...而G1垃圾回收器的字符串去重的功能其实和String.intern有点不一样,G1是让两个字符串的底层指向同一个byte[]数组。 有图为证: ?...String.intern的性能 我们看下intern方法的定义: public native String intern(); 大家可以看到这是一个native的方法。...intern的用处不是在于速度,而是在于节约Heap中的内存使用。
还是说不同的JDK版本的答案不尽相同 ?...Jdk1.8及之后: 无永久代,变成了元空间,运行时常量池在元空间,字符串常量池里依然在堆里 ---- String中的intern方法是一个 native 的方法 JDK1.7(含) + ,当调用...intern方法时,如果池已经包含一个等于此String对象的字符串(用equals(oject)方法确定),则返回池中的字符串, 否则,将intern返回的引用指向当前字符串 。...明白了哈 ---- intern源码 intern 在JDK里是native ,所以只能找C++的代码了。 JDK8对应的哈 ? ? 看看basic_add 返回的啥 ?...so ~ , 这样就好理解intern机制了吧 。
我一惊,马上去验证,竟然真的错了,而且在完全没意料到的地方!我开始以为只是疏漏,一细想,发现不简单,遇到了百思不得其解的问题了。所以,这篇文章还得再聊聊字符串。...join()方法不止是拼接 我先把那个问题化简一下吧: ss0 = 'hi' ss1 = 'h' + 'i' ss2 = ''.join(ss0) print(ss0 == ss1 == ss2) >...Intern 机制失效的情况 join() 方法的神奇用处使我不得不改变对 Intern 机制的认识,本小节就带大家重新学习一下 Intern 机制吧。...所以,看似被 intern 的两个字符串,实际可能不是 Intern 机制的结果,而是其它机制的结果。同样地,看似不能被 intern 的两个字符串,实际可能被其它机制以类似方式处理了。...作为一个低天赋的人,受此鼓舞,我会继续追问那些看似没意义的问题(“如何删除字符串”、“如何复制字符串”…),一点一点地学习 Python ,以我的方式理解它。同时,希望能给我的读者们带来一些收获。
String.intern() 方法有什么作用?...98 total views, 3 views today String.intern() 方法可以使得所有含相同内容的字符串都共享同一个内存对象。...当调用 intern 方法时,如果字符串常量池中已经存在该字符串,那么返回池中的字符串;否则将此字符串添加到字符串常量池中,并返回字符串的引用。...JDK1.6 和 JDK1.7 在 intern() 方法的实现上,有相同,也有不同。 相同点: 先去查看字符串常量池是否有该字符串,如果有,则返回字符串常量池中的引用。...注意:字符串常量池中的 String 对象,也是可以被 GC 回收的,只要它不再被引用了。 String.intern 方法可以减少内存中相同字符串的数量,节省一些内存空间。
转载自 https://blog.csdn.net/soonfly/article/details/70147205 在翻《深入理解Java虚拟机》的书时,又看到了2-7的 String.intern(...当调用 intern() 方法时,编译器会将字符串添加到常量池中(stringTable维护),并返回指向该常量的引用。 ? ?...六、JDK 1.7后,intern方法还是会先去查询常量池中是否有已经存在,如果存在,则返回常量池中的引用,这一点与之前没有区别,区别在于,如果在常量池找不到对应的字符串,则不会再将字符串拷贝到常量池,...指向的是堆中的对象,再进行intern方法时,对str1和str2已经没有影响了,所以返回false。...(s == s1.intern()); System.out.println(s == s2.intern()); System.out.println(s1 == s2.intern()); A
OOM异常通常会有Perm区的OOM(java7及以前)和HeapSpace的OOM,这两种各有不同的排查手段,但是在review上述两种案例的过程中,String.intern()是出现很多的一个方法...6,7,8中的String.intern 这篇文章主要讲述了在java6中String.intern是怎么实现的以及java7和java8对它作了哪些改变。...在Java6的时代,很多标准禁止使用String.intern(),因为如果不加控制地使用String.intern(),很可能导致OOM。...) java6中这样构建的字符串常量池最大的问题在于它所处的地址——PermGen(永久代)。...基于这些限制,你在使用String.intern的时候必须特别小心——最好不要使用Sting.intern缓存任何不受控制的用户输入。
方法,JDK 文档这样写:当调用 intern 方法时,如果常量池(内置在 JVM 中的)中已经包含相同的字符串,则返回池中的字符串。..."abc"; } intern 方法的小特性 其实 intern 的使用并不复杂,上面的例子已经讲得非常清晰。...我们再复习一下使用常量池的两个方法: 用双引号创建的 String ,自动使用常量池 使用 String 的 intern 方法,使用常量池 那么,现在,我们祭出网上流传很广的题目: public static...不适合用 intern 方法的情况 由于 JVM 里面的 C++写的 的 HashMap 设计并不像 JDK 的 HashMap 这么科学(超过链表负载链表转红黑树)。...所以,如果你有几千万个不同的 String 要使用 intern 丢进常量池的话,那么,查找起来会非常慢。
参考链接: Java字符串之-intern() // ==与equals的区别: // ==: // 1、比较的是操作符两端的操作数是否是同一个对象 // 2、两边的操作数必须是同一类型的(可以是父子类之间...String str1 = new StringBuilder("计算机").append("软件").toString(); System.out.println(str1.intern() == str1...); String str2 = new StringBuilder("ja").append("va").toString(); System.out.println(str2.intern() ==...产生差异的原因是:在JDK1.6中,intern()方法会把首次遇到的字符串实例复制到永久代(常量池)中,返回的也是永久代中这个字符串实例的引用,而由StringBuilder创建的字符串实例在Java...而JDK1.7(以及部分其他虚拟机,例如JRockit)的intern()实现不会再复制实例,只是在常量池中记录首次出现的实例引用, 因此intern()返回的引用和有StringBuilder创建的那个字符串实例是同一个
intern简介 intern是String类中的一个native方法,所以它底层是用c++来实现的。感兴趣的同学可以去查看下JVM的源码了解更多的内容。 这里我们主要谈一下intern的作用。...intern返回的是这个String所代表的对象,怎么理解呢?...所以,当且仅当 s.equals(t) 的时候s.intern() == t.intern()。...Instance size: 24 bytes Space losses: 0 bytes internal + 2 bytes external = 2 bytes total 分析实际的问题...有了上面的知识,让我们分析一下下面的实际问题吧: String a =new String(new char[]{'a','b','c'}); String b = a.intern
1.为什么要介绍intern()方法 intern()方法设计的初衷,就是重用String对象,以节省内存消耗。这么说可能有点抽象,那么就用例子来证明。...这个例子也比较简单,就是为了证明使用intern()比不使用intern()消耗的内存更少。...自然也证明了intern()节省内存的结论。 细心的同学会发现使用了intern()方法后程序运行时间有所增加。...这是因为程序中每次都是用了new String后又进行intern()操作的耗时时间,但是不使用intern()占用内存空间导致GC的时间是要远远大于这点时间的。 ...2.深入认识intern()方法 JDK1.7后,常量池被放入到堆空间中,这导致intern()函数的功能不同,具体怎么个不同法,且看看下面代码,这个例子是网上流传较广的一个例子,分析图也是直接粘贴过来的
本文将从源码角度分析String.intern方法的作用及其适用场景。...其次,从源码中我们可以看到,intern方法的逻辑还是比较复杂的,所以对于它返回的结果,我们不应该是立即使用,然后就丢弃,这样得不偿失。...最后,由intern本身的机制我们可以得知,调用intern方法的string必须是大量重复的,否则也没有意义。...不过之后我做了些性能测试,发现intern的性能比我预想的要差很多,所以这种场景也不太适用了。...最后总结下,intern方法主要用于那些,动态创建的,会较长时间存活的,最好是会多次使用的,且存在大量重复的string。并且,调用intern方法的代码段对性能没有非常严格的要求。
领取专属 10元无门槛券
手把手带您无忧上云