问题标签 [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.
java - intern() 在 Java 6 和 Java 7 中的行为不同
此代码在 Java 6 和 Java 7 中产生不同的输出。在 Java 6 中,s1==s2
条件返回false
,而在 Java 7 中,s1==s2
返回true
。为什么?
为什么这个程序在 Java 6 和 Java 7 中产生不同的输出?
java - java同步字符串作为id
我已经浏览了以下链接 在 String 对象上同步有问题吗? 和 http://illegalargumentexception.blogspot.com/2008/04/java-synchronizing-on-transient-id.html
现在我的问题:
- 我有一张地图,其中维护了用户 ID 和一些属性的列表
- 当我们遇到新的用户 ID 时,我们将在地图中创建一个条目
- 如果用户 ID 已经存在,我们将向该值添加一些属性
我们没有在整个地图上同步,而是尝试在用户 ID 上进行同步,这会导致一些随机行为,如果我们使用 intern() 它可以工作,第二个链接中的方法也可以工作
问题:
- 在第二种方法中,我们在获取密钥时仍然锁定整个地图
- 是否有其他同步方式,以便仅根据用户 ID 同步地图访问
- 做这个的最好方式是什么?
java - 序列化时是否保留了内部字符串?
如果我有包含许多重复字符串的大型对象图,那么在序列化字符串之前对字符串进行实习()是否有好处?这会减少传输的数据量吗?字符串会在接收端共享指针吗?
我的猜测是,字符串会在发送之前进行重复数据删除,从而减少数据的大小,并且它们都将在接收端由同一个对象表示,但它们实际上不会在接收端被实习。(意味着在每个序列化“事务”上都会创建一个新的字符串实例)
c# - .Net Framework 中的字符串实习 - 有什么好处以及何时使用实习
我想知道特定于 .Net 框架的字符串实习的过程和内部结构。还想知道使用实习的好处以及我们应该使用字符串实习来提高性能的场景/情况。虽然我从 Jeffery Richter 的 CLR 书中学习过实习,但我仍然很困惑,想更详细地了解它。
[编辑] 使用示例代码提出特定问题,如下所示:
java - String.intern 只是在Java中复制一个对象引用是一样的吗?
是在做:
并做:
是一样的吗?
实际上,如果我测试,参考都是一样的:
因为字符串将永远在字符串池中?
c# - String.Intern 有价值吗?
String.Intern
有一个特殊的字符串池,以后可以检索。
有什么办法让我知道指定的字符串是从池中获取的,并且不是新创建的?例子 :
s3 ref val取自池
有什么办法让我知道吗?
c# - 实习生字符串文字误解?
我不明白 :
MSDN 说
http://msdn.microsoft.com/en-us/library/system.string.intern.aspx
因此,具有特定值的文字字符串的实例在系统中只存在一次。
例如,如果您将相同的文字字符串分配给多个变量,则运行时会从实习池中检索对文字字符串的相同引用并将其分配给每个变量。
这种行为是默认的(没有实习生)吗?还是使用实习生方法?
如果它是默认的,那我为什么要使用实习生?(实例已经是一次......)?
如果它不是默认值:如果我写了 1000 次这一行:
Console.WriteLine("lalala");
1)我会在内存中出现 1000 次“lalala”吗?(不使用实习生...)
2)“lalala”最终会被 Gc'ed 吗?
3) "lalala" 已经被实习了吗?如果是这样,为什么我需要从池中“获取”它,而不仅仅是再次写“lalala”?
我有点困惑。
java - String.intern() 与手动字符串到标识符的映射?
我记得看到一些字符串密集型程序,它们进行大量字符串比较但相对较少的字符串操作,并且使用单独的表将字符串映射到标识符以实现高效相等和减少内存占用,例如:
我很确定这些程序之一是来自 OpenJDK 的 javac,所以不是一些玩具应用程序。当然,实际的类更复杂(而且我认为它实现了 CharSequence),但你明白了 - 整个程序Name
在你期望的任何位置都乱七八糟String
,并且在需要字符串操作的极少数情况下,它转换了到字符串,然后再次缓存它们,概念上像:
我想我理解这一点 - 特别是当周围有很多相同的字符串和很多比较时 - 但不能通过使用常规字符串和intern
ing 来实现相同的效果吗?的文档String.intern()
明确说:
...
当调用 intern 方法时,如果池中已经包含一个等于由 equals(Object) 方法确定的此 String 对象的字符串,则返回池中的字符串。否则,将此 String 对象添加到池中并返回对该 String 对象的引用。由此可见,对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为真时,s.intern() == t.intern() 才为真。
...
那么,手动管理类类与使用类的优缺点是Name
intern()
什么?
到目前为止我想到的是:
- 手动管理地图意味着使用常规堆,
intern()
使用 permgen。 - 手动管理地图时,您喜欢类型检查,可以验证某事是 a
Name
,而一个实习字符串和一个非实习字符串共享相同的类型,因此在某些地方可能会忘记实习。 - 依赖
intern()
意味着重用现有的、优化的、久经考验的机制,而无需编写任何额外的类。 - 手动管理地图会导致代码对新用户更加困惑,并且 strign 操作变得更加繁琐。
......但我觉得我在这里错过了其他东西。
.net - .net 中的字符串不变性和实习
我打算就这个其他 SO 问题发表一个答案,但有人在我前面使用 StringBuilder 类,无论如何,离题了......
我知道 .NET 中的字符串是不可变的,因此创建字符串并对其进行修改实际上会在内存中创建两个不同的字符串,这与StringBuilder Class
维护内部缓冲区并仅在ToString()
调用时创建最终字符串相反。我也知道 .NET 实习生每个字符串,所以只会为应用程序中使用过的每个字符串创建一个副本。
当您将一个字符串附加到另一个字符串时,它们都在应用程序中使用,因此它们都被实习了(不是吗?),不使用连接运算符附加字符串的主要原因是因为您最终会得到一个完成后内存中的一整串字符串,每个都比前一个大。
我知道连接01234
with56789
会导致内存中出现以下两个字符串:
01234
0123456789
在使用StringBuilder
will only 时,由于实习:
01234
56789
显然第二种方法对性能更好,但实际上有多好?我的意思是,如果您要从一小部分值列表中创建一个更大的字符串,我为什么要考虑StringBuilder
(本身占用内存空间)?总是好用吗?或者对于何时[不]使用它有什么好的经验法则?
java - 什么是 Java 字符串实习?
什么是Java 中的字符串实习,什么时候应该使用它,为什么?