public class wren
{
public static void main(String argv[])
{
String aa = "b";
String bb = "b";
System.out.println(aa == bb);
String a[] ={ "a", "b" };
String b[] ={ "a", "b" };
System.out.println(a == b);
}
}为什么一个true,一个false?

解决方案 »

  1.   

    第一个是false,对吧,==只能用来判断两个字符串是否存储在内存中的同一个位置。应该用equals()来判断字符串内容是否相等。第二个目前也不是很清楚。抱歉
      

  2.   

    public class wren
    {
        public static void main(String argv[])
        {
            String aa = "b";
            String bb = "b";
            System.out.println(aa == bb);
            String a[] ={ "a", "b" };
            String b[] ={ "a", "b" };
            System.out.println(a == b);
        }
    }因为Java中有个叫字符串对象池的地方,就是用来存放字符串的.
    String aa = "b";//这时候在字符串对象池里面就产生了一个"b",aa就指向了"b"
    String bb = "b";//这个时候并不会就直接去new字符串,而是先到池里面去找,但是现在就找到了,那么bb也指向了这个地方
    所以说aa和bb是指向的同一个地方,所以它们用==就是想等的
    至于两个数组的比较,就根本跟前面那个不一样,比较的是b[],a[]跟上面的不一样,当然为false了
      

  3.   

    字面量比的是值,所以第一个是true,而第二个两个变量是引用,比的是内存的地址,创建了两个对象,所以两个对象的地址是不一样的所以为false
      

  4.   

    第一个是常量赋值,这个"b"存储在常量区域,任何的String x = "b"都指向常量区域的这个地址,这是String类在实现时候比其他类特殊的地方。
    而数组则不一样,
    String a[] ={ "a", "b" };
    String b[] ={ "a", "b" };
    这2句定义的a和b为2个数组类型的引用,分别引用不同的内存地址,而这2个内存地址里有分别存放了2个字符串常量的引用,就是a[1],a[2]和b[1],b[2]
    虽然a和b引用的是不同的地址,但是a[1]和b[1]引用同一个地址,a[2]和b[2]引用同一个地址,也就是说。a[1]==b[1]是true同样a[2]==b[2]也是true