Java的String内存池的实现是否遵循享元模式?我之所以有这个疑问,是因为我看到Intern中没有涉及外部状态。在GoF中,我读到内在状态和外在状态之间应该有一个正确的平衡。但在实习生中,一切都是内在的。或者我们应该说关于属性没有严格的规则,只是共享对象以减少内存就足以称之为享元。请帮助我理解。 最佳答案 不考虑实习,JavaString通过在字符串和通过substring和类似方法调用派生的字符串之间共享char[]来利用享元模式。不过,这也有不利的一面:如果您从一个巨大的字符串中取出一个小的子串,那么巨大的char[]将不符
publicstaticvoidmain(String[]args){Stringstr1=newStringBuilder("计算机").append("软件").toString();System.out.println(str1.intern()==str1);Stringstr2=newStringBuffer("ja").append("va").toString();System.out.println(str2.intern()==str2);}结果:truefalse第一个打印true,第二个打印false。为什么结果不同? 最佳答案
在Go中是否有等同于Java的Stringintern函数?我正在解析大量具有重复模式(标签)的文本输入。我想提高内存效率,并为每个标签存储指向单个字符串的指针,而不是为每次出现的标签存储多个字符串。 最佳答案 据我所知,不存在这样的功能。但是,您可以使用map轻松制作自己的map。字符串类型本身是一个uintptr和一个长度。因此,从另一个字符串分配的字符串只占用两个字。因此,您需要做的就是确保没有两个内容冗余的字符串。这是我的意思的一个例子。typeInternermap[string]stringfuncNewInterner
我遇到了thisquestion关于字典的内存管理,里面提到了intern功能。它到底有什么作用,什么时候使用?举个例子:如果我有一个名为seen的集合,它包含(string1,string2)形式的元组,我用它来检查重复项,存储(intern(string1),intern(string2))会提高性能w.r.t.内存还是速度? 最佳答案 来自Python3文档:sys.intern(string)Enterstringinthetableof“interned”stringsandreturntheinternedstring–
考虑:Strings1=newStringBuilder("Cattie").append("&Doggie").toString();System.out.println(s1.intern()==s1);//truewhy?System.out.println(s1=="Cattie&Doggie");//trueanotherwhy?Strings2=newStringBuilder("ja").append("va").toString();System.out.println(s2.intern()==s2);//falseStrings3=newString("Cattie
如果我使用String.intern()来提高性能,因为我可以使用“==”来比较实习字符串,我会遇到垃圾收集问题吗?interned字符串的垃圾回收机制与普通字符串有何不同? 最佳答案 String.intern()管理一个内部的、本地实现的池,它具有一些特殊的GC相关功能。这是旧代码,但如果重新实现,它将使用java.util.WeakHashMap。弱引用是一种保留指向对象的指针而不阻止它被收集的方法。对于一个统一的池(例如实习字符串)来说,这正是正确的选择。可以用下面的Java代码来证明实习字符串是垃圾回收的:publiccl
很多人都在谈论String.intern()的性能优势,但实际上我更感兴趣的是性能损失可能是什么。我主要担心的是:搜索成本:intern()确定可实习字符串是否存在于常量池中的时间。该成本如何随该池中的字符串数量而变化?同步:显然常量池是整个JVM共享的。当从多个线程一遍又一遍地调用intern()时,该池的行为如何?它执行多少锁定?性能如何随争用扩展?我担心所有这些事情,因为我目前正在开发一个金融应用程序,该应用程序由于重复的字符串而存在使用过多内存的问题。一些字符串基本上看起来像枚举值,并且只能具有有限数量的潜在值(例如货币名称(“USD”,“EUR”)),存在超过一百万份。Str
classTest{publicstaticvoidmain(String...args){Strings1="Good";s1=s1+"morning";System.out.println(s1.intern());Strings2="Goodmorning";if(s1==s2){System.out.println("bothareequal");}}}此代码在Java6和Java7中产生不同的输出。在Java6中,s1==s2条件返回false,而在Java7中,s1==s2返回true.为什么?为什么这个程序在Java6和Java7中产生不同的输出?
根据String#intern(),intern方法如果在字符串池中找到该字符串,则应该从字符串池中返回该字符串,否则将在字符串池中添加一个新的字符串对象并返回该字符串的引用。所以我尝试了这个:Strings1="Rakesh";Strings2="Rakesh";Strings3="Rakesh".intern();if(s1==s2){System.out.println("s1ands2aresame");//1.}if(s1==s3){System.out.println("s1ands3aresame");//2.}我期望s1和s3相同将被打印,因为s3被实习,而s1和s2相
在ruby的c扩展中,调用你可以做的方法rb_funcall(object,rb_intern("methodname"),argumentcount,arg1,arg2,…);其中rb_intern()返回方法名称的一些内部表示。我看到了一些代码,而不是IDmethod;CONST_ID(method,"methodname");rb_funcall(object,method,argumentcount,arg1,arg2,…);rb_intern()和CONST_ID到底有什么区别。CONST_ID()有哪些优势? 最佳答案