首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

聊聊java Stringintern

序 本文主要研究一下java Stringintern 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 浅谈Stringintern Why does String.intern() return different results under JDK8 and JDK9

47530
您找到你想要的搜索结果了吗?
是的
没有找到

C# Intern Pool

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):此方法用于将一个字符串添加到驻留池。

12810

从Stringintern()到常量池

前言 在知乎上遇到一个刚学Java就接触字符串比较问题: 通常,根据"==比较是地址,equals比较是值"介个定理就能得到结果。...intern() 先看一下intern()这个方法描述: 用二级英文水平翻译一波,大意就是一个string调用intern()时候,如果池中有和这个字符串值相等字符串对象,就会将字符串池中字符串对象返回...从上面的代码中也得出结论:intern()可以将堆中创建且字符串池没有等值引用字符串引用放入字符串池。 同时,这也能说明String为什么不可变这个问题。...因为这样可以保证多个引用可以同时指向字符串池中同一个对象。如果字符串是可变,其中一个引用操作改变了对象值,对其他引用会有影响,这样显然是不可以。 言归正传 回到知乎上问题。...结语 Java中有时候很小问题也会发散出很多知识点,不论是底层还是JVM理论学习,结合应用案例会理解更加深刻。就像文中提到常量池就是class文件结构和类加载理论学习一部分。

25120

Stringintern方法使用场景

,而 str2 是通过 intern() 方法从常量池中获取引用。...这样可以减少内存使用,但是需要注意是,由于多个线程同时访问常量池,可能会导致线程安全问题。因此,在多线程环境下使用 `intern()` 方法时,需要采取相应同步措施来确保线程安全。...另外,需要注意是,使用 `intern()` 方法也可能会带来一些性能问题。由于在常量池中查找字符串需要进行哈希计算和比较操作,因此在大量使用 `intern()` 方法时可能会影响程序性能。...,锁定某个特定对象,我这个示例其实随意创建一个对象都可以,只要保证每次都取是唯一就可以了,借此引出intern()部分使用场景。...记得曾经推特工程师使用intern()对地址进行内存优化,使得原本相同地址占用不同内存问题得到了释放,intern()虽然会有性能影响,但是看你使用场景。

13310

Java-String.intern深入研究

When---什么时候需要了解Stringintern方法: 面试时候(蜜汁尴尬)!...虽然不想承认,不过面试时候经常碰到这种高逼格问题来考察我们是否真正理解了String不可变性、String常量池设计以及String.intern方法所做事情。...但其实,我们在实际编程中也可能碰到可以利用String.intern方法来提高程序效率或者减少内存占用情况,这个我们等下会细说。...上面是jdk源码中对intern方法详细解释。简单来说就是intern用来返回常量池中某字符串,如果常量池中已经存在该字符串,则直接返回常量池中该对象引用。...()); // jdk1.7之前为false,之后为true 下面我们延伸一下来讲讲字符串拼接优化问题: 1 String a = "1";

77070

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

()if type(person) is Person: # 记住这里最好使用is,不要使用== pythonintern机制 由于变量存储机制,python增加了字符串intern机制,也就是说值同样字符串对象...---- intern机制优点是:在创建新字符串对象时,会先在缓存池里面找是否有已经存在值相同对象(标识符,即只包含数字、字母、下划线字符),如果有则直接拿过来用(引用),避免频繁创建和销毁内存...因为Python内置函数intern()能显式对任意字符串进行intern,就说明并不是实现难度问题,解决这个问题最好是查看Python源码,可以找到答案,在源代码StringObject.h中注释能够找到...它们不都只是包含字母吗,没有空格应该是被主动intern呀?的确是不错,但是你忽略了一个事实。...5、极少数特殊情况下(如上述最后一个例子时),也不会主动开启intern机制。 6、在Python小整数池[-5,256]这个范围内也是默认开启intern机制。

55420

几张图轻松理解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

50310

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

我一惊,马上去验证,竟然真的错了,而且在完全没意料到地方!我开始以为只是疏漏,一细想,发现不简单,遇到了百思不得其解问题了。所以,这篇文章还得再聊聊字符串。...join()方法不止是拼接 我先把那个问题化简一下吧: ss0 = 'hi' ss1 = 'h' + 'i' ss2 = ''.join(ss0) print(ss0 == ss1 == ss2) >...Intern 机制失效情况 join() 方法神奇用处使我不得不改变对 Intern 机制认识,本小节就带大家重新学习一下 Intern 机制吧。...所以,看似被 intern 两个字符串,实际可能不是 Intern 机制结果,而是其它机制结果。同样地,看似不能被 intern 两个字符串,实际可能被其它机制以类似方式处理了。...作为一个低天赋的人,受此鼓舞,我会继续追问那些看似没意义问题(“如何删除字符串”、“如何复制字符串”…),一点一点地学习 Python ,以我方式理解它。同时,希望能给我读者们带来一些收获。

34120

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

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

4.1K30

Java 6,7,8中String.intern

OOM异常通常会有Perm区OOM(java7及以前)和HeapSpaceOOM,这两种各有不同排查手段,但是在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缓存任何不受控制用户输入。

93120

Java String 常量池 和 intern 方法 简析

方法,JDK 文档这样写:当调用 intern 方法时,如果常量池(内置在 JVM 中)中已经包含相同字符串,则返回池中字符串。..."abc"; } intern 方法小特性 其实 intern 使用并不复杂,上面的例子已经讲得非常清晰。...我们再复习一下使用常量池两个方法: 用双引号创建 String ,自动使用常量池 使用 String intern 方法,使用常量池 那么,现在,我们祭出网上流传很广题目: public static...不适合用 intern 方法情况 由于 JVM 里面的 C++写 HashMap 设计并不像 JDK HashMap 这么科学(超过链表负载链表转红黑树)。...所以,如果你有几千万个不同 String 要使用 intern 丢进常量池的话,那么,查找起来会非常慢。

21210

Javaintern()函数和字符串常量池

参考链接: 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创建那个字符串实例是同一个

57560

Java技术——你真的了解String类intern()方法吗

1.为什么要介绍intern()方法 intern()方法设计初衷,就是重用String对象,以节省内存消耗。这么说可能有点抽象,那么就用例子来证明。...这个例子也比较简单,就是为了证明使用intern()比不使用intern()消耗内存更少。...自然也证明了intern()节省内存结论。 细心同学会发现使用了intern()方法后程序运行时间有所增加。...这是因为程序中每次都是用了new String后又进行intern()操作耗时时间,但是不使用intern()占用内存空间导致GC时间是要远远大于这点时间。 ...2.深入认识intern()方法 JDK1.7后,常量池被放入到堆空间中,这导致intern()函数功能不同,具体怎么个不同法,且看看下面代码,这个例子是网上流传较广一个例子,分析图也是直接粘贴过来

72600

Java中String.intern作用及适用场景

本文将从源码角度分析String.intern方法作用及其适用场景。...其次,从源码中我们可以看到,intern方法逻辑还是比较复杂,所以对于它返回结果,我们不应该是立即使用,然后就丢弃,这样得不偿失。...最后,由intern本身机制我们可以得知,调用intern方法string必须是大量重复,否则也没有意义。...不过之后我做了些性能测试,发现intern性能比我预想要差很多,所以这种场景也不太适用了。...最后总结下,intern方法主要用于那些,动态创建,会较长时间存活,最好是会多次使用,且存在大量重复string。并且,调用intern方法代码段对性能没有非常严格要求。

30620

常见面试题之解读Stringintern()

intern()在面试中也是经常遇到,本文从案例以及debug来主要讲解intern()。这一块也是困扰本人很久一个问题,通过debug,查看字节码分析intern()作用,希望对大家有所帮助。...首先记住intern()作用:如果SCP(字符串常量池)中存在与A内容一样字符串对象C时,就返回C 地址;否则将A放入SCP中,返回A地址。...才是常量,其他方式都是新增一个堆对象,所以s1与s4式不同对象,看到堆地址也是不一样;s1.intern(),s4.intern(),按照上面intern()作用都想去常量池找,都没有,s1.intern...()先执行,所以会把s1放进常量池,地址为s1堆地址,当s4.intern()访问时,发现常量有了(s1放进去)所以直接返回s1.intern()存地址,两个时相等。...同样s1.intern() = s1时候,常量池存放地址就是s1存进去,必然相等。

18640
领券