一.  源码展示:

1. Object.equals:  

  ①引用类型地址值比较,直接返回结果:true || false

public class Object {
public boolean equals(Object obj) {
return (this == obj);
}
}

2. String.equals:  

  ① 判断地址值是否相等,若相等 返回 true,若不等则进入下列判断 ;

  ② 判断参数是否为String类型,若不是 返回false,若是则进入下列判断;

  ③ 判断字符串长度是否相等,若不等 返回false,若相等则进入下列判断 ;

  ④ 判断索引位置的字符是否相同,若不等 返回false,若相等,则返回true;

  • 字符串的内容相等指的是字符序列完全相同,包括字符的顺序和大小写敏感。
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {

  private final char value[];

public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
}

二. 二者区别

   1. 作用域:

     Object类是Java中所有类的基类,因此每个对象都继承了equals()方法,自定义实例对象默认使用Object.equals()比较值是否相等,且可以通过重写equals() 实现自定义比较。

     String类是Java中的一个内置类,它代表字符串对象,String重写了Object的equals()方法,仅用于做String字符串的值比较。

   2.  比较方式:

     Object.equals() 比较的是对象的引用是否相同。

     String.equals() 比较的是字符串的内容是否相同。

三.  代码层面展示

public static void main(String[] args) {
Object obj1 = new Object();
Object obj2 = new Object();
System.out.println("Object地址值比较:" + obj1.equals(obj2));
// 输出结果: false String str1 = "Hello";
String str2 = "hello";
String str3 = " hello ";
String str4 = new String("Hello");
System.out.println("Hello::hello比较(区分大小写):" + str1.equals(str2));
// 输出结果: false
System.out.println("Hello:: hello (前后存在空格):" + str1.equals(str3));
// 输出结果: false
System.out.println("比较常量池(使用new操作符):" + str1.equals(str4));
// 输出结果: true } 打印输出:
  Object地址值比较:false
  Hello::hello比较(区分大小写):false
  Hello:: hello (前后存在空格):false
  比较常量池(使用new操作符):true

 四. 拓展

  String常量池:

    在Java中,String常量池是一种特殊的内存区域,用于存储字符串常量。它是为了节省内存空间和提高性能而设计的。

    当我们使用字符串字面值创建一个字符串对象时,Java编译器会首先检查字符串常量池中是否已经存在相同内容的字符串。如果存在,则返回常量池中的引用;如果不存在,则在常量池中创建一个新的字符串对象,并返回该引用。

    由于String类是不可变的,也就是说一旦创建了字符串对象,它的内容就不能被改变。因此,多个字符串对象可以共享同一个字符串常量池中的内容,这样可以减少内存的占用。

    需要注意的是,通过调用String的intern()方法可以将一个字符串对象加入到常量池中,并返回常量池中的引用。这在某些场景下可能会有用,但要谨慎使用以避免不必要的内存开销。

    总之,String常量池是Java中用于存储字符串常量的特殊内存区域,可以提高内存利用率和程序性能。

   

Object.equals 和 String.equals的区别的更多相关文章

  1. Java中Object.equals和String.equals的区别详解

    前言 Java中的堆和常量池的区别是什么呢?Object.equals与String.equals的区别呢?下面让我们通过一个小示例让你明白它- 1.基础知识 Java的存储空间:寄存器.栈.堆.静态 ...

  2. String使用机制及string.equals()和==的区别(转)

    http://904582819.blog.163.com/blog/static/11159282020127794456840/ equals方法和==的区别   首先大家知道,String既可以 ...

  3. java基础18 String字符串和Object类(以及“equals” 和 “==”的解析)

    一.String字符串 问:笔试题:new String("abc")创建了几个对象?答:两个对象,一个对象是 位于堆内存,一个对象位于字符串常量池 class Demo17 { ...

  4. Java中"String.equals()“和"=="的区别

    Do NOT use the `==`` operator to test whether two strings are equal! It only determines whether or n ...

  5. Java中equals与==和comparaTo的区别

    一.先说说Java中equals和==的区别: Java中的数据类型,可分为两类: 1.基本数据类型(也叫原始数据类型) 八大基本数据类型 char byte short int long doubl ...

  6. 【Java学习笔记之二十九】Java中的"equals"和"=="的用法及区别

    Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: String str1 = new String(" ...

  7. 程序员必须搞清的概念-equals和=和hashcode的区别

    1. 首先equals()和hashcode的介绍 equals 方法在非空对象引用上实现相等关系: * 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true. * 对称性:对于 ...

  8. "=="和 equals 方法究竟有什么区别?

    "=="和 equals 方法究竟有什么区别? ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同, 要比较两个基本类型的数据或两个引 ...

  9. (转)Java中equals和==、hashcode的区别

    背景:学习辉哥总结的基础知识,从头来,直面短板. 1 问题引入及分析 请看下面的代码清单1 @Test public void test01() { String a = "a" ...

  10. 【转】彻底弄懂Java中的equals()方法以及与"=="的区别

    彻底弄懂Java中的equals()方法以及与"=="的区别 一.问题描述:今天在用Java实现需求的时候,发现equals()和“==”的功能傻傻分不清,导致结果产生巨大的偏差. ...

随机推荐

  1. 5分钟实现调用ChatGPT接口API实现多轮问答

    5分钟实现调用ChatGPT接口API完成多轮问答 最近ChatGPT也是火爆异常啊,在亲自使用了几个月之后,我发现这东西是真的好用,实实在在地提高了生产力.那么对于开发人员来说,有时候可能需要在自己 ...

  2. oracle异常处理

    序言 最近在工作中遇到这么一个场景: 在同一网段内存在着A库和B库,需要将A库下某些表的数据同步到B库 B库跑着定时任务,定时调用存储过程将A库下的数据同步到B库. B库和A库是通过建立dblink建 ...

  3. 2023-04-29:一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。 给你一个整数数组 nums ,返回 nums 的所有非空 子序列 的 宽度之和 由于答案可能非常大,请返回对 109

    2023-04-29:一个序列的 宽度 定义为该序列中最大元素和最小元素的差值. 给你一个整数数组 nums ,返回 nums 的所有非空 子序列 的 宽度之和 由于答案可能非常大,请返回对 109 ...

  4. 2021-05-01:给定一个有序数组arr,代表坐落在X轴上的点。给定一个正数K,代表绳子的长度。返回绳子最多压中几个点?即使绳子边缘处盖住点也算盖住。

    2021-05-01:给定一个有序数组arr,代表坐落在X轴上的点.给定一个正数K,代表绳子的长度.返回绳子最多压中几个点?即使绳子边缘处盖住点也算盖住. 福大大 答案2021-05-01: 滑动窗口 ...

  5. vue 版本查看

    如何查看vue版本号? 方法1.全局查看vue版本号 npm info vue方法2.局部(当前项目)查vue版本号 npm list vue version方法3.此外还可以通过 package.j ...

  6. ABP - 缓存模块(1)

    1. 与 .NET Core 缓存的关系和差异 ABP 框架中的缓存系统核心包是 Volo.Abp.Caching ,而对于分布式缓存的支持,abp 官方提供了基于 Redis 的方案,需要安装 Vo ...

  7. 基于 python3+nginx 的 Jupyter Notebook 服务端 ssl 访问

    引言 Jupyter Notebook(原名 ipython)可是科学计算界的必备工具,友好的界面,方便的交互,支持 Markdown,集中的极客们想要的一切特点,同时又制作的如此优雅和精美,真是难能 ...

  8. GTX.Zip:一款可以替代 gzip 的基因大数据压缩软件

    今天给大家推荐一款基因大数据压缩的大杀器:GTX.Zip. GTX.Zip 这款软件是由曾在 2016 年 GCTA 风云挑战赛中的那匹黑马--人和未来生物科技有限公司开发的,而当时他们也是打破了基因 ...

  9. ORM核心功能之导航属性- EFCore和 SqlSugar

    导航属性 导航属性是作为ORM核心功能中的核心,在SqlSugar没有支持导航属性前,都说只是一个高级DbHelper, 经过3年的SqlSugar重构已经拥有了一套 非常成熟的导航属性体系,本文不是 ...

  10. 浅谈 ByteHouse Projection 优化实践

    预聚合是 OLAP 系统中常用的一种优化手段,在通过在加载数据时就进行部分聚合计算,生成聚合后的中间表或视图,从而在查询时直接使用这些预先计算好的聚合结果,提高查询性能,实现这种预聚合方法大多都使用物 ...