当前位置:首页 » 编程语言 » java对象的比较

java对象的比较

发布时间: 2024-03-15 02:24:52

1. java对象的比较

比较对象的时候有两种相等的情况(看你需要哪一种)
第一种:地址相等,通过==号来比较他们是否是指向同一个地址
第二种:他们的属性相等,有时候两个对象只要他们的属性相等我们就认为他们两个是相等的,那么这种比较就需要你自己重载equals方法,然后在里面判断他们的属性,如果他们的属性全班相等或根据你的需要哪些相等那么他们就相等

比如有一个正方行类
Square s1 = new Square(5);
Square s2 = new Square(5);
这时候你只需他们的边长相等,就认为他们是相等的,那么equals方法就可以这样写

@Override
public boolean equals(Square s) {
return this.side = s.getSide();//side是边长
}

2. 深入java的equals方法,怎么比较两个对象的

当定义一个类时,首先这个类会继承Object类(所有类的父类)的equals方法,然后开发者可以根据具体业务场景去考虑要不要重写equals方法。

publicbooleanequals(Objectobj){
return(this==obj);
}

上面代码即是Object的equals方法的实现, == 判断,即两个对象的地址完全一样的时候才相等。

当开发者定义类时不重写equals方法,则实际调用中使用Object这个父类的equals方法实现。

下面看看String的equals方法:

publicbooleanequals(ObjectanObject){
if(this==anObject){
returntrue;
}
if(anObjectinstanceofString){
StringanotherString=(String)anObject;
intn=value.length;
if(n==anotherString.value.length){
charv1[]=value;
charv2[]=anotherString.value;
inti=0;
while(n--!=0){
if(v1[i]!=v2[i])
returnfalse;
i++;
}
returntrue;
}
}
returnfalse;
}

这就是String重写的equals方法,可以仔细看看,很有参考价值。

接下来写段类定义的代码:

publicclassPerson{
privateStringname;//姓名
privateintage;//年龄
privateStringspeciality;//特长

@Override
publicbooleanequals(Objectobj){
//两个对象是同一个时,直接returntrue
if(this==obj){
returntrue;
}
if(objinstanceofPerson){
//比较对象也是Person对象时,判断name和age是否都相同
Personp=(Person)obj;
returnname.equals(p.name)&&age==p.age;
}
returnfalse;
}

publicStringgetName(){
returnname;
}

publicvoidsetName(Stringname){
this.name=name;
}

publicintgetAge(){
returnage;
}

publicvoidsetAge(intage){
this.age=age;
}

publicStringgetSpeciality(){
returnspeciality;
}

publicvoidsetSpeciality(Stringspeciality){
this.speciality=speciality;
}
}

测试代码:

publicclassTest{

publicstaticvoidmain(String[]args)throwsIOException{
Personp1=newPerson("张三",20,"java");
Personp2=newPerson("张三",20,"python");

System.out.println(p1.equals(p2));
}
}

根据Person重写的equals方法可以知道,运行结果为 true

如果Person没有重写equals方法,那么会调用Object的equals方法,运行结果为 false

所以实际怎么比较两个对象这完全是看开发者也就是你自己的意思

3. java怎么比较2个对象

//抽象父类
abstract class CompareObject {abstract double compareTo();}
//派生子类
class Position extends CompareObject {

double x,y;
public Position(double g,double h) {this.x=g;this.y=h;}
public double getx(){return x;}
public double gety(){return y;}
public static double compareTo(Position a,Position b) { //自己派生的方法
return Math.sqrt(a.x*a.x+a.y*a.y)-Math.sqrt(b.getx()*b.getx()+b.gety()*b.gety());
}
/*继承父类的比较方法作用到子类对象中,必须在父类里面定义比较的方法体,而你这里没有。所以你可以选择自己重新定义一个方法体。
* 也可以在父类里面写好比较的方法体。
*/
double compareTo(CompareObject ca, CompareObject cb) { //实现父类中的方法
// TODO Auto-generated method stub
return 0;
}

public static void main(String[] args){
//比较2点与原点距离之差
Position a=new Position (5,4);
Position b=new Position (7,3);
System.out.println("两点到原点的距离之差为"+compareTo(a,b));
}
@Override
double compareTo() {
// TODO Auto-generated method stub
return 0;
}
}

4. java怎么只比较两个对象的内容

使用 == 进行比较, 该方式比较的是变量是否同时指向一块内存地址,如果是就返回true,否则返回false
使用对象本身的equals进行比较,equals首先会进行 == 比较,然后会进行逻辑比较,当然你可以自己定义自己的比较逻辑,比如JDK内置的String,Integer,Long等都是重写了这个equals方法的。
总的来说就是 == 表示完全相等,而equals表示逻辑相等

5. java怎么比较2个对象

你这个compareTo方法是干啥的?思路不清啊....
你应该写的是一个点的对象(Position)..他要和别一个点(Position )去比较.所以至少你的Position 类中的compareTo这个方法里要获得别一个点的对象.
也就是说应该在实现类中有这样的形式
点1对象.compareTo(点2对象);//说白了就是你的实现类里这行
System.out.println("两点到原点的距离之差为"+compareTo());
应该改成
System.out.println("两点到原点的距离之差为"+a.mpareTo(b);
在计较的时候.也就是你的compareTo()这个方法里..就应该是对象1的距离-对象2的举例
也就是类似这样的.
Math.sqrt(a.getx()*a.getx()*+a.gety()*a.gety())-Math.sqrt(b.getx()*b.getx()+b.gety()*b.gety();//

6. java中怎样比较两个对象是否为同一个对象

一.跟对象比较的几个相关的概念。

为了更加审核的理解对象比较的含义以及多个比较方法之间的差异,笔者认为读者首先需要了解几个相关的概念,或者说几对关系。

1.是类与对象的关系。类是具体的抽象,而对象是类的具体实现。这可能听起来还是有点模糊。做一个形象的比喻,类就好像是用来制作塑料盒子的模具,只要将PVC料注入到这个模具中就可以生产对应形状的盒子。而对象就好像是生产出来的盒子。虽然模具同一个,但是生产出来的盒子彼此之间仍然是不同的。一方面先天性就是不同的。因为根据相对论可以说明世界上没有两个相同的东西。其次后天性的影响,也会导致其不同。如生产出来后,在两个盒子上分别贴上不同的条码,他们两个就代表不同的盒子了。了解这个类与对象之间的关系,对于了解对象之间进行比较,会有很大的帮助。

2.是需要知道类与对象在内存中的实际存储情况。当程序员定义一个类时(不含有静态成员或者变量),一般不会在内存中给其分配一个存储结构。而只有定义对象时,才会在内存中分配存储结构。当利用同一个类定义不同的对象时,系统会在内存中为不同的对象创建不同的存储结构。也就是说,会对应不同的内存地址。虽然同一个类中定义出来的对象,其内容可能相同(成员变量、成员方法等等都相同),但是其内存中的地址仍然是不同的。

3.是需要注意对象的复制问题。如果要创建几个内容相同的对象,即复制相同内容的对象,现在主要有两种方法。一是通过成员变量赋值来完成。如在根据同一个类创建对象时,分别给与他们相同的初始化值。那么这两个对象的内容就是相同的。二是通过地址赋值来完成。即将第一个对象在内存中的地址赋值给第二个对象。此时两个对象名字虽然不同,但是他们却指向内存中的同一块区域。此时就好像一个人有两个名字,其实是同一个人。所以这两个对象内容也就相同了。

二.利用==运算符与equals方法来比较对象。

在Java语言中,主要可以利用==运算符(两个等号)和equal函数来对对象进行比较。不过这两个符号其实现的机制不同。或者说,对于同样的两个对象,如果利用他们来进行比较的话,往往会有不同的结果。如String是Java自定义的对象,其主要用来存储字符串数据。现在笔者利用如下语句定义了三个String对象。
◆String str1=new String(“welcome”); //创建一个对象,给利用单词welcome初始化
◆String str2=new String(“welcome”); //创建一个对象,给利用单词welcome初始化
◆String str3=str1; //创建一个对象,并利用对象str1的地址赋值

以上三个对象,显而易见,其内容都是相同的。但是利用这个两种方式来对他们进行比较的时候,往往会有不同的结果。如利用==(两个等号)比较符号来进行比较,str1==str2,最后返回的结构是false,也就是他们是不相同的对象。可是如果比较str1==str3对象,则最后返回的结果却是true。但是利用equal函数来比较,则返回的结果是相同的。为什么对象的内容相同,它们返回的结果却是不同的呢?

要回答这个问题,就需要大家先回顾一下笔者上面谈到的几对关系。首先,对象str1与对象str2的关系,就好像是同一个模具出来的两个盒子,他们从外观看起来虽然相同,但是通过放大镜或者其他精密仪器仍然可以看到,两个盒子是不同的东西。这两个对象虽然内容相同,但是其在内存中分配的地址不同。也就是说,是同一个模具出来的外观看起来相同的不同的盒子。而对象str1与对象str3就好像是一个人有两个名字。虽然名字不同,但是实际上是同一个人。这主要是因为他们的身份证号码相同。其实这个身份证号码就好像是内存中发配的地址,而对象名字就好象是人的名字。一个人可以有好几个名字(一个对象有好几个名字),但是其身份证号码只有一个(内存分配地址只有一个)。在上面的语句中,通过str3=str1,其实现的功能,并不是将对象str1的值赋值给对象str3。而是将对象str1在内存中的地址赋值给了对象str1(就好像是将一个人的身份证号码复制给了另外一个人)。所以从本质上说,str3并不是一个新建立的对象。因为系统并没有在内存中为其分配一个新的存储区域(即并没有创造一个新的人),而只是好像给对象另外取了一个别名。

所以说,在对象比较的时候,需要搞清楚一个问题。即现在要比较的是他们的内容还是在内存中指向的地址。一般来说,内容相同不一定他们在内存中指向的地址也是相同的。而不同的对象在内存中若指向同一个地址,则他们的内容肯定是相同的(因为他们实际上就是同一个对象)。而==(两个等号)运算符与 equal函数就是运来比较这两块内容的。其中==运算符是用来比较内存中的地址是否相同,即比较它们的身份证号码是否相同。而equal函数则只比较他们的内容。如果他们的内容相同,即使身份证号码不相同(内存中的地址不同),这个函数也人们他们是相同的,会返回TRUE值。这就是这个两个对象比较方式的最大不同。或者说,他们在对对象进行比较时,出发点不同。一个比较对象名字所指向的内存地址是否相同,另外一个比较的时对象名字所指向的存储模块中的内容是否相同。所以他们就会返回不同的结果。

三.慎用内存地址赋值。

在实际工作中,笔者提醒程序开发人员,要慎用这种str3=str1内存地址的赋值形式。其实,利用这种形式来创建对象,其实根本没有创建一个新的对象。而只是将两个对象同时指向内存中的同一个存储区域。由于他们实际上是同一个对象,为此通过其中一个对象修改了对象的内容,那么另外一个对象名字调用的对象其也会受到影响。也就是说,它们相互之间缺乏独立性。为此在创建对象的时候,如果没有特殊的必要,最好为不同的对象名创建不同的实体对象。而不要将多个对象名指向同一个对象,这在开发应用程序的时候容易导致对象内容被无意中修改,从而导致应用程序结果出错。

最后笔者需要提醒的是,在选择对象比较方式的时候,要了解==运算符与euqal函数之间的差异。如果只是想比较对象的内容是否相同,则只需要使用equal函数即可。但是如果要比较他们是否是同一个对象,即在内存中是否指向同一个存储区域,则需要使用==运算符。在实际应用的过程中,千万不能够张冠李戴。否则的话,很容易导致相反的结果。特别是将他们返回的值当作条件判断语句时,更加需要谨慎。因为此时如果选择的方法错误,则最后产生的结果往往是相反的。所以在对象进行比较时,跟变量的比较有很大的差异。在对象的比较上,程序员要谨慎行事。最根本的一点就是要搞清楚,到底比较的是什么东西,是对象内部的存储内容还是在对象名字与内存之间的关联关系(对象内存地址)。搞清楚这一点后,那么到底选择采用哪种方式来进行比较也就引刃而解了。

热点内容
咋清理缓存 发布:2024-11-29 03:18:38 浏览:12
linux服务器的配置文件 发布:2024-11-29 03:18:31 浏览:615
安卓软件误删软件如何恢复 发布:2024-11-29 02:55:58 浏览:232
我的世界安卓手机如何改成官服 发布:2024-11-29 02:43:11 浏览:290
域服务器如何进行管理 发布:2024-11-29 02:43:08 浏览:186
ftp失火 发布:2024-11-29 02:42:27 浏览:194
flashas编程 发布:2024-11-29 02:38:49 浏览:369
先编译成什么格式的文件 发布:2024-11-29 02:38:48 浏览:120
王者荣耀安卓q区哪个英雄好拿标 发布:2024-11-29 01:56:04 浏览:666
网易收件服务器怎么填写 发布:2024-11-29 01:52:15 浏览:279