对象的比较

class A{
  int a=1;
}

public class equalTest{
   public static void main(String[] args) {
    A obj1=new A();
    A obj2=new A();
    String s1,s2,s3="abc",s4="abc";
    s1=new String("abc");
    s2=new String("abc");
    System.out.println("s1=s2?"+(s1.equals(s2)));
    System.out.println("s1=s3?"+(s1==s3));
    System.out.println("s1=s3?"+(s1.equals(s3)));
    System.out.println("s3=s4?"+(s3==s4));
    System.out.println("s2=s3?"+(s2.equals(s3)));
    System.out.println("s2=s4?"+(s2.equals(s4)));
    System.out.println("obj1=obj2?"+(obj1.equals(obj2)));
    System.out.println("s1=s2?"+(s1==s2));
    obj1=obj2;
    System.out.println("obj1=obj2 after obj1=obj2 ?"+(obj1.equals(obj2)));
    System.out.println("obj1=obj2 after obj1=obj2 ?"+(obj1==obj2));
  }
}

结果:

s1=s2?true
s1=s3?false
s1=s3?true
s3=s4?true
s2=s3?true
s2=s4?true
obj1=obj2?false
s1=s2?false
obj1=obj2 after obj1=obj2 ?true
obj1=obj2 after obj1=obj2 ?true

问题:

  1. 书上写到对于同一类的对象,==和equals方法返回值都是false。那么s3.s4是否是同一类的对象呢?如果是,那么灰色标识出来地方结论就不对了。如果不是那又算是什么?
    解答:记住一句话:引用永远放在栈上,而对象永远动态分配在堆上。
      关于==和equals的区别其实深入到技术细节就是栈地址和堆地址的判断。
      学JAVA你要搞清楚什么是简单的数据类型和什么是对象。
      记住,在java中String就是一个类。
      ==和equals的区别:
      ==用来判断引用地址是否相同,即判断是否引用(指针)指向同一个堆中的对象
      而equals是判断对象内的数据是否相同,而不是地址了(不是指针指向的地址)。
      System.out.println("s1=s2?"+(s1.equals(s2)));这个清楚了吧,内容相同为true
        System.out.println("s1=s3?"+(s1==s3));地址不同啊,为false
        System.out.println("s1=s3?"+(s1.equals(s3)));内容相同为true
        System.out.println("s3=s4?"+(s3==s4));这里还是有些问题,那位大哥给我说一下。
        System.out.println("s2=s3?"+(s2.equals(s3)));内容相同为true
        System.out.println("s2=s4?"+(s2.equals(s4)));内容相同为true
        System.out.println("obj1=obj2?"+(obj1.equals(obj2)));obj1引用指向的内容在new后并没有进行赋值,所以为假,即堆中的内容为未知。为false
        System.out.println("s1=s2?"+(s1==s2));指向的栈地址不同啊,为false
        obj1=obj2;是引用赋值,即指针赋值
        System.out.println("obj1=obj2 after obj1=obj2 ?"+(obj1.equals(obj2)));
        System.out.println("obj1=obj2 after obj1=obj2 ?"+(obj1==obj2));
    上面二个全是TRUE,因为引用赋值后,指向的同一个对象,引用指针内容为同。所以为TRUE。
     JAVA是面向对象的东西,之所以还使用栈的东西是为了速度上的考虑,堆中虽然使用灵活,但效率的确是个大问题,编译器还得动态进行内存大小的配置,而栈中虽然不能动态配置大小,但却使用的速度非常快。各有得失。

    最后多谢ghyghost这么详细的答案
  2. 绿色标记出来的地方为什么最后为false,而下面的那个s3=s4的,确为true?
    解答:绿色标记出来的s1和s3是不同的。s1是实例后的字符串是new的关系。开辟了新的内存空间。而s3不是。所以不是直接的==。所以equale的s1.s3是相等的。而后面的s3.s4因为字符串池的关系。其实是指的同一字符串。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值