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

将具有相同内容的两个字符串存储在同一存储位置吗?

包沈义
2023-03-14
问题内容

这是我在采访中遇到的一个问题。

我有两个字符串定义为

String s1="Java";
String s2="Java";

我的问题是这两个引用是否指向相同的内存位置。通常,当我们创建相同的字符串(不带new关键字)时,内容是否仅在内存中存储一​​次,并且具有相同内容的所有String对象仅引用同一位置,而没有多余地存储字符串“
Java”?s1和s2的哈希码相同。但是哈希码是否直接取决于对象的内存位置?


问题答案:

合并相同字符串的过程称为“ interning
”,并且许多语言编译器已经进行了很多年,但并非总是如此。问题的答案,尤其是由@ GennadyVanin–
Novosibirsk扩展的答案,取决于语言和编译器实现。对于Java,按照Java语言规范的要求,所有常量字符串都将被保留。但这只是常量字符串表达式,并且只有在同时编译它们时才可以。如果您有两个Java字符串在时间和空间上足够分开(
例如 ,编译成单独的JAR文件),则它们将不是同一对象。同样,动态创建的Java字符串( 例如
,各种toString()除非该方法通过明确要求,否则不会进行实习String.intern()。是的,对实习生字符串的所有使用都将共享相同的内存位置-
这就是为什么首先对字符串进行实习的重要原因。

至于其他语言,这是一个更大的问题,但是有了这些答案中的所有信息,我相信您可以在网络上对其进行研究。可以说,关于如何实现这一目标尚未达成共识。



 类似资料:
  • 下面的代码安全吗?编写类似这样的代码可能很有诱惑力: 该映射仅用于字符串文本。 我认为这是完全合法的,似乎正在起作用,但是我从未见过保证在两个不同地方使用的文字指针是相同的。我无法设法让编译器为具有相同内容的文本生成两个单独的指针,所以我开始怀疑这个假设有多坚定。 我只关心相同内容的文字是否可以有不同的指针。或者更正式地说,上面的代码可以除外吗? 我知道有一种方法可以编写代码来确保它有效,我认为上

  • 问题内容: 拥有Java代码 该字符串将分配在相同的内存位置(或多倍): 是否多次启动同一程序(并行)执行? 可能的答案: 我目前是C#开发人员(尽管在上个千年中使用Java编程)。 我之所以问这个问题,是因为我相信.NET CLR和Java(JVM)之间是相同的,我希望得到.NET应用程序的答案(但由于经常遇到的“应用程序”池术语而引起疑问)。 答案是 字符串 实习生池由同一JVM或.NET C

  • 如果我在内部存储中保存一个名为“picture.jpg”的位图,然后再执行一些步骤,我也保存另一个名为“picture.jpg”的位图,然后会发生什么?第二个位图会覆盖第一个位图,还是有两个位图同名?

  • 我今天面试了,我的面试官问我如何在HashMap中存储具有相同键的多个值?她给了我这个例子—— 我在如何使用HashMap时给了她以下解决方案: 整数是字符串的长度,ArrayList将存储该特定长度的字符串。 面试官说这是使用HashMap的一种方式,但还有另一种方式我不需要ArrayList或任何其他数据结构。在面试期间,我无法想出任何解决方案,现在在谷歌搜索了足够多之后,我仍然一无所获。有人

  • 问题内容: 我写了一个程序,给我三个数组。一个字符串数组和两个dole数组…。但是我想将它们保存在一件事中(我不知道它是数组还是矩阵)。 。 例如:我有一个文件要读取,输入内容如下: 我已经制作了三个数组,一个数组存储字符串的名称,另外两个数组存储双打的两列… 但是我想将整行“(apple 2.3 4.5)”存储在一件事中,这样,如果我想找到苹果,我也可以获得apple的相关值.....能否请大家

  • 标题可能有点难以理解,因为我不擅长总结事情,但我试图做的事情实际上非常简单(在任何其他语言中)。 我想测试赛贝斯表中的一些数据,特别是两列。这两列有冒号分隔的字符串——不幸的是,两列之间每个子字符串的位置不一样。是这样的: 第1栏 子字符串1:子字符串3:子字符串5 子字符串2:子字符串4:子字符串6 column_2 子字符串3:子字符串1:子字符串5 Substring6: substring