Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要了解字符串、字符串常量池和字符串intern方法_Java_String_String Interning_String Pool - Fatal编程技术网

Java 需要了解字符串、字符串常量池和字符串intern方法

Java 需要了解字符串、字符串常量池和字符串intern方法,java,string,string-interning,string-pool,Java,String,String Interning,String Pool,如果字符串常量池中没有字符串,如果我说 String s = "Java"; 那么将创建多少个对象 现在池子里又没东西了,我说 String s = new String("Java"); String s = new String("Java"); s.intern(); String s = new String("Java"); String s1 = s.intern(); 现在,将创建多少个对象 现在池子里又没东西了,我说 String s = new String("Java

如果字符串常量池中没有字符串,如果我说

String s = "Java";
那么将创建多少个对象

  • 现在池子里又没东西了,我说

    String s = new String("Java");
    
    String s = new String("Java");
    s.intern();
    
    String s = new String("Java");
    String s1 = s.intern();
    
    现在,将创建多少个对象

  • 现在池子里又没东西了,我说

    String s = new String("Java");
    
    String s = new String("Java");
    s.intern();
    
    String s = new String("Java");
    String s1 = s.intern();
    
    实习的方法会做什么

  • 现在池子里又没东西了,我说

    String s = new String("Java");
    
    String s = new String("Java");
    s.intern();
    
    String s = new String("Java");
    String s1 = s.intern();
    
    现在会发生什么

  • 请回答,因为我真的很困惑

    正如我在SCJP5 Kathy Sierra的书中读到的,当你用new创建一个字符串时,会创建两个对象,一个在堆上,一个在池中

  • 那么将创建多少个对象
  • 池中有一个
    字符串

  • 现在将创建多少个对象
  • 将创建一个
    字符串
    ,池中仍有一个
    字符串

  • 实习的方法会做什么
  • 它将尝试将一个
    “Java”
    放入池中,在那里找到另一个
    “Java”
    ,并从步骤1返回对该
    “Java”
    的引用

  • 现在会发生什么
  • 步骤1中的
    “Java”
    将返回,并且
    s1
    现在引用它

  • 如果字符串常量池中没有字符串,如果我说

    字符串s=“Java”

  • 那么将创建多少个对象

    在实习生池中创建一个字符串对象。
    s
    由该引用指定

  • 现在池子里又没东西了,我说

    String s = new String("Java");
    
    String s = new String("Java");
    s.intern();
    
    String s = new String("Java");
    String s1 = s.intern();
    
    字符串s=新字符串(“Java”); 现在将创建多少个对象。 创建两个字符串对象

  • 一个是interned
    “Java”
    ,另一个是与
    “Java”
    内容相同的新字符串

  • 现在池子里又没东西了,我说

    String s = new String("Java");
    
    String s = new String("Java");
    s.intern();
    
    String s = new String("Java");
    String s1 = s.intern();
    
    字符串s=新字符串(“Java”); s、 实习医生(); 实习的方法会做什么

  • 该方法将:

    调用intern方法时,如果池中已经包含一个字符串,该字符串等于equals(object)方法确定的该字符串对象,则返回池中的字符串。否则,此字符串对象将添加到池中,并返回对此字符串对象的引用

    因此,在本例中,该字符串被添加到池中,并返回对该字符串的引用

    最后一个问题是:

  • 现在池子里又没东西了,我说

    String s = new String("Java");
    
    String s = new String("Java");
    s.intern();
    
    String s = new String("Java");
    String s1 = s.intern();
    
    字符串s=新字符串(“Java”); 字符串s1=s.intern(); 现在会发生什么

  • 这里发生的是:

  • 字符串“Java”被添加到池中
  • 新字符串被创建,由相同的
    char[]
    数组“Java”支持
  • s.intern()

  • 我将假设在下面的每个示例中,您只需在新的JVM中加载和执行代码一次。(我还假设代码中没有其他地方使用文字
    “Java”
    …因为这会使事情复杂化。)


    1) 假设字符串常量池中没有字符串,如果 说

    那么将创建多少个对象

    加载方法时,将创建一个字符串并将其添加到池中


    2) 现在池子里又没东西了,我说

    String s = new String("Java");
    
    String s = new String("Java");
    s.intern();
    
    String s = new String("Java");
    String s1 = s.intern();
    
    现在将创建多少个对象

    加载方法时,将创建一个字符串并将其添加到池中

    运行代码时,
    new
    会创建第二个字符串,并且不会将其添加到池中


    3) 现在池子里又没东西了,我说

    String s = new String("Java");
    
    String s = new String("Java");
    s.intern();
    
    String s = new String("Java");
    String s1 = s.intern();
    
    实习的方法会做什么

    加载方法时,将创建一个字符串并将其添加到池中

    第二个字符串是由
    新建的
    创建的,它不会添加到池中

    intern
    调用返回第一个字符串。(你没有保留参考资料…)


    4) 现在池子里又没东西了,我说

    String s = new String("Java");
    
    String s = new String("Java");
    s.intern();
    
    String s = new String("Java");
    String s1 = s.intern();
    
    现在会发生什么

    与示例3相同。因此,
    s1
    将保存对表示
    “Java”
    字符串文本的
    字符串的引用


    我在SCJP5 Kathy Sierra的书中读到,当你用
    new
    创建一个字符串时,会创建两个对象,一个在堆上,一个在池中

    我怀疑这本书说的是否准确。(你在释义,我认为你的释义有点不准确。)

    不过,您的解释大致正确(这很重要!)表示文字的string对象是在加载代码片段1时创建并添加到池中的,而不是在执行代码片段时


    为了解决另一个困惑点:

    “实际上,我的意思是,从您给出的答案来看,字符串常量池中似乎总是会添加一个字符串。”

    这是不正确的。这是一个错误的概括

    虽然上述4种情况都是如此,但其他情况则不然。这取决于原始字符串的来源。在典型应用程序中,大多数文本数据都是从文件、套接字或用户界面读取的。在这种情况下,字符串将直接或通过库调用从字符数组中创建

    下面是一个简单(但不切实际)的示例,演示如何从字符串的组成字符创建字符串

    String s = new String(new char[]{'J', 'a', 'v', 'a'});
    
    在上面的代码段中,只创建了一个字符串,它不在字符串池中。如果希望生成的字符串位于字符串池中,则需要显式调用
    intern
    如下所示:

    String s = new String(new char[]{'J', 'a', 'v', 'a'});
    s = s.intern();
    
    。。。这将(如有必要)在字符串池2中创建第二个字符串


    1-显然,在一些JVM中,创建和插入字符串文字是惰性的,因此不可能100%确定地说它是什么时候创建的