C# 什么时候具有相同内容的两个字符串(不是)共享相同的内存?
来自问题 拥有Java代码C# 什么时候具有相同内容的两个字符串(不是)共享相同的内存?,c#,java,.net,memory-management,literals,C#,Java,.net,Memory Management,Literals,来自问题 拥有Java代码 String s1="Java"; 是否将此字符串分配到同一内存位置(或多个): 如果要启动同一程序多次并行执行(并发) 可能的答案: 我目前是C#开发人员(尽管在上个千年是用Java编程的) 我问这个问题是因为我相信.NET CLR和Java(JVM)之间是一样的,我希望得到.NET应用程序的答案(但不知何故,我对经常遇到的“应用程序”池术语表示怀疑) 因此,它似乎是(对不起,在询问之前没有彻底搜索): 答案是同一JVM或.NET CLR的所有实例/程序
String s1="Java";
是否将此字符串分配到同一内存位置(或多个):
- 如果要启动同一程序多次并行执行(并发)李>
答案是同一JVM或.NET CLR的所有实例/程序共享字符串内部池 相同内容的字符串将为相同JVM的每个实例共享相同的空间
Is string pool created per class basis or per JVM basis?
每个JVM有一个字符串池。。。除非您使用的是一些异国情调的JVM,他们决定以不同的方式实现它
我想这就是答案,对吗
来自新西伯利亚的gennady vanin 字符串s1=“Java”;字符串s2=“Java”;字符串s3=“Java”;字符串s4=“Java”
String s1="Hola";
String s2="Hola";
String s1="Hola";
String s2=new String("Hola");
不同的内存位置:
String s1="Hola";
String s2="Hola";
String s1="Hola";
String s2=new String("Hola");
您打算如何在同一JVM中多次启动同一个程序?我怀疑每次连续执行时,它是否会被分配到同一个内存位置,因为这完全取决于执行时应用程序可用的内存位置。这对于任何语言都是正确的,因为它们最终都通过操作系统访问计算机内存。@Jon Skeet,我的意思是在“同一JVM的不同实例”中,隐含的问题是StringConstantPool是为每个应用程序创建的还是在它们之间共享的?你是指每个JVM实例还是每个(JVM的所有实例)同一个JVM?JVM首先检查字符串常量池,如果字符串不存在,它将创建一个新的字符串对象“Java”,并在池中维护一个引用。变量“s1”也引用同一个对象。我猜您的意思是“不同的JVM实例”,可以自由编辑您的答案,可以继续编辑或回滚。JVM软件安装本身可以(通常也是)相同。@Hyde,谢谢。因为对于不同的虚拟或物理machines@Hyde谢谢但你应该把它作为答案贴出来。因为您的编辑将我的问题的答案还原为相反的答案,所有其他答案都意味着字符串池在同一JVM的所有实例之间共享,即在从同一已安装JVM启动的所有应用程序之间共享。@GennadyVanin--Novosibirsk我认为所有答案在谈论“JVM”时都是指JVM实例,并且不意味着实例之间共享插入的字符串。。。这将如何高效、便携地工作?不管怎样,如果我误解了,我会让莫汉拉吉回退。@hyde,请参阅问题正文中我的更新。我相信你应该恢复你的编辑,老实说,我自己也很困惑,认为实习生池是每个JVM实例或每个应用程序的。这与我的问题有关吗?这是你的问题吗?:什么时候具有相同内容的两个字符串(不是)共享相同的内存?OMG,你是对的,但那只是从父主题借用的续集标题,你的代码片段在那里被大量使用(anf通过引用的主题)。因此,我希望回答者能够不重复地阅读参考主题。不过,我删除了我的否决票,抱歉,别担心,这个标题让我感到困惑:)它不是每个类的,因为它告诉我们它在多个包之间共享“不同包中不同类中的文本字符串同样表示对同一字符串对象的引用”。因此,所有JVM实例或从同一JVM启动的应用程序共享同一个池?以上问题的答案不仅仅回答了这个问题。。。是的,这个问题问的是类,但答案似乎更进一步,暗示JVM拥有字符串文字池,其中的所有应用程序都共享该池。这就是我的推断。