Object.equals 和 String.equals的区别
一. 源码展示:
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的区别的更多相关文章
- Java中Object.equals和String.equals的区别详解
前言 Java中的堆和常量池的区别是什么呢?Object.equals与String.equals的区别呢?下面让我们通过一个小示例让你明白它- 1.基础知识 Java的存储空间:寄存器.栈.堆.静态 ...
- String使用机制及string.equals()和==的区别(转)
http://904582819.blog.163.com/blog/static/11159282020127794456840/ equals方法和==的区别 首先大家知道,String既可以 ...
- java基础18 String字符串和Object类(以及“equals” 和 “==”的解析)
一.String字符串 问:笔试题:new String("abc")创建了几个对象?答:两个对象,一个对象是 位于堆内存,一个对象位于字符串常量池 class Demo17 { ...
- Java中"String.equals()“和"=="的区别
Do NOT use the `==`` operator to test whether two strings are equal! It only determines whether or n ...
- Java中equals与==和comparaTo的区别
一.先说说Java中equals和==的区别: Java中的数据类型,可分为两类: 1.基本数据类型(也叫原始数据类型) 八大基本数据类型 char byte short int long doubl ...
- 【Java学习笔记之二十九】Java中的"equals"和"=="的用法及区别
Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: String str1 = new String(" ...
- 程序员必须搞清的概念-equals和=和hashcode的区别
1. 首先equals()和hashcode的介绍 equals 方法在非空对象引用上实现相等关系: * 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true. * 对称性:对于 ...
- "=="和 equals 方法究竟有什么区别?
"=="和 equals 方法究竟有什么区别? ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同, 要比较两个基本类型的数据或两个引 ...
- (转)Java中equals和==、hashcode的区别
背景:学习辉哥总结的基础知识,从头来,直面短板. 1 问题引入及分析 请看下面的代码清单1 @Test public void test01() { String a = "a" ...
- 【转】彻底弄懂Java中的equals()方法以及与"=="的区别
彻底弄懂Java中的equals()方法以及与"=="的区别 一.问题描述:今天在用Java实现需求的时候,发现equals()和“==”的功能傻傻分不清,导致结果产生巨大的偏差. ...
随机推荐
- selenium 多浏览器处理
开头 当我们做多浏览器自动化测试的时候,需要很多不同的浏览器,所以不同的参数对应不同的浏览器操作 目录结构 新建一个 base.py 文件, 通过 os 捕获到从命令行传进来的 import pyte ...
- 2021-04-07:给定一个非负数组arr,长度为N,那么有N-1种方案可以把arr切成左右两部分,每一种方案都有,min{左部分累加和,右部分累加和},求这么多方案中,min{左部分累加和,右部分累加和}的最大值是多少? 整个过程要求时间复杂度O(N)。
2021-04-07:给定一个非负数组arr,长度为N,那么有N-1种方案可以把arr切成左右两部分,每一种方案都有,min{左部分累加和,右部分累加和},求这么多方案中,min{左部分累加和,右部分 ...
- vue全家桶进阶之路20:ECMAScript脚本语言规范
ECMAScript(简称 ES)是一种由 Ecma 国际组织定义的脚本语言标准,它定义了 JavaScript 语言的基本规范和特性.JavaScript 是一种基于 ECMAScript 标准的编 ...
- 用好kafka,你不得不知的那些工具
前言 工欲善其事,必先利其器.本文主要分享一下消息中间件kafka安装部署的过程,以及我平时在工作中针对kafka用的一些客户端工具和监控工具. kafka部署架构 一个kafka集群由多个kafka ...
- 【重学C++】04 | 说透C++右值引用(上)
文章首发 [重学C++]04 | 说透C++右值引用(上) 引言 大家好,我是只讲技术干货的会玩code,今天是[重学C++]的第四讲,在前面<03 | 手撸C++智能指针实战教程>中,我 ...
- linux 账户和权限
目录 一.用户账户管理 二.组账号管理 三.用户账户文件和组账户文件 四.查询账户命令 五.设置目录与文件权限 六.设置命令与文件归属 七.默认文件属性umask 八.修改主机名 一.用户账户管理 u ...
- 使用numpy计算分子内坐标
技术背景 当我们打开一个用于表示分子构象的xyz文件或者pdb文件,很容易可以理解这种基于笛卡尔坐标的空间表征方法.但是除了笛卡尔坐标表示方法之外,其实也有很多其他的方法用于粗粒化或者其他目的的表征方 ...
- 我在 vscode 插件里接入了 ChatGPT,解决了代码变量命名的难题
lowcode 插件 已经迭代了差不多3年.作为我的生产力工具,平常一些不需要动脑的搬砖活基本上都是用 lowcode 去完成,比如管理脚手架,生成 CURD 页面,根据接口文档生成 TS 类型,生成 ...
- [ARM 汇编]进阶篇—异常处理与中断—2.4.1 异常处理概念
异常处理简介 在ARM汇编开发中,异常处理和中断是常见的概念,它们是对系统运行过程中出现的特殊情况进行处理的一种机制.异常处理和中断包括硬件异常.软件异常和外部中断等.当处理器遇到这些特殊情况时,它会 ...
- 一种实现Spring动态数据源切换的方法
1 目标 不在现有查询代码逻辑上做任何改动,实现dao维度的数据源切换(即表维度) 2 使用场景 节约bdp的集群资源.接入新的宽表时,通常uat验证后就会停止集群释放资源,在对应的查询服务器uat环 ...