[转]谈谈Java中"=="与"equals()"
equals是Object超类中的一个方法,这个方法的实现就是通过==号实现的,==号比较的是两个对象的地址是否相同,在代码中体现出来就是比较两个对象引用中保存的地址是否相同,==能够判断的只是两个对象引用是不是指向同一个地址也就是同一个对象,所以它的相等判断是局限的:
A a1 = new A();A a2 = a1;这个时候a1 == a2是否为true?答案是yes,因为两个对象引用保存的是同一个对象的地址; A a1 = new A();A a2 = new A();这个时候a1 就不 == a2了,因为两个对象引用指向的是不同的对象. 正因为==号只能判断两个对象引用是否指向同一个对象,所以决不能用它比较两个普通对象是否相等,即使两个对象所有的实例域都相同,虽然这在现实中的语义是两个对象指的是同一个事物比如同一个人,但是因为在代码中它们分配在不同的地址,所以用==号判断它们是不相等的. 学过c#的人都知道,c#是可以用==号进行字符串相等判断的,那是c#对==进行运算符重载了的,java中没有运算符重载,哦,有一个,就是+号,能够用来拼接字符串,所以java不能用==号进行字符串相等判断.
对于字符串,有必要深究一下,是不是所有的字符串都不能用==号进行判断了,答案是no: 虚拟机将字符串常量是共享的,所以对于引用字符串常量的变量是可以用==号判断的,但是字符串的其他操作比如new String("HelloWorld") + substring replace等产生的新字符串不是共享的,所以后面这些方法产生的字符串不能用==号进行判断.给出下面一个例子: String hello = "hello';//hello是一个字符串常量的引用 if(hello == "hello")//true ... if(hello.substring(0,3) == "hel")//false ... 上面的例子中"hello" 和 "hel"都是字符串常量.
那么要按照现实世界的语义来比较两个对象是否相等,比如两个字符串含有的字符个数一样,对应索引上的字符一样也一样我们就认为它们相等,而不是仅仅判断内存地址来决定,该怎么办呢?解决方法就是重写equals方法,前面说过了Object超类中的equals方法就是用==实现的,所以假如一个类没有重写equals方法,那么当应用a1.equals(a2)时,跟用==号判断是一样的,所以要根据对象的实例域来判断两个对象是否相等的话一定要重写equals方法,eclipse有快速生成equals的捷径,你用到它的时候就知道了.
有了equals方法以后,我们再进行相等判断就不是根据对象的地址了,而是看你怎么实现这个equals方法,一般是根据对象的实例域来比较,比如姓名,身份证号,反正是一些特有或通用的属性,这个eclipse知道.
讲这么多只是告诉你==和equals进行相等测试时有哪些相似的和不同的地方,希望对你有所帮助.
[转]谈谈Java中"=="与"equals()"的更多相关文章
- 浅谈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 = ...
- Java中的equals和hashCode方法
本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要 ...
- Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例(转)
Java中==.equals.hashcode的区别与重写equals以及hashcode方法实例 原文地址:http://www.cnblogs.com/luankun0214/p/4421770 ...
- java集合(3)- Java中的equals和hashCode方法详解
参考:http://blog.csdn.net/jiangwei0910410003/article/details/22739953 Java中的equals方法和hashCode方法是Object ...
- 【Java学习笔记之二十九】Java中的"equals"和"=="的用法及区别
Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: String str1 = new String(" ...
- 谈谈JAVA中的安全发布
谈谈JAVA中的安全发布 昨天看到一篇文章阐述技术类资料的"等级",看完之后很有共鸣.再加上最近在工作中越发觉得线程安全性的重要性和难以捉摸,又掏出了<Java并发编程实战& ...
- Java中的equals和hashCode方法详解
Java中的equals和hashCode方法详解 转自 https://www.cnblogs.com/crazylqy/category/655181.html 参考:http://blog.c ...
- 关于Java中的equals方法
关于Java中的equals方法 欢迎转载,但是请填写本人的博客园原址https://www.cnblogs.com/JNovice/p/9347099.html 一.什么是equals方法 equa ...
随机推荐
- swap的实现(没有中间变量)
两数交换最常用的方法 void swap(int &a,int &b) { int temp=a; a=b; b=temp; } 如果没有中间变量temp可以使用呢,还有其他的三种方法 ...
- python基础之Day7part1集合
一.集合 1.定义 s=set() 2.特点 每个元素必须是不可变类型,但集合本身是可变类型的,有add和remove等功能 3.用途 去重(原理:for循环if判断元素是否已存在,不存在则追加) 关 ...
- python3 第二十三章 - 函数式编程之Partial function(偏函数)
要注意,这里的偏函数和数学意义上的偏函数不一样,偏函数是2.5版本以后引进来的东西,属于函数式编程的一部分.前面章节中我们讲到,通过设定参数的默认值,可以降低函数调用的难度.而偏函数也可以做到这一点. ...
- AX_InventCounting
static void Job649(Args _args) { ItemId ItemId = "000XA00612R1& ...
- python模块:time
# encoding: utf-8 # module time # from (built-in) # by generator 1.145 """ This modul ...
- qhfl-2 ContentType组件
一般商城里有很多的商品,计优惠券对应着活动类型商品,家电是一类商品,食物是一类商品,优惠券对应着不同的商品类别. from django.db import models class Applianc ...
- js禁用浏览器后退
history.pushState(null, null, document.URL); window.addEventListener('popstate', function () { histo ...
- linux系统下载pycharm
如何下载pycharm安装包? 你可以通过访问 https://www.jetbrains.com/pycharm/download/#section=linux 获取安装包,如果是新手建议使用社区版 ...
- 2017-2018-1 20155326信息安全系统设计基础》嵌入式C语言课上考试补交
2017-2018-1 20155326信息安全系统设计基础>嵌入式C语言课上考试补交 PPT上的例子 已知位运算规则为: &0 --> 清零 &1 --> 不变 | ...
- 关于esp32的系统初始化启动过程及设计学习方法
对于esp32,其开发程序中有且只能有一个app_main函数,该函数是用户程序的入口,这在没有调用FreeRTOS的系统中相当于函数main,但其实在app_main之前,系统还有一段初始化的过程, ...