当前位置: 首页 > 面试题库 >

Java如何存储字符串以及子字符串在内部如何工作?[关闭]

赫连黎昕
2023-03-14
问题内容
class StringTesting {
        public static void main(String args[])
        {
            String str = "abcd";
            String str1 = new String("abcd");
            String str2 = str.substring(0,2);
            String str3 = str.substring(0,2);
            String str4 = str.substring(0,str.length());
            String str5 = str1.substring(0,2);
            String str6 = str1.substring(0,2);
            String str7 = str1.substring(0,str1.length());

            System.out.println(str2 == str3);
            System.out.println(str == str4);
            System.out.println(str5 == str6);
            System.out.println(str1 == str7);
        }
    }

这是我在Java 1.6.0_27上获得的输出:

    false
    true
    false
    true

有人可以解释一下输出结果吗?我知道Java区分存储在堆中的String和存储在字符串“公共池”(可以被嵌入)中的String。在内部,它们的表示形式有何不同。它如何更改子字符串算法。请在适当的地方引用书籍/文章/博客等。


问题答案:

查看评论:

    String str = "abcd";  // new String LITERAL which is interned in the pool
    String str1 = new String("abcd"); // new String, not interned: str1 != str
    String str2 = str.substring(0,2); // new String which is a view on str
    String str3 = str.substring(0,2); // same: str3 != str2
    String str7 = str1.substring(0,str1.length()); // special case: str1 is returned

笔记

  • 从Java 7u6开始,子字符串返回一个新字符串,而不是原始字符串的视图(但这在该示例中没有区别)
  • 致电时的特殊情况str1.substring(0,str1.length());-请参见代码:
        public String substring(int beginIndex, int endIndex) {
        //some exception checking then
        return ((beginIndex == 0) && (endIndex == value.length)) ? this
                : new String(value, beginIndex, subLen);
    }

编辑

什么是观点?

在Java 7u6之前,String基本上是a
char[],其中包含带有偏移量和计数的字符串count字符(即,字符串由从中的offset位置开始的字符组成char[])。

调用子字符串时,将创建一个具有相同char[]但不同的偏移量/计数的新字符串,以有效地在原始字符串上创建视图。(如上所述,当count =length和offset = 0时除外)。

由于Java 7u6,新char[]创建的每个时间,因为没有更多的count还是offset外地的字符串类。

公用池到底存储在哪里?

这是特定于实现的。池的位置实际上已在最新版本中移动。在较新的版本中,它存储在堆中。

如何管理游泳池?

主要特征:

  • 字符串文字存储在池中
  • 实习字符串存储在池中(new String("abc").intern();
  • 当一个字符串S被拘留(因为它是文字还是因为intern()被调用),JVM将参考返回一个字符串池中是否有一个是equalsS(因此"abc" == "abc"应该总是返回true)。
  • 可以对垃圾池中的字符串进行垃圾回收(这意味着如果某个被填充的字符串变满,可能会在某个阶段将其从池中删除)


 类似资料:
  • 我一直在用Swift 3更新我的一些旧代码和答案,但当我使用Swift字符串和子字符串进行索引时,事情变得很混乱。 具体来说,我尝试了以下方法: 第二行给出了以下错误 “String”类型的值没有成员“substringWithRange” 我看到,String现在确实有以下方法: 起初我真的很困惑,所以我开始围绕索引和范围玩。这是子串的后续问答。我在下面添加一个答案来展示它们是如何使用的。

  • 我试图确切地理解Java字符串是如何不可变的。我明白这应该是一个简单的概念,但在阅读了几个在线网页后,我仍然不太明白。 我不明白Java字符串是如何“不可变”的。我目前有以下代码: 我的输出如下: 如果字符串应该是不可变的,为什么会发生这种情况?为什么我能给字符串重新赋值?

  • 问题内容: 通常,我在互联网上的许多文章中都读到,当我们编写上面的语句时,会创建两个对象。在堆上创建一个String对象,在Literal Pool上创建一个字符串对象。并且堆对象还引用在Literal Pool上创建的对象。(如果我的陈述是错误的,请更正。) 请注意,以上解释是根据我阅读互联网上一些文章后的理解得出的。 所以我的问题是..有什么方法可以停止在文字池中创建字符串对象。怎么做? [请

  • 我想对字符串执行子字符串操作。我有字符串<代码> 我尝试了finame=mainname。子字符串(0,mainname.lastIndexOf(“.”) 但我得到了<代码>

  • 我有两根绳子 在两种情况下,我应该删除

  • 问题内容: 有没有一种方法可以在Python中对字符串进行子字符串化,以从第三个字符到字符串末尾获取新的字符串? 也许喜欢吗? 如果离开第二部分意味着“直到最后”,而如果离开第一部分,它是否从头开始? 问题答案: Python称这个概念为“切片”,它不仅适用于字符串,还适用于更多的领域。看看这里的一个全面的介绍。