公共语言运行时通过维护一个表来存放字符串,该表称为“暂存池”(String Pool),它包含程序中以编程方式声明或创建的每个唯一的字符串的一个引用。 因此,具有特定值的字符串的实例在系统中只有一个。
例如,如果将同一字符串分配给几个变量,运行时就会从暂存池中检索对该字符串的相同引用,并将它分配给各个变量。
Intern 方法使用暂存池来搜索与 str 值相等的字符串。 如果存在这样的字符串,则返回暂存池中它的引用。 如果不存在,则向暂存池添加对 str 的引用,然后返回该引用。
在下面的示例中,值为“MyTest”的字符串 s1 已被拘留,因为它是程序中的文本。 System.Text.StringBuilder 类生成与 s1 同值的新字符串对象。 对该字符串的引用被分配给 s2。 Intern 方法搜索与 s2 具有相同值的字符串。 由于存在此类字符串,因此该方法返回分配给 s1 的引用。 该引用又被分配给 s3。 引用 s1 和 s2 相比较的结果是不相等,因为它们引用了不同的对象;而引用 s1 和 s3 相比较的结果是相等,因为它们引用了同一字符串。
string s1 = "MyTest"; string s2 = new StringBuilder().Append("My").Append("Test").ToString(); string s3 = String.Intern(s2); Console.WriteLine((Object)s2==(Object)s1); // Different references. Console.WriteLine((Object)s3==(Object)s1); // The same reference.
String的equals方法,equals其实是Object类里面的方法,这个方法的参数是Object类:
String a=new String("aaa"); String b=new String("aaa"); System.out.println(a==b); //输出false,==号是讲两个引用的地址进行比较 System.out.println(a.equals(b)); //输出true,equals方法是将两个引用的值进行比较
注意Object类的equals方法是比较两者的引用地址是否一致,String类里面是重写了equals方法的