Java中==与equals()的测试

Java中==与equals方法的测试

代码

/**
 * 测试 == 和 equals方法 在基本数据类型和引用类型之间的判断.
 * 1. == 比较的是值。如果是基本数据类型,比较的就是数值;如果是引用类型,比较引用指向的地址
 * 2. equals() 默认比较的是地址,此方法最初定义在Object类中,方法的实现是比较地址。在String
 * 类中重写了此方法,使其比较的是内容。
 */
public class demo1 {
    public static void main(String[] args){
        String s1 = new String("ab");
        String s2 = new String("ab");
        // == 比较引用类型,比较的是引用指向的地址。由于s1和s2是由new分别创建的两个对象,所以
        // 它们在堆中的地址不同,因此下面语句输出 false
        System.out.println(s1==s2);
        // equals() 默认比较的也是地址,但String类重写了该方法,是的String类中的equals()方法
        // 比较的是内容。因此下面语句输出 true
        System.out.println(s1.equals(s2));

        String s3 = "ab";
        String s4 = "ab";
        // s3和s4都是引用数据类型,但"ab"是保存在常量池中的,它们都指向的是常量池中同一个地址
        // 下面语句结果输出true
        System.out.println(s3 == s4);
        // 同样是比较两个地址,s3指向的是常量池中的地址,s1指向的是堆中的地址。结果为false
        System.out.println(s3 == s1);

        String s5 = "abab";
        String s6 = s3 + s4;
        // s5保存的是指向常量池的地址;s6保存的是指向堆中对应对象的空间,因为字符串是不可变对象,
        // 无法直接通过相加而相连接,所以在进行相加操作时,实际上做的是:创建一个新的字符串对象,
        // 通过 new StringBuilder()来创建。结果是false
        System.out.println(s5 == s6);

        final String s7 = "ab";
        final String s8 = "ab";
        String s9 = s7 + s8;
        // final关键字修饰后,s7和s8都由变量变为了常量,编译器处理常量运算时会作出优化,
        // 将运算后的结果转为常量, 然后再将常量结果赋给s9。下面语句结果为true
        System.out.println(s9 == s5);

        final String s10 = s3 + s4;
        // s3 + s4是两个字符串对象相加,它们通过 new StringBuilder() 创建一个新的对象,然后
        // 将此对象的地址给 s10, 然后final关键字将s10转为常量,但s10始终保存的是指向堆中的地址
        // s5是指向常量池的地址。下面语句结果为false.
        System.out.println(s5 == s10);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值