几个例子说明JAVA中的equals和==区别

原创 2017年01月03日 16:57:51

先说一下java的数据类型:

可以分为基础数据类型和引用类型。引用类型一般是用户自定义的类型如People,或是java自带的引用类型如String等等。

包装类型可以看作是基本数据类型的引用类型。Java为每一个基本数据类型提供了一个封装类,除了int(Integer)和char(Character)其余类型首字母大写即成封装类的类型名。如double (Double), float(Float),long(Long), short(Short),byte(Byte),boolean(Boolean).

int和Integer为例,Java中int和Integer区别是:

int是基本的数据类型,默认值可以为0;

Integer是int的封装类,默认值为null;

int和Integer都可以表示某一个数值;

int和Integer不能够互用,因为他们是两种不同的数据类型。

--------------------------

JAVA的API文档,Object 类的equals方法是这样描述的:

对于任何非空引用值 y,当且仅当引用同一个对象时,此方法才返回 true,也就是说比较的是对象x和y在内存中的区域是否一致,如果不是同一块区域则返回false.

其他类怎么使用equals和==呢?

基本类型的==比的是值,而不是对象,判断二者的内容是否相同。引用类型的==比较的是对象(内存地址)。

JAVA的API里的大部分类(例如Integer、String)都重写了equals方法,重写后的equals就不是比较对象了,而是比较值(内容)。

没有重写equals()的类一般是我们自定义的类。如果想比较自定义类的对象,那么使用equals和使用==是一样的,都是比较句柄地址,因为自定义的类都默认继承于Object,而Object中的equals就是用==来实现的。

示例代码如下:

public class EqualsComparation {

    public static void main(String[] args) {
        comparation01();
        comparation02();
    }

    public static void comparation01() {
        byte b1 = 4, b2 = 4; char c1 = '你', c2 ='你'; double d1 = 4.0, d2 = 4.0; long lg1=100, lg2=200; boolean b3=true, b4=true;
        if (b1==b2){
            System.out.println("==比较俩基本型:byte型的值相同");}
        if (c1==c2){
            System.out.println("==比较俩基本型:char型的值相同");}
        if(d1==d2){
            System.out.println("==比较俩基本型:double型的值相同");}
        if(b3 == b4){
            System.out.println("==比较俩基本型:boolean型的值相同");}
        if(lg1 != lg2){
            System.out.println("==比较俩基本型:两个long型的值不同!");}
        
        String s1="写作业呢", s2="写作业呢";   // 位于方法区中的常量池,常量就意味着只有一个对象
        String s5=new String(), s6=new String(), s7=s6;
        if(s1 == s2){
            System.out.println("String引用型s1==s2比较俩对象地址的结果:是同一个对象(常量)");}

        Integer itg3=new Integer("10"), itg4=new Integer("10") ;
        if(itg3 != itg4){
            System.out.println("==结果: 引用型itg3=new Integer(10)和itg4=new Integer(10)不是同一个对象(堆内存地址)!");}
        if (itg3.equals(itg4)){
            System.out.println("Integer引用类型的itg3.equals(itg4)比较的是值:结果为true");}
        
        if(s5.equals(s6)){
            System.out.println("String型重写了equals(), 比较俩值结果:是相同的");}
        if(s6 == s7){
            System.out.println("String引用型s6=new String(), s7=s6,==比较的结果:是同一个对象");}
        }

        public static void comparation02(){
            int a1=1; int a2=1;
            Integer b1 =new Integer (1); Integer b2 =new Integer (1);
            // 基本型的==比较的是值而不是对象
            System.out.println("int a1=1; int a2=1; a1==a2:\t"+(a1==a2));
            // 比的是对象(内存地址)
            System.out.println("Integer b1 =new Integer (1); Integer b2 =new Integer (1); b1==b2:\t"+(b1==b2));
            // 俩对象地址不同 。但是Integer已重写equals, 比较的是内容:相同
            System.out.println("Integer b1 =new Integer (1); Integer b2 =new Integer (1); bi.equals(b2):\t"+ (b1.equals(b2)));
        }
}

运行结果:

==比较俩基本型:byte型的值相同
==比较俩基本型:char型的值相同
==比较俩基本型:double型的值相同
==比较俩基本型:boolean型的值相同
==比较俩基本型:两个long型的值不同!
String引用型s1==s2比较俩对象地址的结果:是同一个对象(常量)
==结果: 引用型itg3=new Integer(10)和itg4=new Integer(10)不是同一个对象(堆内存地址)!
Integer引用类型的itg3.equals(itg4)比较的是值:结果为true
String型重写了equals(), 比较俩值结果:是相同的
String引用型s6=new String(), s7=s6,==比较的结果:是同一个对象
int a1=1; int a2=1; a1==a2:    true
Integer b1 =new Integer (1); Integer b2 =new Integer (1); b1==b2:    false
Integer b1 =new Integer (1); Integer b2 =new Integer (1); bi.equals(b2):    true


版权声明:作者写文章辛苦,转载时请注明出处

相关文章推荐

基本类型和包装类之间的"=="和equals()方法

**public class HelloWorld {/* **1、基本型和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱...

JAVA中Stack和Heap的区别

1.Java中对象都是分配在heap(堆)中。从heap中分配内存所消耗的时间远远大于从stack产生存储空间所需的时间。 (1)每个应用程序运行时,都有属于自己的一段内存空间,用于存放临时变量、参数...
  • wl_ldy
  • wl_ldy
  • 2010-10-12 13:45
  • 11582

【java中==与equals的区别】java中==与equals的区别

java中的数据类型,可分为两类:  1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean    他们之间的比较,应用双等...

java 中字符串比较用=和equals区别

=:是比较两个字符串引用的地址是否相同,即是否指向同一个对象 equals方法:则比较字符串的内容是否相同。 例如String a = "abc";     String b = "...

java基础之instanceof的用法

nstanceof是Java的一个二元操作符,和==,>, String s = "I am an object!";  boolean isObject = s instanceof Objec...

Json转化工具类

package com.rest.ful.utils;import java.io.BufferedReader; import java.io.InputStream; import java.io...

Android数据库高手秘籍(七)——体验LitePal的查询艺术

经过了多篇文章的学习,我们已经把LitePal中的绝大部分内容都掌握了。现在回想起来了,增删改查四种操作中的前三种我们都已经学完了,不知道现在使用起数据库来,你有没有感觉到格外的轻松和简单。但是呢,我...

求集合的幂集

求集合的幂集,我总结了2种方法1 这道题如果刚开始没有思路,可以考虑一下一个元素在不在子集中是有两种状态的,可以用什么表示呢?如果用0表示不在,1表示在的话,就是01序列的2进制数。只需要遍历0-2的...

java数组

动态初始化: int[]arr1 = new int[5]; //声明、创建 arr1[0] = 0;//初始化 arr1[1] = 1; arr1[2] = 2; arr1[3] = 3; arr1...

大型网站技术架构(一)--大型网站架构演化

看完了有一本书,就应该有所收获,有所总结,最近把《大型网站技术架构》一书给看完了,给人的印象实在深刻,再加上之前也搞过书本上讲的反向代理和负载均衡以及session独立存储和缓存,因此书本看起来还是挺...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)