String a = "hello";
String b = "h";
b += "ello";
System.out.println(a == b);
System.out.println((Object)a == (Object)b);
结果是:F F
如果是:
String a = "hello";
String b = "hello";
System.out.println(a == b);
System.out.println((Object)a == (Object)b);
结果是: T T
C#:
String a = "hello";
String b = "h";
b += "ello";
System.out.println(a == b);
System.out.println((Object)a == (Object)b);
结果是:T F——(解释是C#里重载了 == 所以将string可视为基本类型?)
如果是:
String a = "hello";
String b = "hello";
System.out.println(a == b);
System.out.println((Object)a == (Object)b);
结果是: T T
String b = new String("hello");
System.out.println(a == b);
System.out.println((Object)a == (Object)b);
String a= "hello" ;
String b= "hello" ;
String c= new String("hello") ;
表面上看这三句回实例化3个String对象,实际上是两个。在java中有一个叫“字符数据池”的内存管理机制,在对b赋值之前,会检查池中有没有相同的数据,如果有,则直接引用;若没有,系统会实例化这个String的对象;而执行到String c = new String("hello") ;系统会直接实例化该对象,而不会在池中查找。也不会将这个对象放在池中。 如果改动a或b时,并不会改动另外一个引用的值——系统会首先在池中查找有没有相同的对象,如果没有,会实例化这个对象。
String b = "hello";
b = "hello" + 1;
Console.WriteLine((Object)a == (Object)b);//F
String b = "hello";
b = "hello" + "1";
Console.WriteLine(a == b); //T
Console.WriteLine((Object)a == (Object)b);//T
------------------------------------------------------------
String b = "hello";
b =b + "1";
Console.WriteLine(a == b); //T
Console.WriteLine((Object)a == (Object)b); //F