String[] s2 = { "Hi" , "Hi" };中实际过程是:
s1="Hi";
s2="Hi";
而s1="Hi"后,系统调用了String的intern()方法把"Hi"给拘留了。
再次用s2="Hi",不再为"Hi"创建对象了。当然就指向同一个了。不知道这个解释对不对,还请高手指点。
s1="Hi";
s2="Hi";
而s1="Hi"后,系统调用了String的intern()方法把"Hi"给拘留了。
再次用s2="Hi",不再为"Hi"创建对象了。当然就指向同一个了。不知道这个解释对不对,还请高手指点。
String[] s2 = { "Hi" , "Hi" };中实际过程是:
s1="Hi";
s2="Hi";应该是
String[] s2 = { "Hi" , "Hi" };中实际过程是:
s2[0]="Hi";
s2[1]="Hi";
你的解释很正确...
yunfei0103 (云飞) 如果,你自己做个实验 String s="aaa" String t="aaa";
那么 s.intern() == t.intern() 返回 true..
其实,系统内部,,当 s.equals(t)的时候,就intern()就会被调用.这样不节省资源嘛?:)
String s3 = new String("Hi");
s3和s2[0]就不相等了,为什么?
照你这么说,s2[0],s2[1]都是指向同一个对象,那编程思想写错了?
String s3="Hi";就肯定对了..
(可以参见 new String 与 String)的区别..
还有,你不想浪费new String("Hi")也可以..只需要比较的时候..System.out.println("s1[0]==s3?"+(s1[0]==s3.intern()));
就可以得到你想要的结果了....
较新版本的JVM对相同的String对象会重用。"... the object will be reused by any other code running in the same virtual machine that happens to contain the same string literal."但是用String s = new String("...");这种形式的话就例外。
String s1 = new String("Hi");
有什么区别?
如果同一个JVM里面已经有一个String是"Hi",那么这个s1会指向那个现成的对象。String s1 = new String("Hi");
不管当前JVM有没有"Hi",都会创建一个新的对象。
书可能没写清楚
String[] s1 = new String[5];
所有s1的元素都指向同一个对象//没错亚,因为s1[0],s1[1]...都是null值亚
Arrays.fill(s1,"Hi");之后,这个数组的每个元素都指向"hi"了
相当与创建了一个引用(你可以想象成是一个指针)
String s="Hi";
把指针志向 char[] xxxxx={'H','i'}数组 (xxx,假设系统中随便定的一个变量)String s3 = new String("Hi");
clone "Hi"来生成新的String yyyyyyyy, 然后,把s3引用 yyyyyy;
也就是说,s3= new String("Hi"),是创建了两个对象..
随便生成一个class,含有一个static变量用来计算产生的对象的个数,就能看他生成多少个了!
//####################################
import java.util.*;class Small{
static int count; //用来计数的
Small(){count++;}
}
public class Test{
public static void main(String[] args){
Small[] a=new Small[10];
Arrays.fill(a,new Small());
System.out.println(Small.count);
}
}
//################################################
运行后输出的是 1 ,所以说只产生一个对象!至于s2[0]==s2[1]?true
我觉得比较应该是对象的内容,并不是对象的引用,所以结果是true
String s3="a";
//s3=s3.intern();
String s4="a";
System.out.println(s3==s4);
输出:true;String s3=new String("a");
//s3=s3.intern();
String s4="a";
System.out.println(s3==s4);
输出:false;String s3=new String("a");
s3=s3.intern();
String s4="a";
System.out.println(s3==s4);
输出:true;
我看了一下String类intern()方法,它说的意思是有那么一个字符串池,如果池里面有了你要创建的内容,它就不再产生新的对象。是么?谢谢你,也谢谢回答问题的人!!!
String s = new String("Some String");
String s = "Some String";在更多的时候我们应该倾向于后一种写法。
s1[0].equals(s1[1])才是对象之间的比较