问题标签 [string-interning]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1740 浏览

ruby - 什么时候不要在 Ruby 中使用 to_sym?

我有一个来自分析提供商的大型数据集。

它以 JSON 的形式出现,我将其解析为哈希,但由于集合的大小,我在内存使用量上激增。几乎所有内容都以字符串开头(一些值是数字),当然键会重复很多次,但许多值也会重复。

所以我在想,为什么不也象征所有(非数字)值呢?

我发现了一些关于潜在问题的讨论,但我认为对 Ruby 有一个全面的描述会很好,因为这些问题似乎取决于实习过程的实现(当你符号化一个字符串时会发生什么)。

我发现这是在谈论 Java: 使用 java.lang.String.intern() 是一种好习惯吗?

  • 实习过程可能很昂贵
  • 内部字符串永远不会被释放,导致内存泄漏

(除了最后一点有一些争论。)

那么,任何人都可以详细解释何时不在 Ruby 中实习字符串?

0 投票
11 回答
2568 浏览

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

在下面的代码中,字符串文字的行为非常令人困惑。

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

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

我知道==检查引用相等并在池中检查文字。我知道equals()是正确的方法。我想了解这个概念。

我已经检查了这个问题,但没有解释清楚。

我将不胜感激一个完整的解释。

0 投票
4 回答
5953 浏览

python - Python 是否实习字符串?

在 Java 中,显式声明的字符串被 JVM 隔离,因此同一字符串的后续声明会导致两个指向同一字符串实例的指针,而不是两个单独(但相同)的字符串。

例如:

我的问题是,CPython(或任何其他 Python 运行时)是否对字符串做同样的事情?例如,如果我有一些课程:

并创建该类的 10 个实例,它们中的每一个是否都有一个实例变量引用内存中的相同字符串,或者我最终会得到 10 个单独的字符串?

0 投票
6 回答
1577 浏览

java - 将 int 转换为 String 算作自动装箱吗?

AFAIK当Java自动将原始类型转换为包装类对象时,它称为自动装箱,因为原始类型被装箱到包装类中。

也是

算作自动装箱吗?

问的理由?

我最近遇到了这个问题。我认为这是在 java 5 中引入的自动装箱(Java 4 中不存在)的原因。

0 投票
1 回答
3026 浏览

java - 实习生字符串、字符串池和 perm-space 上的垃圾收集

在探索了 java 的字符串内部结构之后,我对所谓的“烫发空间”感到困惑。我最初对它的理解是它包含String 文字以及类元数据,如本问题所述。

我还阅读了有关该String.intern()方法的信息,并将Strings 放入字符串池中,返回对其唯一实例的引用。据我了解,这是保存在 JVM 永久空间中的字符串文字的同一个字符串池。在我看来,“烫发空间”似乎不可能是可修改的(毕竟它是永久的,是吗?)。但后来我发现了这个问题,EJP 对已接受答案的最高投票评论解释说

Intern'd 字符串已经支持 GC 好几年了。

暗示 GC 在 perm-space 上运行,这似乎不是很永久。这如何调和?GC 会检查 perm-space 中的所有内容吗?GC 是否检查字符串池中的所有内容,包括来自源的字符串文字?实习生字符串是否有第二个字符串池?GC 是否只知道在收集时查看实习生字符串?或者这个评论是错误的并且实习字符串会阻止它被GC'd(我希望不是这种情况)?

0 投票
1 回答
54 浏览

emacs - (read-command ...) 在空白输入时返回奇怪的对象

我需要使用 提示用户输入命令,read-command然后根据用户是否在 minibuffer 上输入空字符串来采取行动。

大多数时候,read-command返回一个有效的命令。但是当用户输入一个空白字符串时(只需在 minibuffer 中按回车键),就会返回一个奇怪的对象,它既不是nil,也不是字符串,也不是命令(根据stringpand commandp)。

我怎样才能:

  1. 访问此对象的读取语法?
  2. 在不匹配定义的每个类型谓词的情况下确定对象的类型此处定义的每个类型谓词的情况下确定对象的类型
  3. 测试这个对象是否相等?
  4. 为什么read-command行为不端?规格read-command

read-command 是 `minibuf.c' 中的内置函数。

(读取命令提示和可选的默认值)

读取命令的名称并作为符号返回。用 PROMPT 提示。默认情况下,如果是列表,则返回 DEFAULT-VALUE 或其第一个元素。

[背部]

我预料到nil了,因为那是我通过的DEFAULT-VALUE,但显然read-command不在乎。

我已经尝试加载源代码minibuf.c以查看发生了什么,但我也无法让它工作。我已经emacs-23.3b.tar.gz这里下载并让 emacs 在那里寻找源代码,但它无法找到它。那里似乎也不minibuf.c存在。非常令人沮丧的东西,我将不胜感激任何指针。

0 投票
3 回答
238 浏览

java - Java中的实习字符串

以下代码段实习了一个字符串。

表达式concat1=="mystring"返回true,因为concat1已被实习。


如果给定的字符串mystring更改string为如下代码段所示。

比较表达式concat11=="string"返回false。持有的字符串concat11似乎没有被拘留。我在这里俯瞰什么?

我已经在 J​​ava 7 上进行了测试,更新 11。


编辑:

整个代码:

0 投票
4 回答
159 浏览

java - 为什么类名与使用“==”的内部字符串比较相矛盾?

o / p:假

执行程序后,它会产生false作为输出。如果使用equals()而不是“==”,它会返回 true。为什么会这样?

2.在这种情况下,更改类名后,它会产生true作为输出。

o / p:真

为什么使用带有类名的“==”进行黑白字符串比较会发生矛盾(如果比较字符串名称用作类名)?

0 投票
0 回答
208 浏览

java - 什么可能在启动时暂时使用 1GB 的 PermGen?

在 Weblogic 12c 下运行的应用程序在启动的后期阶段对 PermGen 空间进行了极其大量但临时的使用。我说“临时”是因为它表现出“锯齿状”增长到 PermGen 限制(500MB),然后立即下降到几乎恒定的基本水平(大约 300MB),如下图所示:/|/|/| . 经过大约 5 次冗长的迭代后,恢复正常启动。

在打开“-verbose:class”的情况下运行,我们看到在此行为期间没有加载或卸载任何类。

PermGen 的什么用途可能会表现出这组症状?我所能想到的是,由于某种未知的原因,正在创建大约 1 GB 的实习字符串,然后进行垃圾收集。

更新 这是在 Solaris HotSpot 1.7 上运行的。 Java 7 中不包含字符串。

更新 2 这似乎是尝试加载由 ServletContextInitializer 处理的类的问题,可能是特定于 WebLogic 的。我们没有任何 ServletContextInitializers,也没有我们的任何库——它必须是基本 WebLogic 类加载器空间的一部分。里面有很多。我猜想 ServletContextInitializer 上的 @HandlesTypes 正在标记的某个类使用的基类、接口或注释的 NoClassDefFound 错误处理存在错误。

0 投票
1 回答
78 浏览

python - 是否应该在每次字符串出现时显式调用实习生?

假设我逐行读取文件并将这些行保存到列表中:

该文件有五个相同的行:

读取完成后,内存中会存在 5 个 'abcd' 副本还是只有 1 个?