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()和“==”的功能傻傻分不清,导致结果产生巨大的偏差. ...
随机推荐
- 还不知道怎么 Mock ,用这 6款工具!
以下是几个常用的国外可以mock测试的工具,供参考: MockServer: MockServer 是一个开源的 API mock 测试工具,提供了强大的模拟服务器和 mock 服务功能.MockSe ...
- Vue实战案例
Vue项目案例 结合之前学习的 vue.js.脚手架.vuex.vue-router.axios.elementui 等知识点,来开发前端项目案例(仅前端不含后端). 1.项目搭建 其实就是将我们项目 ...
- [Flink] Flink Job运行状态正常,但日志中偶报“FlinkException: The file LOG does not exist on the TaskExecutor.”
0 序言 Flink : 1.12 job start running time : 2022-12-27 17:40:47 problem throw time : 2023-05-11 16:41 ...
- 2022-10-29:go语言中的defer能非常方便地处理资源释放问题,rust语言里如何实现defer功能呢?
2022-10-29:go语言中的defer能非常方便地处理资源释放问题,rust语言里如何实现defer功能呢? 答案2022-10-29: rust里有时候你也必须用defer,别说是设计上的问题 ...
- 2020-12-24:MQ中,如何保证消息不丢失?
福哥答案2020-12-24: 生产者丢失消息:如网络传输中丢失消息.MQ 发生异常未成功接收消息等情况. 解决办法:主流的 MQ 都有确认或事务机制,可以保证生产者将消息送达到 MQ.如 Rabbi ...
- 2020-01-20:mysql中,一张表里有3亿数据,未分表,要求是在这个大表里添加一列数据。数据库不能停,并且还有增删改操作。请问如何操作?
2020-01-20:mysql中,一张表里有3亿数据,未分表,要求是在这个大表里添加一列数据.数据库不能停,并且还有增删改操作.请问如何操作?福哥答案2020-01-20: 陌陌答案:用pt_onl ...
- 2022-05-03:Alice 和 Bob 再次设计了一款新的石子游戏。现有一行 n 个石子,每个石子都有一个关联的数字表示它的价值。给你一个整数数组 stones ,其中 stones[i] 是第
2022-05-03:Alice 和 Bob 再次设计了一款新的石子游戏.现有一行 n 个石子,每个石子都有一个关联的数字表示它的价值.给你一个整数数组 stones ,其中 stones[i] 是第 ...
- Spring源码:Bean生命周期(五)
前言 在上一篇文章中,我们深入探讨了 Spring 框架中 Bean 的实例化过程,该过程包括从 Bean 定义中加载当前类.寻找所有实现了 InstantiationAwareBeanPostPro ...
- 【GiraKoo】Visual Studio开启Asan提示“LINK : fatal error LNK1104: cannot open file 'LIBVCASAN.lib'”
[解决]Visual Studio开启Asan提示"LINK fatal error LNK1104 cannot open file 'LIBVCASAN.lib'" 环境 Vi ...
- ArcMap手动新建矢量要素的方式
本文介绍在ArcGIS下属ArcMap软件中,新建点.线.面等矢量要素图层,并对新建图层的空间范围加以划定的方法. 首先,在右侧"Catalog"栏中选择需要存放新建立矢量 ...