string-interning相关内容
在Java中,显式声明的字符串由JVM进行插值,因此对同一字符串的后续声明将导致指向同一String实例的两个指针,而不是两个单独的(但相同的)字符串. 例如: public String baz() { String a = "astring"; return a; } public String bar() { String b = "astring"
..
https://godbolt.org/z/cyBiWY 我可以在MSVC生成的汇编代码中看到两个'some'文字,但是只有一个带有clang和gcc.这导致代码执行的结果完全不同. static const char *A = "some"; static const char *B = "some"; void f() { if (A == B) { th
..
因此,我意识到我要问的问题与一个又一次被打死的话题有关,但是,即使在阅读了我能找到的所有答案和文档后,我仍然很友善对字符串实习感到困惑.也许是由于我对JVM缺乏了解;可能是由于Java 7中引入的更改使上述许多答案和文档贬值了.无论哪种方式,我都被困住了,希望有人能帮助我更清楚地理解这个概念... String a = "text"; String b = new String("text"
..
常见的JavaScript引擎,例如V8和WebKit的JavaScriptCore,使用字符串实习来获取JavaScript字符串?或者他们实际上在内存中保留了多个相同字符串的实例? 解决方案 是的。通常,JS源中的任何文字字符串,标识符或其他常量字符串都是实体。然而,实现细节(确切地说是实例内容)会有所不同,以及发生实习的时间。 请注意,字符串值与String对象不同,字符串对象
..
两个问题。 当我们声明文字字符串时,我们搜索堆的字符串池中是否有相同的字符串。 这也是一个实习生(类 String 的方法实习生)? 在我看来,每个文字字符串声明都需要二进制搜索,所以当 n 是池中现有字符串的数量时,它至少要花费 log(n)。如果池中有许多字符串,则可能成本很高。 (可能需要权衡搜索成本和内存?)从这个角度来看,声明mant文字字符串可能很危险。 搜索成本的重要性
..
好的,这个问题是这个问题的延伸 Java字符串:" String s = new String(" silly");" 上述问题与此问题相同,但我有一个新的疑点。 根据 Effective Java 和答案在上面的问题中,我们应该不做 String s = new String(“一个新字符串”); ,因为这将创建不必要的对象。 我不确定这个结论,因为我认为Java正在做自
..
以下代码段打印出4个不同的哈希码,尽管重用了字符串常量和字面值。为什么字符串值没有在注释元素上实现? public class Foo { @Retention(RetentionPolicy.RUNTIME) @interface Bar { String CONSTANT =“foo”; 字符串值()默认值CONSTANT; } public static voi
..
由于Java的默认字符串实习有很多坏消息,我正在寻找替代方案。 你能否建议一个可以替代Java的API字符串实习?我的应用程序使用Java 6.我的要求主要是通过实习避免重复字符串。 关于坏消息: 字符串实习生是通过本机方法实现的。并且C实现使用大约1k个条目的固定大小,并且对于大量字符串进行非常差的扩展。 Java 6在Perm gen中存储实习字符串。因此不是GC并且可能导
..
我的问题是,如果实习生正在使用字符串和字符串,它有一个 SPC(字符串池常量),而实习生概念也适用于整数, 那么是否有任何整数池常量?不是它的工作方式如何? class InternExample { public void print() { Integer I = 10; 整数j = 10; String c =“a”; String s =“a”; Sys
..
我已经看过很多原始的例子,描述了String intern()的工作原理,但是我还没有看到一个可以从中受益的真实用例。 我能想到的唯一情况是拥有一个接收大量请求的Web服务,由于僵化的架构,每个请求都非常相似。通过intern()在这种情况下使用请求字段名称,可以显着减少内存消耗。 任何人都可以提供在生产环境中使用intern()的示例取得了巨大成功?也许是一个流行的开源产品中的一个例
..
public static void main(String [] args){ String str1 = new StringBuilder(“计算机”).append(“软件”)。toString(); System.out.println(str1.intern()== str1); String str2 = new StringBuffer(“ja”)。append(“va
..
我们可以完全禁用字符串的实习。它可能不是真的有用,但只是一个想法。我可以想到至少有一点可以提供帮助,即在jvm调整期间,控制perm gen的大小。 例如如果我发布一个OSGI框架,任何人都可以添加任意数量的自己的捆绑包,每个捆绑字符串实习可以完全搞砸我的调整参数。 (当然我知道我们应该调整给定的固定发行版,但仍然......) 任何想法!! 解决方案 Permgen的大小/用
..
我正在寻找一个可以列出已经内化的字符串的调试工具?理想情况下,我想加上一个标记,并在该标记后添加一个字符串列表。 提前致谢。 解决方案 也许最简单的方法是使用字节码查看器。任何实例化的字符串都将出现在包含字符串文字的类文件的constant_pool中。例如,在我回答的另一个StackOverflow问题的最近一个类文件中,我的代码中有以下字符串文字: “sun.awt.noeras
..
我试着查看Java的 String #intern()方法,但它是 public native String intern(); 一般情况下,如何实施实习?在String的情况下? 解决方案 对于Sun Java,从 JVM_InternString 开始,在线 jvm.cpp 。从技术上讲,实际的String方法是在 java / lang / String.c ,但它会立即调用
..
String literals的行为在下面的代码中非常混乱。 我可以理解第1行,第2行和第3行是是,但为什么第4行 false ? 当我打印哈希码时两者都是一样的。 class Hello { public static void main(String [] args ) { String hello =“Hello”,lo =“lo”; System.out.
..
我看到很多这样的遗留代码: A类{ public static final String CONSTANT = “值” .intern(); ... } 我认为没有任何理由intern(),就像在Javadoc中一样,可以读取:“所有文字字符串和字符串值常量表达式都是实例化的。”是否有一些这样的意图,可能是在语言的过去修订中? 解决方案 这是一种确保 CO
..
class Test { public static void main(String ... args){ String s1 =“Good”; s1 = s1 +“早上”; System.out.println(s1.intern()); String s2 =“Goodmorning”; if(s1 == s2){ System.out.println(“两者都相等”
..
何时应该将 String s作为对象进行比较,何时应该使用 equals 方法?为了确保,我总是使用等于,但这似乎不是很有效。在什么情况下我可以确定 string1 == string2 是否可以安全使用? 谢谢! 解决方案 你应该总是使用等于。您可以确定 string1 == string2 将在以下情况下有效: 你'已经确定你已经确定了其他方式的不同值(例如,你使用的是从集
..
根据 String #internon( ),实习生方法如果在String池中找到String,则应该从String池返回String,否则将在String中添加新的字符串对象池和此String的引用被返回。 所以我试过这个: String s1 =“Rakesh” ; String s2 =“Rakesh”; String s3 =“Rakesh”.intern();
..
什么是Java中的 String Interning ,什么时候我应该使用它?为什么? 解决方案 http:// docs。 oracle.com/javase/7/docs/api/java/lang/String.html#intern() 基本上做String.intern()on一系列字符串将确保具有相同内容的所有字符串共享相同的内存。因此,如果你有'john'出现1000次
..