浅谈==和equals的区别
java中的==和equals的区别?
看上面的代码,输出的结果是:
true
false
true
true
1.为什么会有上面的区别呢?==和equals比较的到底是什么呢?
搞清楚两者的区别其实很简单,在thinking in java 中有一句话,需要我们好好体会下:"关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系"。
首先我们都知道==就是一个关系操作符,那么==比较的就是操作数值之间是否相等。当操作数值的类型是基本类型的时候,操作的值就是变量存储的值,例如int a = 10,int b = 10;很明显,a,b的值都是10,因此a==b的结果是true。当操作数的类型不是基本类型的时候,例如是引用类型的变量,例如 Stirng str1 = new String("123") String str2 = new String("123");当判断 str1==str2,我们还是根据上面那句话来判断,明确str1和str2的值到底是不是一样即可。str1是一个引用类型,指向的是一个String对象,在内存str1存储的值是一个地址,这个地址记录了对象在堆内存中的存储地址,那么很明显,str1和str2指向两个不同的对象,即str1和str2的值不同。所以str1==str2的结果是false.
2.equals方法的特殊之处
很明确,equal是一个方法,是Object类中定义的一个方法,看下发方法的构成:
很明显,equals最终比较的是两个对象引用的值,那么str1.equals(str2)的结果应该是false,可运行结果是true,这是怎么回事呢?是不是上面那句话有问题呢?不是的,那是因为String这个类继承了Object类,并且重写了equals方法。看下重写的equals方法
从代码很容易知道,String的equals方法,首先判断两个对象是否相同,如果不同,比较两个字符串的值是否相同。如果相同返回true.因此str1.equals(str2)的结果是true。同样的诸如Double,Date,Integer等,都对equals方法进行了重写用来比较指向的对象所存储的内容是否相等,所以equals()比较,需要具体情况具体分析。
3.总结
==,如果是基本类型,则直接比较存储的值是否相等,如果是引用类型,则比较所指向的对象的地址是否相同
equals方法,基本类型不能使用equals,如果未对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址,如果进行了重写,则根绝重写的方法具体情况具体分析。
浅谈==和equals的区别的更多相关文章
- [转]浅谈Hive vs. HBase 区别在哪里
浅谈Hive vs. HBase 区别在哪里 导读:Apache Hive是一个构建于Hadoop(分布式系统基础架构)顶层的数据仓库,Apache HBase是运行于HDFS顶层的NoSQL(=No ...
- 浅谈Sass与Less区别、优缺点
Sass是一种动态样式语言,Sass语法的缩排语法,比Css比多出很多功能,如变量,嵌套,运算,继承,颜色处理,函数等,易于阅读.Cass的安装需要安装Ruby环境,是服务器端处理的,Less是需要引 ...
- 浅谈sass与less区别优缺点
Sass是一种动态样式语言,Sass语法的缩排语法,比Css比多出很多功能,如变量,嵌套,运算,继承,颜色处理,函数等,易于阅读.Cass的安装需要安装Ruby环境,是服务器端处理的,Less是需要引 ...
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
- 浅谈Java中的equals和==
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...
- 浅谈sql 、linq、lambda 查询语句的区别
浅谈sql .linq.lambda 查询语句的区别 LINQ的书写格式如下: from 临时变量 in 集合对象或数据库对象 where 条件表达式 [order by条件] select 临时变量 ...
- 浅谈Java中set.map.List的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
- 【转】浅谈Java中的equals和==
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...
- Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
随机推荐
- 广搜最短路径变形,(POJ3414)
题目链接:http://poj.org/problem?id=3414 解题报告: 1.每个节点都是一个独立的状态 2.这里的状态转移就是有几种出路,4种:1.倒掉a中的水,2.把a中的水倒到b中去, ...
- innerHTML动态添加标签的注意事项
在使用javascript动态添加页面上元素时,我们经常会使用DOM去逐个地将节点添加到文档碎片中,再将整个文档节点添加到DOM树中.其实还有一种方法动态添加元素:innerHTML. 我最近要将一大 ...
- ReactiveCocoa,最受欢迎的iOS函数响应式编程库(2.5版),没有之一!
简介 项目主页: ReactiveCocoa 实例下载: https://github.com/ios122/ios122 简评: 最受欢迎,最有价值的iOS响应式编程库,没有之一!iOS MVVM模 ...
- 小程序navigateTo和redirectTo的使用
最近公司商城项目,有个小问题,就是在商品详情页>购物车页>确认下单页>支付成功和取消支付都会前往订单详情页.当时我没想这么多就全部跳转都用了navigateTo,这样做的话,第一个问 ...
- Maven - 修改本地仓库位置
默认的本地仓库是在:当前的用户目录/.m2/repository 修改位置: 1. 打开maven的conf/settings.xml,找到如下图这一段: 2. 把<localRepositor ...
- python中上双互斥锁的线程执行流程
import threading def sing(): print('进入sing -----------------') for i in range(3): print('进入sing循环 -- ...
- pwn的一些环境搭建
<1>pwntools库安装 pwntools是一个CTF框架和漏洞利用开发库,用Python开发,由rapid设计,旨在让使用者简单快速的编写exploit. 本文将基于KUbuntu ...
- LeetCode979. 在二叉树中分配硬币
问题:979. 在二叉树中分配硬币 给定一个有 N 个结点的二叉树的根结点 root,树中的每个结点上都对应有 node.val 枚硬币,并且总共有 N 枚硬币. 在一次移动中,我们可以选择两个相邻的 ...
- Mysql_Binary_Install_Scripts(采用二进制方式安装)
1.1 MYSQL实现代码 #!/bin/bash ######################################## #auth:wolf_dreams #time:2018-1 ...
- is和==,encode和decode
0.编码解码 >encode和decode a = "你好" s = a.encode("GBK") print(s) # b'\xc4\xe3\xba\ ...