public class test {
public static void main(String args[]){
String a = "abc";
String b = "abc";
if (a==b){
System.out.println("a==b");
}
if (a.equals(b)){
System.out.println("a equals b");
}
}
}
为什么我的程序输出结果是
a==b
a equals b
a和b的地址也相同么?
==和equals的区别到底是什么

解决方案 »

  1.   

    ==比较的是引用的地址。但是如果是String类型的话,java就不把它当作引用,而是当作基本类型来处理的。所以说两个都会有输出的。
      

  2.   

    System.out.println("a==b");你这是输出字符串
    这样就好了System.out.println(a==b);
      你程序这样,地址是一样的!
    ==比较内在地址,
    equals比较字符串的内容
      

  3.   

    System.out.println("a equals b"); 这个也要写成这样:System.out.println(a.equals(b)); 
      

  4.   


    不是吧,lz只是向输出表示a和b的内容相等
      

  5.   


    public class test { 
    public static void main(String args[]){ 
    String a = "abc"; 
    String b = "abc"; 
    if (a==b){ //比较的是引用地址!因为a和b指向同一个对象,所以相等
    System.out.println("a==b"); 

    if (a.equals(b)){ //String类重写了从Object继承过来的equals方法,重写为比较他们的内容!
    System.out.println("a equals b"); 


    }
      

  6.   


    不是引用地址的,而是当作基本类型来处理的,不是字符串相同,地址就相同的。java里面处理String a="abc"; 这样的字符串就是作为基本类型的,和String a= new String("abc");是截然不同的。 
      

  7.   

    这里有一个常量池的概念:
    常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的
    一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
    String a = "abc"; 
    String b = "abc"; 
    首先,要知道Java会确保一个字符串常量只有一个拷贝,例子中的a和b中的"abc"都是字符串常量,
    它们在编译期就被确定了,当已经定义了一个字符串常量"abc"的时候,如果再定义一个"abc"常量的时候,java会
    自动直接引用常量池中已经定义的那个字符串常量,也就是说此时a和b实际上指向的是同一个引用,也就是为什么a==b会成立的原因,
    当然,二者的引用相同那么a.equals(b)也必然成立了。
    如果用new String() 创建的字符串那么就不是常量,不能在编译期就确定,所以new String()
    创建的字符串不放入常量池中,它们有自己的地址空间,如果此时再用a==b的话,那么肯定是不成立的.
      

  8.   

    String a = "abc"; 
    String b = "abc"; 
    =====================
    这里只是声明了两个引用,并且初始化引用且初始化的值相等,并没有创建对象.所以就应该当作基本类型来处理了,为true.String a = new String( "hello "); 
    String b = new String( "hello "); 
    ======================
    这里生成了两个对象,==比较的是对象的引用是否相等,这里明显不等了,所以为false.