标签: string-interning

什么是Java String interning?

什么是Java中的String Interning,何时应该使用它,为什么?

java string string-interning

219
推荐指数
5
解决办法
10万
查看次数

我们何时应该在字符串文字上使用String的实习方法

根据String #intern(),intern如果在String池中找到String,则该方法应该从String池返回String,否则将在String池中添加新的字符串对象并返回此String的引用.

所以我试过这个:

String s1 = "Rakesh";
String s2 = "Rakesh";
String s3 = "Rakesh".intern();

if ( s1 == s2 ){
    System.out.println("s1 and s2 are same");  // 1.
}

if ( s1 == s3 ){
    System.out.println("s1 and s3 are same" );  // 2.
}
Run Code Online (Sandbox Code Playgroud)

我期待s1 and s3 are same将被打印为s3被实习,并且s1 and s2 are same不会被打印.但结果是:两行都打印出来.这意味着,默认情况下,字符串常量被实现.但如果是这样,那么为什么我们需要这种intern方法呢?换句话说,我们什么时候应该使用这种方法?

java string string-interning

184
推荐指数
5
解决办法
11万
查看次数

为什么(仅)某些编译器对相同的字符串文字使用相同的地址?

https://godbolt.org/z/cyBiWY

我可以'some'在MSVC生成的汇编代码中看到两个文字,但只有一个有clang和gcc.这导致完全不同的代码执行结果.

static const char *A = "some";
static const char *B = "some";

void f() {
    if (A == B) {
        throw "Hello, string merging!";
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释这些编译输出之间的差异和相似之处吗?为什么即使没有请求优化,clang/gcc也会优化某些内容?这是某种未定义的行为吗?

我还注意到,如果我将声明更改为下面显示的声明,则clang/gcc/msvc根本不会"some"在汇编代码中留下任何声明.为什么行为不同?

static const char A[] = "some";
static const char B[] = "some";
Run Code Online (Sandbox Code Playgroud)

c++ string-literals string-interning language-lawyer

88
推荐指数
3
解决办法
6562
查看次数

intern()在Java 6和Java 7中表现不同

class Test {
    public static void main(String...args) {
        String s1 = "Good";
        s1 = s1 + "morning";
        System.out.println(s1.intern());
        String s2 = "Goodmorning";
        if (s1 == s2) {
            System.out.println("both are equal");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码在Java 6和Java 7中生成不同的输出.在Java 6中,s1==s2条件返回false并在Java 7中s1==s2返回true.为什么?

为什么这个程序在Java 6和Java 7中产生不同的输出?

java string string-interning java-6 java-7

54
推荐指数
6
解决办法
5661
查看次数

.Net Framework中的字符串实习 - 有什么好处以及何时使用实习

我想知道特定于.Net框架的字符串实习的过程和内部.还想知道使用实习的好处以及我们应该使用字符串实习来提高性能的场景/情况.虽然我已经从Jeffery Richter的CLR书中学习实习,但我仍然感到困惑,并希望更详细地了解它.

[编辑]使用示例代码询问具体问题如下:

private void MethodA()
{
    string s = "String"; // line 1 - interned literal as explained in the answer        

    //s.intern(); // line 2 - what would happen in line 3 if we uncomment this line, will it make any difference?
}

private bool MethodB(string compareThis)
{
    if (compareThis == "String") // line 3 - will this line use interning (with and without uncommenting line 2 above)?
    {
        return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

.net c# string performance string-interning

40
推荐指数
5
解决办法
1万
查看次数

何时在String文字上使用intern()

我看到很多这样的遗留代码:

class A {
    public static final String CONSTANT = "value".intern();
    ...
}
Run Code Online (Sandbox Code Playgroud)

我没有看到intern()的任何原因,因为在Javadoc中可以读取:"所有文字字符串和字符串值常量表达式都被实现." 是否有一些这样的意图,也许是在过去的语言修订版中?

java string string-interning

38
推荐指数
3
解决办法
5407
查看次数

常见的JavaScript实现是否使用字符串实习?

常见的JavaScript引擎(如V8和WebKit的JavaScriptCore)是否使用字符串实习来处理JavaScript字符串?或者他们实际上在内存中保留了多个相同字符串的实例?

javascript programming-languages webkit v8 string-interning

33
推荐指数
3
解决办法
5213
查看次数

字符串文字的行为令人困惑

String文字的行为在下面的代码中非常混乱.

我可以理解第1行,第2行和第3行true,但为什么是第4行false

当我打印两者的哈希码时,它们是相同的.

class Hello
{
   public static void main(String[] args)
   {
      String hello = "Hello", lo = "lo";
      System.out.print((Other1.hello == hello) + " ");     //line 1
      System.out.print((Other1.hello == "Hello") + " ");   //line 2
      System.out.print((hello == ("Hel"+"lo")) + " ");       //line 3
      System.out.print((hello == ("Hel"+lo)) + " ");         //line 4
      System.out.println(hello == ("Hel"+lo).intern());      //line 5
      System.out.println(("Hel"+lo).hashCode());   //hashcode is 69609650 (machine depedent)
      System.out.println("Hello".hashCode());       //hashcode is same WHY ??.
   }
}

class Other1 { static String hello …
Run Code Online (Sandbox Code Playgroud)

java string string-interning

30
推荐指数
1
解决办法
2337
查看次数

真实生活,在Java中使用String.intern()的实际例子?

我已经看到很多原始的例子描述了String intern()的工作方式,但我还没有看到一个可以从中受益的真实用例.

我能想到的唯一情况是拥有一个接收大量请求的Web服务,由于僵化的架构,每个请求都非常相似.通过intern()在这种情况下使用请求字段名称,可以显着减少内存消耗.

任何人都可以提供在生产环境中使用intern()并取得巨大成功的示例吗?也许是一个流行的开源产品中的一个例子?

编辑:我指的是手动实习,而不是字符串文字的保证实习等.

java string permgen string-interning

24
推荐指数
2
解决办法
2940
查看次数

字符串实习真的很有用吗?

我不久前正在谈论字符串和各种语言,并且出现了字符串实习的主题.显然,Java和.NET框架会自动执行所有字符串以及多种脚本语言.从理论上讲,因为你不相同的字符串的多个副本,最终可以节省内存,这样可以节省时间,因为字符串相等比较是一个简单的指针比较,而不是一个O(N)通过串的每个字符运行.

但是我越是想到它,我越是怀疑这个概念的好处.在我看来,优势主要是理论上的:

  • 首先,要使用自动字符串实习,所有字符串必须是不可变的,这使得许多字符串处理任务比它们需要的更难.(是的,我听说过所有关于不变性的论点.这不是重点.)
  • 每次创建新字符串时,都必须根据字符串实习表检查它,这至少是O(N)操作.(编辑:.其中N是字符串的大小,表的不是大小,因为这是令人困惑的人)所以,除非字符串相等比较,新的字符串创建的比例是相当高的,这是不可能的,节省的净时间正值.
  • 如果字符串相等表使用强引用,那么当不再需要字符串时,它们将永远不会被垃圾收集,从而浪费内存.另一方面,如果表使用弱引用,则字符串类需要某种终结器来从表中删除字符串,从而减慢GC进程的速度.(这可能是相当显著,取决于字符串实习生表是如何实现的.最坏的情况下,删除从哈希表中的项目可能需要的O(N)的重建在某些情况下整个表的.)

这只是我思考实现细节的结果.有没有我错过的东西?在一般情况下,字符串实习是否实际上提供了任何显着的好处?

编辑2:好吧,显然我是在错误的前提下操作的.我正在谈话的人从未指出字符串实习对于新创建的字符串是可选的,事实上给人的印象是相反的情况是正确的.感谢Jon直接解决问题.另一个接受他的答案.

.net ruby python java string-interning

21
推荐指数
2
解决办法
3354
查看次数