Java中关系操作符==的学习以及与equals的对比

1.一个实例如下:

public class TestObject {
    public static void main(String[] args) {
        // TODO Auto-generated method stub

   int o=3;

        int p=3;
        Integer l=3;
        Integer m=3;
        Integer n=new Integer(3);
        String r="hello";
        String s="hello";
        String t=new String("hello");
        String u=new String("hello");

   Integer v=128;

   Integer w=128;

   System.out.println(o==p);             //ture    (1)

        System.out.println(o==m);            //true     (2)
        System.out.println(l==m);            //true      (3)
        System.out.println(m==n);           //false     (4)
        System.out.println(r==s);             //true      (5)
        System.out.println(s.equals(t));   //true       (6)
        System.out.println(s==t);            //false      (7)

   System.out.println(t==u);            //false      (8)

   System.out.println(v==w)            //false      (9)
    }
}

2.关系操作符“==”

关系操作符==实际比较的是符号两边的值,

 a.当==号两边都为基本类型时,直接进行值比较,如结果(1),变量o和p存储的值均为3,所以结果为true。

 b.当==号两边都为对象类型时,此时变量的值是对象地址,如结果(4)、(7)、

   (8)、(9),此时由于变量中存储的对象地址不同所以返回结果为false。此时我们会有一个疑问,为什么结果(2)、

 (3)、(5)返回为true,这里可以顺便解释一下,以对int、Integer、string基本类容的回顾:

  1)int与Integer

    int和Integer在进行比较时,Integer会自动拆箱,转为int值与int进行比较,所以结果(2)返回为true。

         Integer和Integer直接赋值进行比较时,Integer会自动装箱,这时会面临一个选择:当变量x在区间[-128,127]之间时,

    将会直接缓存在整型变量池中,当新的变量赋值在这个区间的时候就不会创建新的Integer对象,二是从整型变量池中获取

    已经创建好的Integer对象;当变量x大于这个范围时,会直接new Integer创建一个新的Integer对象。所以结果(3)

    为true,而结果(9)为false。

  2)string=“”与new String()

    String s1="a",直接赋值的字符串变量存储在常量存储区中的字符串变量池中,new String("a")存储在堆中,当直接赋值一个相同的

    字符串String s2="a"时,此时s2也指向字符串常量池中的a,所以结果(5)为true,结果(8)为false。

3.equals

 equals方法是Object的方法,因此所有的类默认都有该方法,Object类中equals方法比较的是对象地址,但是结果(6)为什么是

 true呢,这是因为String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等,Java中大多数类都会对

 equals方法进行重写,没有重写的话默认继承Object中的equals方法,此时比较的就是对象地址。

    

    

posted @ 2018-11-13 15:57  曲项向天歌  阅读(220)  评论(0编辑  收藏  举报