首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏捞月亮的小北

    toString().intern()中的intern()中的作用和使用

    在Java中,toString().intern()​这个表达式通常用在一个对象的字符串表示上,用于将该字符串对象放入字符串池(String Pool)中,并返回字符串池中该字符串的引用。 intern() : 这是String​类的一个方法。当调用一个字符串对象的intern()​方法时,JVM会检查字符串池中是否存在相同内容的字符串。 性能提升: 比较两个通过intern()​方法处理过的字符串时,由于它们可能指向同一个内存地址(如果内容相同),比较操作更快。 一致性: 在某些需要确保字符串唯一性或比较相等情况的场景下,使用intern()​可以帮助维持数据的一致性。 因此,应当根据具体场景合理应用intern()​方法。

    38310编辑于 2024-07-01
  • 来自专栏编程从踩坑到跳坑

    String::intern方法

    (); 从上面代码块中得知,String::intern方法是一个native方法,其底层实现是通过c/cpp实现的。 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。 它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。 然而在JDK6与JDK7+由于虚拟机的调整,intern返回的对象有所不同。 仅讨论hotspot的实现 下面代码在JDK6与JDK8中会有不同的结果。 因此intern返回的对象与StringBuilder创建出来的是同一个引用。

    56620发布于 2020-01-14
  • 来自专栏JusterZhu

    C# Intern Pool

    1.概要 驻留池(Intern Pool)是一个用于存储字符串的内部数据结构。这个概念是由.NET提供的一项优化,主要用于减少系统对内存的使用。 你可以通过调用 String.Intern() 方法强制将一个字符串添加到驻留池: string c = new StringBuilder().Append("test").ToString(); 请注意,过度使用 String.Intern() 可能会导致内存问题,因为一旦字符串被添加到驻留池,就无法被垃圾收集器回收,除非应用程序结束。所以在大多数情况下,你应当让.NET自己管理驻留池。 这也是为什么要小心使用String.Intern()方法的原因之一。过度使用这个方法会导致大量的字符串被驻留,从而消耗大量的内存,而这部分内存在应用程序运行期间无法被回收。 System.String类提供了两个方法来处理驻留池:Intern()和 IsInterned()。 Intern(string str):此方法用于将一个字符串添加到驻留池。

    34610编辑于 2023-10-24
  • 来自专栏码匠的流水账

    聊聊java String的intern

    序 本文主要研究一下java String的intern String-Pool-Java1.png String.intern() java.base/java/lang/String.java } 当调用intern方法时,如果常量池已经包含一个equals此String对象的字符串,则返回池中的字符串 当调用intern方法时,如果常量池没有一个equals此 之前,string table已经有了tomcat,因而intern返回tomcat,不会指向stringObject stringObject.intern(); String 之前,string table没有tomcat,因而intern指向stringObject stringObject.intern(); String stringLiteral 都是interned的 doc 浅谈String的intern Why does String.intern() return different results under JDK8 and JDK9

    62130发布于 2019-04-06
  • 来自专栏JMCui

    String 的 intern() 方法解析

    一、概述 JDK7 之前和之后的版本,String 的 intern() 方法在实现上存在差异,本文的说明环境是 JDK8,会在文末说明 intern() 方法的版本差异性。 将栈中的 s1 指向字符串常量池中的字符串【"jmcui"】实例 System.out.println("s1 == s1.intern() :" + (s1 == s1.intern () == s3.intern() :" + (s2.intern() == s3.intern())); // true } } s1 == s1.intern() 返回 true,因为字面量的创建方式是在字符串常量池中生成实例 s1 == s2.intern() 返回 true,当 s2 调用 intern() 方法的时候,发现常量池中已经存在该字符串,则直接返回了该引用(s1 的引用)。 s2.intern() == s3.intern() 返回 true,前面说明 s2 的 intern() 返回的是 s1 的引用,s3 的 intern() 也是一样的道理,因此 s2 的 intern

    71410发布于 2019-11-14
  • 来自专栏allsmallpi博客

    几张图轻松理解String.intern()

    转载自 https://blog.csdn.net/soonfly/article/details/70147205 在翻《深入理解Java虚拟机》的书时,又看到了2-7的 String.intern( 其实要搞明白String.intern(),我总结了下面几条规则:  一、new String都是在堆上创建字符串对象。 当调用 intern() 方法时,编译器会将字符串添加到常量池中(stringTable维护),并返回指向该常量的引用。  ? ? 六、JDK 1.7后,intern方法还是会先去查询常量池中是否有已经存在,如果存在,则返回常量池中的引用,这一点与之前没有区别,区别在于,如果在常量池找不到对应的字符串,则不会再将字符串拷贝到常量池, ());  System.out.println(s == s2.intern());  System.out.println(s1 == s2.intern());  A:false,false,true

    67710发布于 2021-02-25
  • 来自专栏javathings

    String.intern() 方法有什么作用?

    String.intern() 方法有什么作用? 98 total views, 3 views today String.intern() 方法可以使得所有含相同内容的字符串都共享同一个内存对象。 当调用 intern 方法时,如果字符串常量池中已经存在该字符串,那么返回池中的字符串;否则将此字符串添加到字符串常量池中,并返回字符串的引用。 JDK1.6 和 JDK1.7 在 intern() 方法的实现上,有相同,也有不同。 相同点: 先去查看字符串常量池是否有该字符串,如果有,则返回字符串常量池中的引用。 String.intern 方法可以减少内存中相同字符串的数量,节省一些内存空间。

    4.3K30发布于 2018-11-13
  • 来自专栏小工匠聊架构

    JVM - 一个案例反推不同JDK版本的intern机制以及intern C++源码解析

    String str2 = new StringBuilder("计算机").append("技术").toString(); System.out.println(str2 == str2.intern ()); String s2 = new StringBuilder("计算机技术").toString(); System.out.println(s2 == s2.intern 否则,将intern返回的引用指向当前字符串 。 明白了哈 ---- intern源码 intern 在JDK里是native ,所以只能找C++的代码了。 JDK8对应的哈 ? ? 看看basic_add 返回的啥 ? so ~ , 这样就好理解intern机制了吧 。

    84420发布于 2021-08-17
  • 来自专栏入门到放弃之路

    从String的intern()到常量池

    intern() 先看一下intern()这个方法的描述: 用二级英文水平翻译一波,大意就是一个string调用intern()的时候,如果池中有和这个字符串值相等的字符串对象,就会将字符串池中的字符串对象返回 //true System.out.println(str1.intern() == str2); //false System.out.println(str1.intern ; //false System.out.println(str3.intern() == str4); //true //第三部分 测试char[]创建的字符串调用intern intern()从字符串池中获取的是常量池中str4的gh引用。 intern()从字符串池中获取的是堆中str3的gh引用。 从上面的代码中也得出结论:intern()可以将堆中创建的且字符串池没有等值引用的字符串引用放入字符串池。

    44220编辑于 2022-05-09
  • 来自专栏程序那些事

    JVM系列之:String.intern和stringTable

    intern简介 intern是String类中的一个native方法,所以它底层是用c++来实现的。感兴趣的同学可以去查看下JVM的源码了解更多的内容。 这里我们主要谈一下intern的作用。 intern返回的是这个String所代表的对象,怎么理解呢? 所以,当且仅当 s.equals(t) 的时候s.intern() == t.intern()。 在java对象的实例化过程中,所有的字符串字面量都会在实例化的时候自动调用intern方法。 所有的字符串字面量在初始化的时候会默认调用intern方法。 也就是说”def“在初始化的时候,已经调用了一次intern了,这个时候String table中已经有”def“这个String了。

    61421发布于 2020-07-28
  • 来自专栏后端架构

    String的intern方法使用场景

    使用场景 intern() 方法是 Java 中的一个方法,它用于将字符串对象添加到字符串常量池中,并返回该字符串在常量池中的引用。 因此,在多线程环境下使用 `intern()` 方法时,需要采取相应的同步措施来确保线程安全。 另外,需要注意的是,使用 `intern()` 方法也可能会带来一些性能问题。 由于在常量池中查找字符串需要进行哈希计算和比较操作,因此在大量使用 `intern()` 方法时可能会影响程序的性能。因此,在使用 `intern()` 方法时需要根据具体情况进行权衡和优化。 () == str2); System.out.println(str2.intern() == str1); System.out.println(str3.intern 记得曾经推特的工程师使用intern()对地址进行内存优化,使得原本相同的地址占用不同的内存问题得到了释放,intern()虽然会有性能影响,但是看你的使用场景。

    55310编辑于 2023-12-18
  • 来自专栏程序那些事

    JVM系列之:String.intern的性能

    那么String.intern的性能怎么样呢?我们一起来看一下。 String.intern和G1字符串去重的区别 之前我们提到了,String.intern方法会返回字符串常量池中的字符串对象的引用。 而G1垃圾回收器的字符串去重的功能其实和String.intern有点不一样,G1是让两个字符串的底层指向同一个byte[]数组。 有图为证: ? String.intern的性能 我们看下intern方法的定义: public native String intern(); 大家可以看到这是一个native的方法。 intern的用处不是在于速度,而是在于节约Heap中的内存使用。

    54521发布于 2020-07-29
  • 来自专栏Java技术栈

    干货 | 深入分析 string.intern() 方法

    static void main(String[] args) { String str1 = new String("hello") + new String("world"); str1.intern String str2 = "helloworld"; System.out.println(str1 == str2);//true System.out.println(str1.intern () == str2);//true } } 大家对上面代码的运行结果一定很疑惑吧,第二个为true可以理解,因为intern的返回值本来就是该常量在常量池中的地址,但是为什么第一个也是true呢? 答案就是这个intern的实现方式。 intern检测到这个常量在常量池中不存在的时候,不会直接在常量池中创建该对象了,而是将堆中的这个对象的引用直接存到常量池中,减少内存开销。

    45020发布于 2019-11-04
  • 来自专栏零基础使用Django2.0.1打造在线教育网站

    Python中is和==的区别及intern机制

    也就是说字符串中没有空格则会默认开启intern机制,有则就不会开启了。 你现在可能会好奇Python为什么会这么做呢? 因为Python的内置函数intern()能显式的对任意字符串进行intern,就说明并不是实现难度的问题,解决这个问题最好是查看Python的源码,可以找到答案,在源代码StringObject.h中的注释能够找到 它们不都只是包含字母吗,没有空格应该是被主动intern的呀?的确是不错,但是你忽略了一个事实。 3、单词,即Python标识符是不可修改的,默认开启intern机制,是共用对象,当引用计数为0时自动被回收。 5、极少数特殊情况下(如上述最后一个例子时),也不会主动开启intern机制。 6、在Python的小整数池[-5,256]这个范围内也是默认开启intern机制。

    71720发布于 2019-11-06
  • 来自专栏Java开发者杂谈

    Java-String.intern的深入研究

    When---什么时候需要了解String的intern方法: 面试的时候(蜜汁尴尬)! 但其实,我们在实际的编程中也可能碰到可以利用String.intern方法来提高程序效率或者减少内存占用的情况,这个我们等下会细说。 It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals 上面是jdk源码中对intern方法的详细解释。简单来说就是intern用来返回常量池中的某字符串,如果常量池中已经存在该字符串,则直接返回常量池中该对象的引用。 显示调用String的intern方法的时候; 2. 直接声明字符串字面常量的时候,例如: String a = "aaa"; // 3.

    95770发布于 2018-03-14
  • 来自专栏沉默王二

    教妹学 Java 第 35 讲:intern

    “就是美团技术团队深入解析 String.intern() 那篇啊!”三妹回答。 精品中的精品,看完后你应该对 String 的 intern 彻底理解了才对呀。” 这个变化也直接影响了 String.intern() 方法在执行时的策略,Java 7 之前,执行 String.intern() 方法的时候,不管对象在堆中是否已经创建,字符串常量池中仍然会创建一个内容完全相同的新对象 三妹长舒一口气,大有感慨 intern 也没什么难理解的意味。 不过需要注意的是,尽管 intern 可以确保所有具有相同内容的字符串共享相同的内存空间,但也不要烂用 intern,因为任何的缓存池都是有大小限制的,不能无缘无故就占用了相对稀缺的缓存空间,导致其他字符串没有坑位可占

    56510发布于 2021-06-16
  • 来自专栏用户8644135的专栏

    JVM系列之:String.intern和stringTable

    intern简介 intern是String类中的一个native方法,所以它底层是用c++来实现的。感兴趣的同学可以去查看下JVM的源码了解更多的内容。 这里我们主要谈一下intern的作用。 intern返回的是这个String所代表的对象,怎么理解呢? 所以,当且仅当 s.equals(t) 的时候s.intern() == t.intern()。 在java对象的实例化过程中,所有的字符串字面量都会在实例化的时候自动调用intern方法。 所有的字符串字面量在初始化的时候会默认调用intern方法。 也就是说”def“在初始化的时候,已经调用了一次intern了,这个时候String table中已经有”def“这个String了。

    48330发布于 2021-06-18
  • 来自专栏刷题笔记

    不同JDK版本之间 intern 方法有啥区别?

    没看出啥区别 是我太菜吗?》 就是 Java堆加进来了,原来是字符串存在 字符串常量池,现在是放在 Java堆 常量池存引用 。 堆中不存在,在常量池中创建、

    77720发布于 2021-04-14
  • 来自专栏JavaNew

    通过反编译深入理解Java String及intern

    对于堆中的字符串对象,可以通过 intern() 方法来将字符串添加的常量池中,并返回指向该常量的引用。 结果 #2:str2调用intern方法,会将str2中值(“string”)复制到常量池中,但是常量池中已经存在该字符串(即str1指向的字符串),所以直接返回该字符串的引用,因此str1==str2 47: invokevirtual #11:调用String.intern方法。 从38到41的对应的源码就是new String("baseStr01").intern()。 这个原因主要是从JDK 1.7后,HotSpot 将常量池从永久代移到了元空间,正因为如此,JDK 1.7 后的intern方法在实现上发生了比较大的改变,JDK 1.7后,intern方法还是会先去查询常量池中是否有已经存在 ()); System.out.println(s == s2.intern()); System.out.println(s1 == s2.intern()); A:false,false,true,

    36520编辑于 2022-05-09
  • 来自专栏Python无止境

    join()方法的神奇用处与Intern机制的软肋

    按照之前在“特权种族”那篇文章的总结,我对字符串 Intern 机制有这样的认识: Python中,字符串使用Intern机制实现内存地址共用,长度不超过20,且仅包括下划线、数字、字母的字符串才会被intern Intern 机制失效的情况 join() 方法的神奇用处使我不得不改变对 Intern 机制的认识,本小节就带大家重新学习一下 Intern 机制吧。 不被intern VS 被"intern" 'python!' 所以,看似被 intern 的两个字符串,实际可能不是 Intern 机制的结果,而是其它机制的结果。同样地,看似不能被 intern 的两个字符串,实际可能被其它机制以类似方式处理了。 如此种种,便提高了理解 Intern 机制的难度。 就我在上篇文章中所关心的“复制字符串”话题而言,只有当 Intern 机制与其它这些机制统统失效时,才能做到复制字符串。

    50720发布于 2019-04-10
领券