标签: string-interning

C#中的字符串内插

考虑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#中发生字符串实习时可以指出规则,那将是非常有帮助的.

c# string string-interning

5
推荐指数
0
解决办法
188
查看次数

Java,HashMaps和使用字符串作为键 - 字符串值是否存储两次?

如果我有一个看起来像这样的HashMap:

HashMap<String, MyObject>

如果String键是一个字段MyObject,该字符串值是否存储两次?

所以当我添加条目时:

_myMap.put(myObj.getName(), myObj);

我是否在内存方面使用了两倍的字符串大小?或者Java在幕后做了哪些聪明的事情?

谢谢

java string hashmap string-interning

4
推荐指数
1
解决办法
1340
查看次数

什么时候在.Net代码中手动实习字符串是个好主意?

参考资料如下:http: //msdn.microsoft.com/en-us/library/system.string.intern.aspx

看起来这是由编译器自动完成的,但也可以手动完成.如果我错了,请纠正我,并对此有所了解.语言是C#,VB.Net,C++/CLI,还是其他?

谢谢.

.net premature-optimization string-interning

4
推荐指数
1
解决办法
218
查看次数

CompilationRelaxations.NoStringInterning实际上如何工作?

我在演示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.我期待一堆虚假!

c# string-interning

4
推荐指数
2
解决办法
1281
查看次数

Java中的实习字符串

以下代码段实习字符串.

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)

java string string-interning

4
推荐指数
1
解决办法
219
查看次数

通过在Key上使用String.intern()同步HashMap <String,Value> .remove(),这甚至可以工作吗?或者这是破碎的代码?

我最近遇到了以下构造

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指出:

如果多个线程同时访问哈希映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步.

java concurrency hashmap string-interning

4
推荐指数
1
解决办法
697
查看次数

为什么字符串指针位置不同?

为什么每次运行应用程序时字符串指针的位置都不同,当我使用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

c# pointers unsafe-pointers string-interning

4
推荐指数
1
解决办法
364
查看次数

是否将c#6.0 nameof()结果实现了?

从我可以读到的编译器只发出一个字符串,没有其他真正发生?

有没有理由说这次电话会议的结果无法实现?对于a nameof(MyClass),如果它发生了很多,它理论上可能值得吗?

c# string-interning c#-6.0 nameof

4
推荐指数
1
解决办法
249
查看次数

.NET中的垃圾回收是否排除了实习生字符串?

我正在尝试减少进行Gen2收集所需的时间。我的应用程序创建并保存了大量的字符串对象,这些字符串对象一直存在。

减少扫描对象的数量应减少GC时间。我想知道实习生池是否不包括在垃圾回收中。无论如何,那里没有什么可收集的。如果是这样,我可以实习所有这些字符串并加快GC的速度。

c# string garbage-collection string-interning

4
推荐指数
1
解决办法
1128
查看次数

比较字符串引用

我试图理解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, …

java string heap reference string-interning

4
推荐指数
1
解决办法
97
查看次数