Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么时候具有相同内容的两个字符串(不是)共享相同的内存?_C#_Java_.net_Memory Management_Literals - Fatal编程技术网

C# 什么时候具有相同内容的两个字符串(不是)共享相同的内存?

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的所有实例/程序

来自问题

拥有Java代码

String s1="Java";
是否将此字符串分配到同一内存位置(或多个):

  • 如果要启动同一程序多次并行执行(并发)
可能的答案: 我目前是C#开发人员(尽管在上个千年是用Java编程的)

我问这个问题是因为我相信.NET CLR和Java(JVM)之间是一样的,我希望得到.NET应用程序的答案(但不知何故,我对经常遇到的“应用程序”池术语表示怀疑)

因此,它似乎是(对不起,在询问之前没有彻底搜索):


答案是同一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”

  • StringConstantPool位置中提供的上述所有对象都只指向一个(“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拥有字符串文字池,其中的所有应用程序都共享该池。这就是我的推断。