简单介绍java中equals以及==的用法

所属分类: 软件编程 / java 阅读数: 47
收藏 0 赞 0 分享

简单介绍

equals方法是java.lang.Object类的方法有两种用法说明:

一、对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。

1、“==”比较两个变量本身的值,即两个对象在内存中的首地址。(java中,对象的首地址是它在内存中存放的起始地址,它后面的地址是用来存放它所包含的各个属性的地址,所以内存中会用多个内存块来存放对象的各个参数,而通过这个首地址就可以找到该对象,进而可以找到该对象的各个属性)

2、“equals()”比较字符串中所包含的内容是否相同。

比如:

String s1,s2,s3 = "abc", s4 ="abc" ;
s1 = new String("abc");
s2 = new String("abc");

s1==s2  是 false   //两个变量的内存地址不一样,也就是说它们指向的对象不 一样,

s1.equals(s2) 是 true  //两个变量的所包含的内容是abc,故相等。
String s1,s2,s3 = "abc", s4 ="abc" ;
    s1 = new String("abc");
    s2 = new String("abc");
    System.out.println("s1==s2:"+(s1==s2));
    System.out.println("s1==s3:"+(s1==s3));
    System.out.println("s3==s4:"+(s3==s4));
    System.out.println("s1.equals(s2):"+(s1.equals(s2)));
    System.out.println("s1.equals(s3):"+(s1.equals(s3)));
    System.out.println("s3.equals(s4):"+(s3.equals(s4)));

测试图

注意:

 StringBuffer s1 = new StringBuffer("a");
 StringBuffer s2 = new StringBuffer("a");
 System.out.println("s1.equals(s2):"+(s1.equals(s2)));//结果为false

解释:StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,(Object类中的equals方法是用来比较“地址”的,所以等于false)注意:对于s3和s4来说,有一点不一样要引起注意,由于s3和s4是两个字符,串常量所生成的变量,其中所存放的内存地址是相等的,所以s3==s4是true(即使没有s3=s4这样一个赋值语句)对于非字符串变量来说,"=="和"equals"方法的作用是相同的都是用来比较其,对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。

比如:

class A
{
   A obj1  =  new A();
   A obj2  =  new A();
}
   obj1==obj2  //结果为false
   obj1.equals(obj2)//是false
   //但是如加上这样一句:
   obj1=obj2;  
   //执行后
   obj1==obj2 //是true
   obj1.equals(obj2) //是true

1、equals方法对于字符串来说是比较内容的,而对于非字符串来说是比较,其指向的对象是否相同的。

2、 == 比较符也是比较指向的对象是否相同的也就是对象在对内存中的的首地址。String类中重新定义了equals这个方法,而且比较的是值,而不是地址。所以是true。

关于equals与==的区别从以下几个方面来说:

(1) 如果是基本类型比较,那么只能用==来比较,不能用equals比如:

public class TestEquals { 
public static void main(String[] args) 
{ 
int a = 3; 
int b = 4; 
int c = 3; 
System.out.println(a == b);//结果是false 
System.out.println(a == c);//结果是true 
System.out.println(a.equals(c));//错误,编译不能通过,equals方法 
//不能运用与基本类型的比较 
} 
}

(2) 对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。比如

public class TestEquals { 
public static void main(String[] args) 
{ Integer n1 = new Integer(30); 
Integer n2 = new Integer(30); 
Integer n3 = new Integer(31); 
System.out.println(n1 == n2);//结果是false 两个不同的Integer对象,故其地址不同, 
System.out.println(n1 == n3);//那么不管是new Integer(30)还是new Integer(31) 结果都显示false 
System.out.println(n1.equals(n2));//结果是true 根据jdk文档中的说明,n1与n2指向的对象中的内容是相等的,都是30,故equals比较后结果是true 
System.out.println(n1.equals(n3));//结果是false 因对象内容不一样,一个是30一个是31 
} 
}

这是Integer的实例,如果是其他的比如Double、Character、Float等也一样

(3) 注意:对于String(字符串)、StringBuffer(线程安全的可变字符序列)、StringBuilder(可变字符序列)这三个类作进一步的说明。

(4)该例子是Java编程思想第三章的例子:

class Value 
{ 
int i; 
} 
public class EqualsMethod2 { 
public static void main(String[] args) { 
Value v1 = new Value(); 
Value v2 = new Value(); 
v1.i = v2.i = 100; 
System.out.println(v1.equals(v2));//(1)flase 
System.out.println(v1 == v2);//(2)true 
} 
}

运行结果疑问:乍一看结果,有点惊讶,为什么不是true呢,不是说equals方法是比较内容的吗?

解释:不错,如果在新类中被覆盖了equals方法,就可以用来比较内容的。但是在上面的例子中类Value并没有覆盖Object中的equals方法,而是继承了该方法,因此它就是被用来比较地址的,又v1和v2的所指向的对象不相同,故标记(1)处的v1.equals(v2)运行结果为false,标记为(2)处的v1 == v2运行结果也为false。

总结:

  如果是基本类型比较,那么只能用==来比较,不能用equals ,如果是基本类型的包装类型,那么用equals

更多精彩内容其他人还在看

Java输入输出流复制文件所用时间对比

这篇文章主要介绍了Java输入输出流复制文件所用时间对比的相关资料,非常不错,具有参考解决价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Java线程中start和run方法全面解析

这篇文章主要介绍了Java线程中start和run方法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Java的JSON处理器fastjson使用方法详解

下面小编就为大家带来一篇Java的JSON处理器fastjson使用方法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Java 二维码,QR码,J4L-QRCode 的资料整理

本文主要介绍Java 中二维码,QR码,J4L-QRCode,这里整理了详细的资料供大家学习参考关于二维码的知识,有需要的小伙伴可以参考下
收藏 0 赞 0 分享

java哈夫曼树实例代码

这篇文章主要为大家介绍了java哈夫曼树实例代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android读取本地或网络图片并转换为Bitmap

这篇文章主要为大家详细介绍了Android读取本地或网络图片,并转换为Bitmap,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java日期时间操作的方法

这篇文章主要为大家详细介绍了Java日期时间操作的一些方法,获得Calendar,定义日期/时间的格式等,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java 获取路径的各种方法(总结)

下面小编就为大家带来一篇java 获取路径的各种方法(总结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

java数据结构与算法之奇偶排序算法完整示例

这篇文章主要介绍了java数据结构与算法之奇偶排序算法,较为详细的分析了奇偶算法的原理并结合完整示例形式给出了实现技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

java数据结构与算法之双向循环队列的数组实现方法

这篇文章主要介绍了java数据结构与算法之双向循环队列的数组实现方法,结合实例形式分析了双向循环队列的原理与数组实现技巧,并附带说明了该算法的用途,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多