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对比 哈希值 ,如果哈希值相同,则地址必然相同,但是该地址存储的对象则不一定相同【即便对象相同,但是值也不一定相同】。

最新文章

  1. 更改Visual Studio 2015 默认的语言设置
  2. windows+caffe(五)——实例2MNIST图片
  3. Displaying Bitmaps Efficiently 显示图片相关
  4. opendove中的odgw所需要的内核模块
  5. python目前最好用的IDE——pycharm
  6. library not found for -lPods 的解决办法
  7. C++ note
  8. win7系统中更新错误怎么解决的方法
  9. 关于PCB布线的顺序到底是怎样才合理?
  10. 用JavaScript(js)对时间格式化
  11. request对象
  12. iOS 多线程学习笔记 —— NSThread
  13. JavaScript可否多线程? 深入理解JavaScript定时机制(转载)
  14. RAW模板命名规范
  15. 在Service服务中请求网络
  16. Python+Tkinter 密保小工具
  17. numpy(三)
  18. Redux 和 React-Redux简介
  19. [JS] JS Basic : compare with c#
  20. cyclone IV中DDR的一个报错{Too many output and bidirectional pins per VCCIO and ground pair in I/O bank 8 }

热门文章

  1. Properties类继承HashTable类,一般用来给程序配置属性文件。
  2. 计算机网络 Raw_Socket编程 Ping C语言
  3. Sql Server、Oracle、MySQL 日期格式化函数处理
  4. WebSocket协议理解-数据包格式解析
  5. Json解析案例-teachers数据集
  6. JAVA使用IDEA本地调试服务的代码
  7. 【LeetCode】621. Task Scheduler 解题报告(Python & C++)
  8. Interesting Fibonacci(hdu 2814)
  9. codeforces 624C Graph and String
  10. 关于python常用的命令