Java中“==”的使用,以及“==”和equal的比较

int i02=59 ,这是一个基本类型,存储在栈中。

 Integer i03 =Integer.valueOf(59); 因为 IntegerCache 中已经存在此对象,所以,直接返回引用。

 Integer i04 = new Integer(59) ;直接创建一个新的对象。

 System. out .println(i01== i02); i01 是 Integer 对象, i02 是 int ,这里比较的不是地址,而是值。 Integer 会自动拆箱成 int ,然后进行值的比较。所以,为真。

 System. out .println(i01== i03); 因为 i03 返回的是 i01 的引用,所以,为真。

 System. out .println(i03==i04); 因为 i04 是重新创建的对象,所以 i03,i04 是指向不同的对象,因此比较结果为假。

 System. out .println(i02== i04); 因为 i02 是基本类型,所以此时 i04 会自动拆箱,进行值比较,所以,结果为真。

 

 

另外的实例:

public class Test{

      public static void main(){

          String s1="monday";

          String s2="monday";

         if(s1==s2){system.out.printLn("s1=s2");}

        else{system.out.printLn("s1!=s2");}

}

}

输出:s1=s2;//

public class Test{

      public static void main(){

          String s1="monday";

          String s2= new String("monday");

         if(s1==s2){system.out.printLn("s1=s2");}

        else{system.out.printLn("s1!=s2");}

}

}

输出:s1!=s2;//

字符串缓冲池
原来,程序在运行的时候会创建一个字符串缓冲池当使用 s2 = "Monday" 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1
将s2引用s1所引用的对象"Monday"
第二段程序中,使用了 new 操作符,他明白的告诉程序:"我要一个新的!不要旧的!"于是一个新的"Monday"Sting对象被创建在内存中。他们的值相同,但是位置不同,一个在池中游泳一个在岸边休息。哎呀,真是资源浪费,明明是一样的非要分开做什么呢?

"=="和equal的比较

一、比较对象为基本数据类型(byte,short,char,int,long,float,double,boolean)
比较两个基本数据类型是否相等用==,因为只有类才会有equals方法。

备注:String不是基本数据类型

二、比较对象为引用数据类型

euqals和==本质上都是比较比较的是两个对象的引用(内存地址)是否相同。equals()是Object类的方法 ,object类是所有类的基类,所以每个类都会继承equals()方法。
但在String,Integer,Date在这些类当中重写了equals方法,而不再是比较对象在堆内存中的存放地址了,而是比较它们指向的实体(内容)是否相同。
posted @ 2017-04-14 17:31  日月心诚  阅读(398)  评论(0编辑  收藏  举报