1.前言

  昨天舍友去面试,被面试官的问题难住了:俩个学生类除了学生姓名不同用.equal来比较。

我是一脸懵逼的 ,问题说的很模糊 ,

理解字面意思为 :一个 实体类名叫Student ,内部属性有学生姓名等 ,然后该类被new 了两个对象 ,输入不同的name值 ,然后使用 .equals比较是否相同。

  我是怎么想都觉得不可能相等的啊 ,new了不同的对象 ,不论是存在栈还是堆空间的地址都不可能相同的 ,难道使用get方法一个一个值取出来再比较?

这问题简直是脱裤子放屁。

2.操作

实体类Student

package com.example.javabaisc.MyEqual;

public class Student {
private String name;
private int age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
}

测试类

package com.example.javabaisc.MyEqual;

import org.junit.jupiter.api.Test;

public class StuTest {

    @Test
public void t() {
Student student = new Student();
student.setAge(18);
student.setName("cen"); Student student2 = new Student();
student2.setAge(18);
student2.setName("cen"); System.out.println("========equql 比较对象=============");
if (student.equals(student2)) {
System.out.println("一样");
} else {
System.out.println("不一样");
}
System.out.println("==========使用 == 比较地址空间====================");
if (student == student2) {
System.out.println("一样");
} else {
System.out.println("不一样");
} } }

3.测试

启动测试类,打印结构

4.分析

看到打印结果,果然不出我所料,不论是  == 比较还是 equals 比较,结果都是false ,即不等。

为什么?

  ==号,如果比较的两个 元素是 基本数据类型 ,则直接比较数值   ,如果是引用类型 【也就是对象】,则比较的是一个对象在内存中的地址值【常量放在常量池、对象放在堆里面,都有相应的空间地址】

  equals 的情况比较复杂,首先会比较 对象在内存中的地址值 ,如果不相等 ,则继续比较,先判断是不是String类型 ,如果不是则直接返回false ,如果是,则将对象强转String ,

然后将一位一位的字符比较ASCLL码是否相等,如果有一个不等,则直接返回false,如果全部相等,则返回true.

下图为源码:

5.结论

使用equals对比两个对象【指new了两个新的对象,即便类型】,那么地址值必然不同,同时如果对象不是String类型 ,则永远是false。

如果地址值是相同的【任意类型,不仅仅是String类型】,那么使用equals对比,则会是true ,但是不能保证内部的值是相同的。

比如在 哈希表的比较中 ,使用equals对比 哈希值 ,如果哈希值相同,则地址必然相同,但是该地址存储的对象则不一定相同【即便对象相同,但是值也不一定相同】。

细谈 == 和 equals 的具体区别 【包括equals源码分析】的更多相关文章

  1. 细谈getRequestDispatcher()与sendRedirect()的区别

    问题?细谈getRequestDispatcher()与sendRedirect()的区别 首先我们要知道: (1)request.getRequestDispatcher()是请求转发,前后页面共享 ...

  2. [源码解析]HashMap和HashTable的区别(源码分析解读)

    前言: 又是一个大好的周末, 可惜今天起来有点晚, 扒开HashMap和HashTable, 看看他们到底有什么区别吧. 先来一段比较拗口的定义: Hashtable 的实例有两个参数影响其性能:初始 ...

  3. java中List接口的实现类 ArrayList,LinkedList,Vector 的区别 list实现类源码分析

    java面试中经常被问到list常用的类以及内部实现机制,平时开发也经常用到list集合类,因此做一个源码级别的分析和比较之间的差异. 首先看一下List接口的的继承关系: list接口继承Colle ...

  4. Spark源码分析:多种部署方式之间的区别与联系(转)

    原文链接:Spark源码分析:多种部署方式之间的区别与联系(1) 从官方的文档我们可以知道,Spark的部署方式有很多种:local.Standalone.Mesos.YARN.....不同部署方式的 ...

  5. getJSONObject与optJSONObject的区别,结合源码分析

    *json解析常见问题: getJSONObject与optJSONObject的区别,下面结合源码和案例来分析当我们使用这两周方法来解析数据时,哪种比较好. 源码分析: //使用getJSONObj ...

  6. java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括InputStream)

    我们以ByteArrayInputStream,拉开对字节类型的“输入流”的学习序幕.本章,我们会先对ByteArrayInputStream进行介绍,然后深入了解一下它的源码,最后通过示例来掌握它的 ...

  7. java io系列03之 ByteArrayOutputStream的简介,源码分析和示例(包括OutputStream)

    前面学习ByteArrayInputStream,了解了“输入流”.接下来,我们学习与ByteArrayInputStream相对应的输出流,即ByteArrayOutputStream.本章,我们会 ...

  8. java中的==、equals()、hashCode()源码分析(转载)

    在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. ==  java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: ...

  9. Android Asynctask与Handler的比较,优缺点区别,Asynctask源码

    1  AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以 ...

  10. 浅谈ZooKeeper基本原理与源码分析

    最近一直有小伙伴私信我,问一些关于Zookeeper的知识,下边关于的Zookeeper的知识整理了一下,一起学习一下. 看完本文对于Zookeeper想深入全面了解的读者朋友们,小编这里整理了一份更 ...

随机推荐

  1. C++内存管理:简易内存池的实现

    什么是内存池? 在上一篇 C++内存管理:new / delete 和 cookie中谈到,频繁的调用 malloc 会影响运行效率以及产生额外的 cookie, 而内存池的思想是预先申请一大块内存, ...

  2. shell脚本 微信/钉钉验证登录服务器

    一.简介 登录用户需要二次验证码进行验证 可以配合 监控用户登录,发送通知给企业微信/钉钉 来使用 脚本放到/etc/profile.d/ 目录,登录的时候自动触发 二.微信脚本 1.需要修改Crop ...

  3. A New Discrete Particle Swarm Optimization Algorithm

    题目:一种新的离散粒子群优化算法 中文摘要 粒子群优化算法在许多优化问题上表现得非常好.粒子群优化算法的缺点之一是假设算法中的变量为连续变量.本文提出一个新的粒子群优化算法,能够优化离散变量.这个新算 ...

  4. Dubbo配置注册中心设置application的name使用驼峰命名法存在的隐藏项目启动异常问题

    原创/朱季谦 首先,先提一个建议,在SpringBoot+Dubbo项目中,Dubbo配置注册中心设置的application命名name的值,最好使用xxx-xxx-xxx这样格式的,避免随便使用驼 ...

  5. 洛谷八月月赛 II T1 题解

    Content 在大小为 \(n\) 的数字三角形中,第 \(i\) 行包含有 \(i\) 个数字,数字从上到下,从左到右依次排列为 \(1,2,3,\dots\). 设第 \(i\) 行第 \(j\ ...

  6. java 常用类库:操作系统System类,运行时环境Runtime

    System类: System 类代表Java程序的运行平台,程序不能创建System类的对象, System类提供了一些类变量和类方法,允许直接通过 System 类来调用这些类变量和类方法. Sy ...

  7. 选课系统V1.0

    tree . . ├── bin │   ├── __init__.py │   └── start.py #启动文件 ├── conf │   ├── __init__.py │   └── set ...

  8. pdf2swf转换不成功该怎么解决啊,Process p=r.exec("D:/swf/pdf2swf.exe \""+pdfFile.getPath()+"\" -o \""+swfFile.getPath()+"\" -T 9");

    pdf2swf转换不成功该怎么解决啊,可以这样解决吧,请注意命令的用法啊:Process p=r.exec("D:/swf/pdf2swf.exe  \""+pdfFil ...

  9. 有时候错误很奇怪啊,Comparator问题

    有时候错误很奇怪啊,Comparator问题,在我的电脑上排序好用,但是在别的电脑上排序不好用, 真奇怪a

  10. Learning to Sample

    此处主要提出几个疑问和想法: 疑问: 为什么需要这个匹配过程?虽然G可能不是P的子集,但是为什么一定需要他是子集呢? 如果一定要匹配的话,匹配过程是没法反向传播的,所以只可以在推理阶段使用,那么这个推 ...