Java中的==和equals方法


java中的==和equals方法,需记住两条规则:


1.对于==,如果作用于基本数据类型的变量,则直接比较其存储的 ""是否相等;



    如果作用于引用类型的变量,则比较的是所指向的对象的地址



2. 对于equals方法,注意:equals方法不能作用于基本数据类型的变量



    如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址


    诸如String,Date,Integer等类对equals方法进行了重写的话,比较的是所指向的对象的内容




Object可理解为老祖宗,如果在别的类中看到equals方法,可认为是方法重写,这样比较的是所指向的对象的内容。


    
Integer i1 = new Integer(127);
		Integer i2 = new Integer(127);
		
		System.out.println(i1 == i2);//false
		System.out.println(i1.equals(i2));//true

        两个对象的自地址值不同,所以==的时候是false,

        而equals方法比较的是内容,所以是true.

Integer i5 = 128;
		Integer i6 = 128;
		
		System.out.println(i5 == i6);//false
		System.out.println(i5.equals(i6));//true


以及

Integer i7 = 127;
		Integer i8 = 127;
		
		System.out.println(i7 == i8);//true
		System.out.println(i7.equals(i8));//true



两个为何不属于上面的两条规则呢?

因为查看源码得知:

    
Integer i = 128;//相当于Integer integer = Integer.valueOf(128);
		
		 static final int low = -128;
		 static final int high= 127;
		 
		 
		  public static Integer valueOf(int i) {
				//如果在-128到127之间,就直接从缓冲区里获取数据
        	if (i >= IntegerCache.low && i <= IntegerCache.high)
           	return IntegerCache.cache[i + (-IntegerCache.low)];
        	//如果不在-128到127的范围,那么会新建对象
		  return new Integer(i);
    	  }



注意:Integer的数据直接赋值,如果在-128和127之间,直接从缓冲池里获取数据。


IntegerCache.low 和IntegerCache.high的范围是:


请再次注意(这是一个坑):Integer的数据直接赋值,如果在-128和127之间,直接从缓冲池里获取数据


javaequals的问题

01-13

读 practical java 中文版时 实践13:调用super.equals()以唤起b a se cla s s的相关行为.有个例子不是很明白.rnrnpublic class MyGolfball extends Golfballrnrn public final static byte TwoPiece = 0;rn public final static byte ThreePiece = 1;rn private byte ballConstruction;rnrn public MyGolfball(String str, String mk,rn int comp, byte construction)rn rn super(str, mk, comp);rn ballConstruction = construction;rn rnrn public byte construction()rn rn return ballConstruction;rn rnrn public boolean equals(Object obj)rn rn if (this == obj) //1rn return true;rnrn if (obj != null && getClass() == obj.getClass() && //2rn super.equals(obj)) //此处比较两个对象的超类是否相同,可super是Golfball类,obj 是MyGolfball,调用Golfball的equals方法:Golfball gb = (Golfball)obj;obj 不就是要向下转化为Golfball类么?不久会出问题?rnrn rn MyGolfball gb = (MyGolfball)obj; //Classes equal, downcast.rn rn if (ballConstruction == gb.construction()) //Compare attrs.rn return true;rn rn return false;rn rn rnrnclass Golfballrnrn private String brand;rn private String make;rn private int compression;rnrn public Golfball (String str, String mk, int comp)rn rn brand = str;rn make = mk;rn compression = comp;rn rnrn public String brand()rn rn return brand;rn rnrn public String make()rn rn return make;rn rnrn public int compression()rn rn return compression;rn rnrn public boolean equals(Object obj)rn rn if (this == obj)rn return true;rnrn if ((obj != null) && (getClass() == obj.getClass()))rn rn Golfball gb = (Golfball)obj;rn if ((brand.equals(gb.brand())) &&rn (make.equals(gb.make())) &&rn (compression == gb.compression()))rn rn return true;rn rn rn return false;rn rnrnrnrn问题在MyGolfball equals方法处,有人帮小弟解释一下

equals方法

08-27

[code=java]package next11;rnrnimport java.util.Date;rnimport java.util.GregorianCalendar;rnrnrnrnpublic class EmployeeTest rn public static void main (String [] args)rn Employee alice1= new Employee("Alice Adams", 75000, 1987, 12, 15);rn Employee alice2 = alice1;rn Employee alice3= new Employee("Alice Adams", 75000, 1987, 12, 15);rn Employee bob = new Employee("Bob Brandson", 50000, 1989, 10, 1);rn rn System.out.println("alice1 == alice2 "+(alice1 == alice2));rn rn System.out.println("alice1 == alice3 "+(alice1 == alice3));rn rn System.out.println("alice1 equals(alice3) "+alice1.equals(alice3));rn rn System.out.println("alice1 equals(bob) "+alice1.equals(bob));rn rn System.out.println("bob.toString "+bob);rn rn rn rn rnrnrnclass Employeern private String name;rn private double salary;rn private Date hireDay;rn public Employee(String n,double s,int year,int month,int day)rn name = n;rn salary = s;rn GregorianCalendar calendar = new GregorianCalendar(year,month -1,day);rn hireDay = calendar.getTime();rn rn public Date getHireDay() rn return hireDay;rn rn public String getName() rn return name;rn rn public double getSalary() rn return salary;rn rn public void raiseSlary(double byPercent)rn double raiseSalary = salary*byPercent/100;rn salary +=raiseSalary;rn rn rn public boolean equals (Object otherObject)rn if(this == otherObject) return true;//这一句要怎么理解?本类对象与otherObject引用的对象一致?alice1.equals(alice3)套上的话又该怎么具体分析呢?rn //Object otherObject = alice3?如果是这样,所指的对象应该不同呀。有点卡住了,呵呵rn if(otherObject==null) return false;rn if(this.getClass()!=otherObject.getClass()) return false;rn Employee other =(Employee)otherObject;rn return name.equals(other.name)rn &&salary == other.salaryrn &&hireDay.equals(other.hireDay);rn rn rn public int hashCode()rn return 7*name.hashCode()rn +11*new Double(salary).hashCode()rn +13*hireDay.hashCode();rn rn rn public String toString()rn return getClass().getName()rn +"[name="+namern +",salary="+salaryrn +",hireDay="+hireDayrn +"]";rn rn rnrnrnclass Manager extends Employeern private double bonus;rn public Manager(String n,double s,int year,int month,int day)rn super(n,s,year,month,day);rn bonus = 0;rn rn rn public double getSalary() rn double baseSalary = super.getSalary();rn return super.getSalary()+baseSalary;rn rn rn public void setBonus(double b)rn bonus =b;rn rn rn public boolean equals(Object otherObject)rn if(!super.equals(otherObject)) return false;rn Manager other = (Manager)otherObject;rn return bonus == other.bonus;rn rn rn public int hashCode()rn return super.hashCode()rn +17*new Double(bonus).hashCode();rn rn rn public String toString()rn return super.toString()rn +"[bonus="+bonusrn +"]";rn rn rn rn rn rnrn[/code]

Java中“==”和equals的比较

09-25

在Java中,boolean、byte、short、int、long、char、float、double这八种是基本数据类型,其余的都是引用类型。rn“==”是比较两个变量的值是否相等,“equals”是比较两个对象变量所代表的对象的内容是否相等。rn例如下面的代码rnpublic static void main(Strint[] args)rnrn String str1=new String("abc");rn String str2=new String("abc");rn if(str1==str2)rn rn System.out.println("str1==str2");rn rn elsern rn System.out.println("str1!=str2");rn rnrn 可能我们都会以为输出的应该是str1==str2,但是结果却是str1!=str2。这个并不是我们想要的,那么为什么会出现这样的情况的呢,我们仔细想想,在java中不存在指针,存在的只是引用,当我们使用String str1 的时候他并没有创建什么对象,只是在栈内存上开辟了一个空间,用于存放str1我存储的东西,当然我们没有使用new String之前,在str1的空间里的值是NULL。只有当我们调用了new String之后才会真正的在堆内存上去创建str1这个对象的实体。这时候在栈内存中的str1存储的是str1在堆中实体对象的首地址。同样str2也是执行同样的操做。可能还是不懂,下面看一张图片,大家就应该明白了。rnrnrn 当我们执行上面的代码的时候,str1和str2存储的分别是str1和str2的实体对象的首地址,并不是对象本身,所以输出的结果才是str1!=str2。rn 下面我们来修改一下上面的代码rnpublic static void main(String[] args)rnrn String str1=new String("abc");rn String str2=new String("abc");rn String str3=str1;rn if(str1==str2)rn rn System.out.println("str1==str2");rn rn elsern rn System.out.println("str1!=str2");rn rn if(str1==str3)rn rn System.out.println("str1==str3");rn rn elsern rn System.out.println("str1!=str3");rn rnrn上面的代码我们创建了一个String对象str3,并将str1负值给str3,这样按照上面的那张图片,str3存储的应该是和str1一样的地址,所以我想大家就知道输出的结果了,str1==str3。rn 可是我们很多时候想做的并不是这个比较,我们想做的是比较两个对象的值是否相等,我们可以使用Object类中的equals()方法。由于在java中规定所有的类都是Object所以也就会继承这个方法,但是在String类中,String类重写了这个方法,在java帮助文档中给出了如下的描述:rnequalsrnpublic boolean equals(Object anObject)rn将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为true。rn覆盖:rn类 Object 中的 equalsrn参数:rnanObject - 与此 String 进行比较的对象。rn返回:rn如果给定对象表示的 String 与此 String 相等,则返回 true;否则返回false。rn我们可以调用String的类的equals()方法传递一个我们想要比较的对象,我们按照这个将程序改成如下:rnpublic static void main(String[] args)rnrn String str1=new String("abc");rn String str2=new String("abc");rnif(str1.equals(str2))rn rn System.out.println("str1 equals str2");rn rn elsern rn System.out.println("str1 not equals str2");rn rnrn程序的输出结果是str1 equals str2。最后在总结一下:当我们声明一个引用类型变量时,系统只为该变量分配了引用空间,并未创建rn一个具体的对象;当用new为对象分配空间后,将对象的引用赋值给引用变量。当我比较两个对象的引用的时候,比较只是对象的首地址,只有调用equals()方法的时候我们才能用于比较两个对象的值。

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试