java中equals()和==的区别

java中的数据类型

基础数据类型

基础数据类型有byte、short、char、int、long、float、double、bool、String。除了 String 会比较地址,其它的基础类型的比较,使用 == 和 equals() 两者都是比较值。

  • String类的equals()方法源码

     1 public boolean equals(Object anObject) {
     2         if (this == anObject) { //先比较地址,如果相同直接返回true
     3             return true;
     4         }
     5         if (anObject instanceof String) {//如果地址不相同,判断要比较的对象是不是String实例,如果不是直接返回false
     6             String anotherString = (String) anObject;
     7             int n = value.length;
     8             if (n == anotherString.value.length) {//比较两个对象的长度,如果不相等直接返回false
     9                 char v1[] = value;
    10                 char v2[] = anotherString.value;
    11                 int i = 0;
    12                 while (n-- != 0) {
    13                     if (v1[i] != v2[i])
    14                         return false;
    15                     i++;
    16                 }
    17                 //比较两个string对象的每个字符,如果都相等,就返回true,有一个不相等就返回false
    18                 return true;
    19             }
    20         }
    21         return false;
    22     }

    查看源码可知,String 类型的 equals 方法既会比较地址,也会比较字符串的每个字符(值).

  • String类型的equals()比较

    1 public class Main {
    2     public static void main(String[] args) {
    3         String name1 = new String("123");
    4         String name2 = new String("123");
    5         System.out.println(name1 == name2);//false
    6         System.out.println(name1.equals(name2));//true
    7     }
    8 }

    结果分析: name1 和 name2 是 String 的两个不同实例,name1==name2 是比较 name1 与 name2 的地址,所以返回 false。而 name1.equals(name2) 先是比较两者的地址,发现不同后接着比较两者的值,相同,所以返回 true。

复合数据类型(类)

  • Object类中equals()方法源码

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

    查看源码可知,当自己定义的类如果不重写 Object 类中 equals() 方法时,调用 equals() 方法其实和直接用 == 判断的效果一样。

  • 未重写时

     1 public class Person {
     2     private String name;
     3 
     4     public Person(String name) {
     5         this.setName(name);
     6     }
     7 
     8     public String getName() {
     9         return name;
    10     }
    11 
    12     public void setName(String name) {
    13         this.name = name;
    14     }
    15 }
    Person.java
    1 public class Test {
    2     public static void main(String[] args) {
    3         Person person1 = new Person("zze");
    4         Person person2 = new Person("zze");
    5         System.out.println(person1 == person2);//false
    6         System.out.println(person1.equals(person2));//false
    7     }
    8 }
  • 重写时

     1 public class Person {
     2     private String name;
     3 
     4     public Person(String name) {
     5         this.setName(name);
     6     }
     7 
     8     public String getName() {
     9         return name;
    10     }
    11 
    12     public void setName(String name) {
    13         this.name = name;
    14     }
    15 
    16     @Override
    17     public boolean equals(Object obj) {
    18         if(obj instanceof Person){
    19             return this.name==((Person) obj).name;
    20         }
    21         return false;
    22     }
    23 }
    Person.java
    1 public class Test {
    2     public static void main(String[] args) {
    3         Person person1 = new Person("zze");
    4         Person person2 = new Person("zze");
    5         System.out.println(person1 == person2);//false
    6         System.out.println(person1.equals(person2));//true
    7     }
    8 }

结论

首先,基本数据类型与复合数据类型在内存中存储的的方式是不同的:

  • 基本数据类型在栈中存储的是值。
  • 复合数据类型在栈中存储的是地址,来指向堆内存的实例。

可以这样理解:使用 == 比较的时候都是比较变量中存储的值,但基础类型的变量中存储的值就是实际值,而复合数据类型变量中存储的值是指向堆对象的引用地址。而 equals() 方法就是一个依赖于 == 实现普通函数,只不过它的实现是在所有对象的基类 (Object) 中.

转载于:https://www.cnblogs.com/zze46/p/9606339.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

判断字符串是否为正整数 浮点小数

/** * 判断字符串是否为数字(正整数和浮点数) * param str * return */public static boolean isNumeric(String str) { String reg "^[0-9](.[0-9])?$"; Pattern pattern Pattern.compile(reg); Matcher isNum pattern.matcher(str); if (!isNum.ma…

华为杯大学生计算机软件大赛,关于举办2018年西安电子科技大学程序设计网络赛暨第十六届“华为杯”大学生程序设计竞赛的通知...

各学院:程序设计是大学生运用计算机充分展示自己分析问题和解决问题能力的一个重要途径,对于培养大学生实践能力、团队意识、创新意识、顽强意志和综合素质具有显著作用和效果。为了推动这项创新性素质教育活动的广泛深入开展,扩大受益面&…

通过Spring Social发推StackExchange问​​题

1.简介 这是有关小型附属项目的第三篇也是最后一篇文章-该机器人自动在专用帐户上鸣叫来自各个Q&A StackExchange网站上的问题(文章末尾的完整列表)。 第一篇文章讨论了为StackExchange REST API构建一个简单的客户端 。 在第二篇文章中&…

HTML语义化的理解

1、什么是HTML语义化? “语义化”指的是在需要更少的人类干预的情况下,能够研究和手机信息,让网页能够被机器理解,最终让人类受益。 语义化的目的就是让大家直观的认识标签(markup)和属性(att…

乒乓球比赛赛程_10月5日至10月11日中央电视台直播录播乒乓球比赛安排

10月5日至10月11日这一周中央电视台居然没有播乒乓球比赛?全国乒乓球锦标赛从5日开始进行各单项比赛,7日进行混双决赛,9日进行男双决赛和女单决赛,10日进行女双决赛和男单决赛。场场都是精彩好看的比赛,中央电视台体育频道一场都…

集合实例(集合覆盖)

集合覆盖是一种优化求解问题,对很多组合数学和资源选择问题给出了很好的抽象模型。 问题如下:给定一个集合S,集合P由集合S的子集A1到An组成,集合C由集合P中的一个或多个子集组成。如果S中的每个成员都包含在C的至少一个子集中则称…

Drawwhile计算机软件,计算机程序设计、小女纸又怒编一程序、求鉴定、

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼srand(time(NULL));while (1){while (!kbhit()) //在没有按键的情况下,蛇自己移动身体{if (food.addFood 1) //需要出现新食物{food.x rand() % 400 60;food.y rand() % 350 60;//食物出现后必须在整格内才能让蛇吃到while (f…

python eval 用法

eval 功能:将字符串str当成有效的表达式来求值并返回计算结果。 语法: eval(source[, globals[, locals]]) -> value 参数: source:一个Python表达式或函数compile()返回的代码对象 globals:可选。 变量作用域&…

带有正则表达式模式的Google Guava Cache

最近我看到了一个关于Google Guava的精彩演讲 ,我们在我们的项目中得出结论,使用它的缓存功能真的很有趣。 让我们看一下regexp Pattern类及其编译功能 。 在代码中经常可以看到,每次使用正则表达式时,程序员都会使用相同的参数重…

关闭运动轨迹_网球初学者如何正确入门网球运动,有哪些学习细节

网球是一个非常有趣的球类运动。 当您开始入门时,您会越来越喜欢它。 那么网球初学者应该如何正确入门呢? 有什么独特的入门经验?即使没有网球经验,只要您能正确正确地进行定期训练,仍然可以取得很大的进步。首先&…

input长度随输入内容动态变化 input光标定位在最右侧

<input type"text" οnkeydοwn"this.onkeyup();" οnkeyup"this.size(this.value.length>4?this.value.length:4);" size"4"> <input type"text">的默认size就是20 如果你在style里定义了width属性,又…

phpstorm+wamp+xdebug配置php调试环境

本篇文章主要是&#xff1a;教大家如果搭建一套phpstormwampxdebug调试php的环境现在大多数的程序员使用的调试方式一般都是echo, var_dump, file_put_contents等其他方式&#xff0c;效率比较低下&#xff0c;因此我们有必要学习用工具调试&#xff0c;工具调试主要可以用来解…

计算机专用英语1500词带音标,带音标的计算机英语1500词

带音标的计算机英语1500词 (46页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;29.9 积分&#xfeff;计算机专用英语词汇1500词《电脑专业英语》1. file [fail] n. 文件&#xff1b;v. 保存文件 2. …

需求改进与系统设计

第一部分 需求与原型改进 1.1改进的原型 1.1.1 改进说明 相较上一次的原型&#xff0c;这一次我们确定了主题颜色&#xff0c;并且使功能一眼就能看懂&#xff0c;让新用户能很快上手。 并且进一步完善了前期的调查问卷分析。得出结论同学们不去食堂吃饭的大部分原因是排队…

了解ADF Faces clientComponent属性

我相信大多数ADF开发人员都知道ADF Faces属性clientComponent 。 在这篇文章中&#xff0c;我将展示此属性实际上如何影响组件渲染以及它如何改变其行为。 让我们开始考虑一个非常简单的示例&#xff1a; <af:inputText label"Label 1" id"it1" /> …

谈谈一些有趣的CSS题目(十五)-- 谈谈 CSS 关键字 initial、inherit 和 unset

开本系列&#xff0c;谈谈一些有趣的 CSS 题目&#xff0c;题目类型天马行空&#xff0c;想到什么说什么&#xff0c;不仅为了拓宽一下解决问题的思路&#xff0c;更涉及一些容易忽视的 CSS 细节。解题不考虑兼容性&#xff0c;题目天马行空&#xff0c;想到什么说什么&#x…

小程序沉浸式_企业开发小程序:客户裂变式增长

最近几年&#xff0c;各行各业中都有不少企业、商家获客难窘境。因此&#xff0c;很多企业、商家想知道&#xff1a;"怎么做&#xff0c;才能获取到大量流量&#xff1f;"小编给大家推荐一种方式&#xff1a;开发一个微信小程序&#xff0c;然后利用小程序来获取大量…

单点拖拽和多点多拽

demo见github:https://github.com/fei1314/drag/tree/master 一、拖拽原理手指所处的位置到一个div顶部的距离L一直不变。 二、单点拖拽1.touchstart:单指按下2.touchmove&#xff1a;单指移动3.touchend&#xff1a;单指抬起a.在touchstart事件中&#xff0c;利用拖拽原理&…

伪代码是计算机语言,伪代码书写格式

《伪代码书写格式》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《伪代码书写格式(3页珍藏版)》请在人人文库网上搜索。1、精品文档伪代码伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。每一行(或几行)表示一个基本操作。它不用图形符号&#xff0…

JDBC连接Mysql数据库

注释&#xff1a;&#xff08;以下代码会抛出多个异常&#xff0c;仅表达出JDBC连接Mysql数据库的过程步骤&#xff09;加载数据库驱动(即 实例化驱动类对象)Class.forName("com.mysql.cj.jdbc.Driver"); 获取数据库的连接Connection conn null; conn DriverManage…