String name = "you"; String name1 = "you"; try { byte[] nameByte = name.getBytes("GBK"); name = new String(nameByte); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } System.out.println(name); System.out.println(name1); System.out.println(name==name1);
运行结果:
you
you
false
为啥为false?同为字符串you,难道在内存中的地址不一样?
String name = "you";
String name1 = "you";
这两句中 name和name1都是指向内存中常量区的同一个对象“you”
但当你
name = new String(nameByte);
后,new关键字分配出来的对象都放在堆区,
试问,这两个地区的地址是相等的吗?
你已经说出答案了。
找本《think in java》,会系统地帮助你解答这个问题
也会更多地帮助你解答之前和之后可能会遇到的问题
name==name1值是相等的,但是==标示的是完全相等,包括内存地址,你可以用eques来判断值是否相等
如果改成这样:
String name = "you";
String name1 = "you";
try {
System.out.println(name==name1);
byte[] nameByte = name.getBytes("GBK");
name = new String(nameByte);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println(name==name1);
那么答案就是true,false,好像是String name="you",和String name=new String("you"),这两个操作在Java的存储上是不同的。如果是:
String name = "you";
String name1 = "you"; 内存里只有一份"you",当时如果是new的操作了,那就不一样了。
==判断的是值;eql?()判断的是值以及类型;equal?()判断的是地址。
String池里的地址不一样吧
name = new String(nameByte); 此时name指向的是堆中的char数组,这个char数组再指向堆中存放字符串"you"所在的地址。
而String name = "you"; 则表示name直接指向了堆中存放字符串"you"所在的地址。
所以显而易见name==name1,返回false。 “==”比较的是变量所指向的地址。
你可以看下String类的源码。就很清楚了。