考虑C#中的以下代码片段
string s = "hi";
object k="hi".Substring(0);
// 1>
k==s // true
// 2>
Object.ReferenceEquals(s,k) //true
Run Code Online (Sandbox Code Playgroud)
但当,
Object k="hii".Substring(0,2);
// 1>
k==s // false
// 2>
Object.ReferenceEquals(s,k) //false
Run Code Online (Sandbox Code Playgroud)
我很难理解为什么在第一种情况下,字符串被实习,而在第二种情况下没有发生.如果有人在c#中发生字符串实习时可以指出规则,那将是非常有帮助的.
如果我有一个看起来像这样的HashMap:
HashMap<String, MyObject>
如果String键是一个字段MyObject,该字符串值是否存储两次?
所以当我添加条目时:
_myMap.put(myObj.getName(), myObj);
我是否在内存方面使用了两倍的字符串大小?或者Java在幕后做了哪些聪明的事情?
谢谢
参考资料如下:http: //msdn.microsoft.com/en-us/library/system.string.intern.aspx
看起来这是由编译器自动完成的,但也可以手动完成.如果我错了,请纠正我,并对此有所了解.语言是C#,VB.Net,C++/CLI,还是其他?
谢谢.
我在演示NoStringInterning时遇到了问题
[assembly: System.Runtime.CompilerServices.CompilationRelaxations(System.Runtime.CompilerServices.CompilationRelaxations.NoStringInterning)]
class Program
{
static void Main(string[] args)
{
String s1 = "Friday";
String s2 = "Friday";
String s3 = "Friday";
String s4 = "Friday";
String s5 = "Friday";
String s6 = "Friday";
String s7 = "Friday";
String s8 = "Friday";
String s9 = "Friday";
// etc...
Console.WriteLine(Object.ReferenceEquals(s1, s2));
Console.WriteLine(Object.ReferenceEquals(s1, s3));
Console.WriteLine(Object.ReferenceEquals(s1, s4));
Console.WriteLine(Object.ReferenceEquals(s1, s5));
Console.WriteLine(Object.ReferenceEquals(s1, s6));
Console.WriteLine(Object.ReferenceEquals(s1, s7));
Console.WriteLine(Object.ReferenceEquals(s1, s8));
Console.WriteLine(Object.ReferenceEquals(s1, s9));
// etc...
Run Code Online (Sandbox Code Playgroud)
我已尝试使用.NET CLR 2,3,4 ..作为输出,我得到的是一堆True.我期待一堆虚假!
以下代码段实习字符串.
String str1="my";
String str2="string";
String concat1=str1+str2;
concat1.intern();
System.out.println(concat1=="mystring");
Run Code Online (Sandbox Code Playgroud)
表达式concat1=="mystring"返回true因为concat1已被实习.
如果给定的字符串mystring更改为string如下面的代码段所示.
String str11="str";
String str12="ing";
String concat11=str11+str12;
concat11.intern();
System.out.println(concat11=="string");
Run Code Online (Sandbox Code Playgroud)
比较表达式concat11=="string"返回false.持有的字符串concat11似乎没有被实习.我在这里俯瞰什么?
我已经在Java 7上进行了测试,更新了11.
编辑:
整个代码:
package test;
public final class Test
{
public static void main(String... args)
{
String str11="my";
String str12="string";
String concat11=str11+str12;
concat11.intern();
System.out.println(concat11=="mystring");
String str1="str";
String str2="ing";
String concat1=str1+str2;
concat1.intern();
System.out.println(concat1=="string");
}
}
Run Code Online (Sandbox Code Playgroud) 我最近遇到了以下构造
Map<String,Value> map = new HashMap<>();
...
Value getValue(String key) {
synchronized (key.intern()) {
return map.remove(key);
}
}
Run Code Online (Sandbox Code Playgroud)
鉴于这intern()通常不是那么快,我怀疑这会胜过使用synchronized,Collections.synchronizedMap(Map)或者ConcurrentHashMap.但即使这个构造比这个特殊情况下的所有其他方法更快:这是否正确同步?我怀疑这是线程安全的,因为在重组哈希表时可能会发生删除.但即使这样可行,我怀疑代码是否被破坏,因为HashMap javadoc指出:
如果多个线程同时访问哈希映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步.
为什么每次运行应用程序时字符串指针的位置都不同,当我使用StringBuilder时,当我声明变量时,它是相同的?
void Main()
{
string str_01 = "my string";
string str_02 = GetString();
unsafe
{
fixed (char* pointerToStr_01 = str_01)
{
fixed (char* pointerToStr_02 = str_02)
{
Console.WriteLine((Int64)pointerToStr_01);
Console.WriteLine((Int64)pointerToStr_02);
}
}
}
}
private string GetString()
{
StringBuilder sb = new StringBuilder();
sb.Append("my string");
return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)
输出:
40907812
178488268
下次:
40907812
179023248
下次:
40907812
178448964
从我可以读到的编译器只发出一个字符串,没有其他真正发生?
有没有理由说这次电话会议的结果无法实现?对于a nameof(MyClass),如果它发生了很多,它理论上可能值得吗?
我正在尝试减少进行Gen2收集所需的时间。我的应用程序创建并保存了大量的字符串对象,这些字符串对象一直存在。
减少扫描对象的数量应减少GC时间。我想知道实习生池是否不包括在垃圾回收中。无论如何,那里没有什么可收集的。如果是这样,我可以实习所有这些字符串并加快GC的速度。
我试图理解Java中的参考比较.我们假设我们有以下主要代码:
public static void main (String args[]) {
String str1 = "Love!";
String str2 = "Love!";
String str3 = new String("Love!");
String str4 = new String("Love!");
String str5 = "Lov"+ "e!";
String str6 = "Lo" + "ve!";
String s = "e!";
String str7 = "Lov"+ s;
String str8 = "Lo" + "ve!";
String str9 = str1;
}
Run Code Online (Sandbox Code Playgroud)
我理解这一点str1 == str2 == str5 == str6 == str8 == str9,所有这些都是对公共池的引用.(价值"爱!").
s也是对公共池的引用,但它引用值"e!"
我也明白str1 != s.
我知道str3, …