iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >java中关于==和equals的分析
  • 162
分享到

java中关于==和equals的分析

java==equals分析 2019-12-15 03:12:29 162人浏览 无得
摘要

==的分析对于基本数据类型,比较的是他们的具体内容是不是一样,跟他们的内存地址无关。举个例子:public class Test{ public static void main(String[] args) { int i =

==的分析

对于基本数据类型,比较的是他们的具体内容是不是一样,跟他们的内存地址无关。

举个例子:

public class Test{
	
	public static void main(String[] args) {
		int i = 10;
		double j = 10.0;
		float m = 10.0f;
		char k = 10;
		boolean b = true;
		
		System.out.println(i == j);
		System.out.println(i == m);
		System.out.println(m == k);
		System.out.println("*******************");
		//System.out.println(i == b);  很明显,布尔型不能和其他基本数据类型比较,编译报错.
		System.out.println(System.identityHashCode(i));
		System.out.println(System.identityHashCode(j));
		System.out.println(System.identityHashCode(m));
		System.out.println(System.identityHashCode(k));
		System.out.println(System.identityHashCode(b));
	}
}

输出:

true
true
true
*******************
366712642
1829164700
2018699554
1311053135
118352462

相关视频教程推荐:java免费视频教程

分析:

①根据比较的结果和内存地址来看,内容一样,内存地址不一样,但是返回的结果都是true,说明比较的 时候只看变量中存储的内容是否相同,而跟内存地址无关。

②==比较的两边数据需要能强制转换成同一类型,比如int和double的比较,会强制转换到double。

③布尔类型不能和int,float,double,char等基本数据类型做比较,编译时就报错。

对于引用数据类型的比较:

public class Test{
	
	public static void main(String[] args) {
		Test t1 = new Test();
		Test t2 = new Test();
        String name1 = "琼宝";
		String name2 = "琼宝";
		
		System.out.println(name1 == name2);						 // true
		System.out.println(System.identityHashCode(name1));		 //366712642	
		System.out.println(System.identityHashCode(name2));		 //366712642
		
		System.out.println(t1 == t2);                             //false
		System.out.println(System.identityHashCode(t1));          //366712642
		System.out.println(System.identityHashCode(t2));          //1829164700
        System.out.println(System.identityHashCode(new Test()));  //2018699554
		System.out.println(System.identityHashCode(new Test()));  //1311053135
        System.out.println(new Test() == new Test());
	}
}

输出:

true
366712642
366712642
false
366712642
1829164700
2018699554
1311053135
false

分析:

①对于引用数据类型,此时涉及到两块内存的问题, 而且比较的也是内存地址是否相同,比如执行语句:

Test t1 = new Test() Test t2 = new Test()时,会开辟两块内存,一块用于储存t1 t2 ,一 块用于储存两个 new Test()。而很明显的是,t1和t2的内存地址不一样,就连两个new Test()的地 址都不一样,所以此时用==来比较的时候,结果必然是false.

(补充:t1和t2中存储的其实是new Test() 对象使用的内存的首地址。)

②对于String类型来说,内容相同的时候,其内存地址也相同,比较的时候看的也是地址。

如果要比较对象中存储的内容是否相同(不是比较地址),那么==就无法实现,此时需要equals。

equals的分析

先看一个equals比较的例子:

public class TestEquals {
	public static void main(String[] args) {
		
		TestEquals t1 = new TestEquals();
		TestEquals t2 = new TestEquals();
		System.out.println(t1.equals(t2));  //false
		
		String s1 = new String();
		String s2 = new String();		
	
        System.out.println(System.identityHashCode(s1));
		System.out.println(System.identityHashCode(s2));
		System.out.println(System.identityHashCode(new String()));
		System.out.println(System.identityHashCode(new String()));
        System.out.println(s1.equals(s2));  // true
	}
}

输出结果:
false
366712642
1829164700
2018699554
1311053135
true

分析:

①t1和t2的比较是false,而s1和s2的比较是true,这里就涉及到了equals方法的重写问题,先看 Object类 中equals的源码

public boolean equals(Object obj) {
        return (this == obj);
    }

② 对于s1.equals(s2) ,this就是s1,obj是s2,而源码中的比较用的是==,很明显是引用数据类型的比 较,看的是s1和s2的内存地址,上面的分析已经知道他们的地址不一样,所以结果自然就是false.

③而s1和s2的比较结果是true,这是因为在String类中,equals方法被重写了,看源码:

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

④通过和object中equals源码的对比可以看出,String中的equals方法比较的不再是对象的地址,而是看 两个对象内容,或者两个对象的属性是否都一样。

⑤像String,Date,File…等类都对equals方法进行了重写。

总结:

==用于比较基本数据类型时,比较的是内容是否相等,比较引用数据类型时,看的是内存地址是否相等。

equals只能比较引用数据类型(对象),没被重写之前,使用==来比较内存地址,重写后比较的是对象的具 体内容和属性是否一致。

更多相关文章教程请访问:java编程入门

--结束END--

本文标题: java中关于==和equals的分析

本文链接: https://www.lsjlt.com/news/1726.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java中关于==和equals的分析
    ==的分析对于基本数据类型,比较的是他们的具体内容是不是一样,跟他们的内存地址无关。举个例子:public class Test{ public static void main(String[] args) { int i = ...
    99+
    2019-12-15
    java == equals 分析
  • JAVA语言中关于EJB技术的分析
    本篇内容主要讲解“JAVA语言中关于EJB技术的分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JAVA语言中关于EJB技术的分析”吧!JAVA语言中关于EJB技术概论,Enterprise ...
    99+
    2023-06-17
  • Java详细解析==和equals的区别
    目录1、== 解析2、equals 方法解析3、equals方法具有以下特性1、== 解析 == 常用于相同的基本数据类型之间的比较,也可用于相同类型的对象之间的比较; 如...
    99+
    2022-11-13
  • Java 中 hashCode() 与 equals() 的关系(面试)
    目录一.基础:hashCode() 和 equals() 简介equals()hashCode()二. 漫谈:初识 hashCode() 与 equals() 之间的关系三. 解密:...
    99+
    2022-11-13
  • Java自定义equals产生的问题分析
    目录Java自定义equals注意事项logback.xml配置maxFileSize单位问题SpringCloud gateway项目引入druidShell编写脚本Java自定义...
    99+
    2023-01-30
    Java自定义equals Java equals
  • java中关于对象的实例比较分析
    本篇内容主要讲解“java中关于对象的实例比较分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java中关于对象的实例比较分析”吧!同类型对象的比较三个维度去比较同一性相等性相似性样例引入想象...
    99+
    2023-06-26
  • Java中关于文件路径读取问题的分析
    Java读取文件路径 记录一种通用获取文件绝对路径的方法,即使代码换了位置了,这样编写也是通用的: 注意: 使用以下方法的前提是文件必须在类路径下,类路径:凡是在src下的都是类路径...
    99+
    2022-11-12
  • ogg中关于handlecollisions的示例分析
    今天就跟大家聊聊有关ogg中关于handlecollisions的示例分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。handlecollisio...
    99+
    2022-10-19
  • 一篇文章带你了解java Object根类中关于toString,equals的方法
    目录toString:代码案例:equals:代码案例:总结toString: 概念:拼接对象的地址值;toString()方法用于返回表示对象值的字符串(返回的是String对象)...
    99+
    2022-11-12
  • Android中关于JSON相关应用分析
    本文分析了Android中关于JSON相关应用。分享给大家供大家参考,具体如下: JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为...
    99+
    2022-06-06
    JSON Android
  • Python 关于日志的分析
    项目情况介绍:基于Python 3.6.6 ,实现对nginx访问的日志分析代码,实现了对日志中code的占比统计和浏览器类型和访问情况统计实现的代码段有:1.编写窗户函数,实现在一定的时间内对数据进行分析2.通过正则表达式对日志进行匹配,...
    99+
    2023-01-31
    日志 Python
  • 关于php的示例分析
    这篇文章主要介绍关于php的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是phpPHP 是 PHP Hypertext Preprocessor(超文本与处理器)的首字母缩写。这种方法叫做递归缩写。ph...
    99+
    2023-06-15
  • Java中equals和==的区别详解
    目录1.java中的数据类型,可分为两类: 2.再稍微改动一下程序,会有更奇怪的发现: 3. 字符串缓冲池 4.再次更改程序: 总结1.java中的数据类型,可分为两类: 1.基本...
    99+
    2022-11-12
  • 详解Java中==和equals()的区别
    目录1. ==1.1 基本数据类型1.2 引用数据类型1.3 小结2. equals3. 总结1. == == 是运算符,用来判断两个值是否相等,==可以使用在基本数据类型变量和引用...
    99+
    2022-11-12
  • 关于java中堆内存与栈内存的详细分析
    一、概述在Java中,内存分为两种,一种是栈内存,另一种就是堆内存。二、堆内存什么是堆内存?堆内存是Java内存中的一种,它的作用是用于存储Java中的对象和数组,当我们new一个对象或者创建一个数组的时候,就会在堆内存中开辟一段空间给它,...
    99+
    2017-04-01
    java入门 java 堆内存 栈内存 分析
  • 关于PHP不死马的分析和总结
    PHP不死马是我们达到权限维持的目的。 不死马的原理: 由客户端发起的Web请求后,中间件的各个独立的组件如Listener、Filter、Servlet等组件会在请求过程中做监听、判断、过滤等操作,内存马就是利用请求过程在内存中修改已有的...
    99+
    2023-09-21
    php servlet java
  • Pytorch中关于model.eval()的作用及分析
    目录model.eval()的作用及分析结论Pytorch踩坑之model.eval()问题比较常见的有两方面的原因1) data2)model.state_dict()model....
    99+
    2023-02-03
    Pytorch model.eval model.eval的作用 model.eval()
  • Flutter中关于angle的坑实例分析
    这篇“Flutter中关于angle的坑实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Flutter中关于angle...
    99+
    2023-07-02
  • 关于Java的HashMap多线程并发问题分析
    目录并发问题的症状多线程put后可能导致get死循环多线程put的时候可能导致元素丢失put非null元素后get出来的却是nullHashMap数据结构HashMap的rehash...
    99+
    2023-05-19
    Java HashMap HashMap多线程并发
  • 关于二分法查找Java的实现及解析
    目录二分法查找概述递归实现递归实现代码循环实现代码(非递归)二分法查找(递归、循环)二分法查找 概述 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作