String和==号的问题

      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类的源码。就很清楚了。