`

equals和"=="浅析

    博客分类:
  • java
 
阅读更多
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。

equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
String a=new String("foo");
String b=new String("foo");
两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。

在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input = …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用equals方法。
如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:
boolean equals(Object o){
return this==o;
}
这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。

分享到:
评论

相关推荐

    浅析C#中的等号“==”和Equals

    1.“==”和Equals两个真的有关联吗?  对于“==”和Equals大多数网友都是这样总结的:  “==” 是比较两个变量的值相等。  Equals是比较两个变量是否指向同一个对象。  public class Person  {  public ...

    C#中的 == 和equals()区别浅析

    在C#编程语言中,`==`运算符和`Equals()`方法是两种常见的用于比较对象是否相等的方式,但它们之间存在重要的区别。本文将详细解释这两种比较方式的不同点。 首先,`==`运算符主要用于比较基本数据类型的值是否相等...

    java中hashcode()和equals()的详解.docx

    在Java中,正确实现`equals()`和`hashCode()`方法对于保证程序的逻辑正确性和性能至关重要。开发者需要确保这两个方法的一致性和效率,特别是在自定义类时,更要注意遵循上述提到的原则。只有这样,才能充分利用Java...

    JSP安全编程实例浅析

    ### JSP安全编程实例浅析 #### 一、引言 在现代Web开发中,JavaServer Pages (JSP)作为一种动态网页技术被广泛应用于构建复杂的企业级应用。然而,随着互联网的发展,各种针对Web应用程序的安全威胁也日益增多。...

    Java学习教程-java中number类浅析.docx

    ### Java学习教程:Java中Number类浅析 #### 一、概述 在Java语言中,`Number`类是一个抽象类,所有的基本数据类型的包装类(如`Integer`、`Long`、`Byte`、`Double`、`Float`、`Short`等)都是它的子类。`Number`...

    C#中Equality和Identity浅析

    在C#编程语言中,Equality和Identity是两个重要的概念,它们用于判断对象之间的关系。 Equality关注的是对象的值,而...在处理自定义类型时,尤其需要注意提供正确的`Equals`和`==`实现,以确保代码的正确性和效率。

    sping AOP 权限管理方案浅析

    本文将深入浅析Spring AOP在权限管理中的应用,结合标签"源码"和"工具",我们将探讨如何利用Spring AOP实现精细的权限控制,并通过具体的代码示例来理解这一过程。 Spring AOP(Aspect Oriented Programming)是...

    Spring Boot 自动配置之条件注解浅析

    Spring Boot 自动配置之条件注解浅析 Spring Boot 提供了自动配置的机制,通过大量的条件注解来实现自动化配置。条件注解是指在特定条件下创建特定的Bean,例如,在某些系统变量下创建Bean,或者只有在某个Bean创建...

    浅析Java设计模式编程中的单例模式和简单工厂模式

    本篇文章将深入探讨两种常见的设计模式:单例模式和简单工厂模式。 首先,单例模式是一种限制类实例化的模式,确保在整个应用程序中只有一个实例存在。其核心动机是控制共享资源的访问,例如日志记录器或者数据库...

    java判断字符串String是否为空问题浅析

    在本文中,我们将深入探讨几种不同的方法来完成这个任务,并分析它们的效率和适用场景。 首先,让我们来看看四种常见的方式来判断字符串是否为空: 1. 使用`str == null`: 这种方法检查字符串变量是否为`null`,...

    浅析Java中的set集合类型及其接口的用法

    6. **重写hashCode()和equals()**:当向HashSet中添加自定义类型的对象时,必须重写这两个方法,以确保对象的唯一性和比较逻辑。否则,HashSet可能无法正确识别重复的元素。 7. **线程安全性**:默认情况下,...

    浅析Java类和数据结构中常用的方法

    Java 类和数据结构是编程中不可或缺的基础,它们构成了程序的核心逻辑和数据管理方式。下面将详细解析Java中类、对象以及常用数据结构如List、Set、Map等的相关方法。 1. **Object类**是所有Java类的根类,它定义了...

    浅析12306售票算法(java版)

    if (result.equals(ticketFlag)) { System.out.println("订票失败"); } else { System.out.println("订票后的结果:" + result); // 退票 String b = buildTicket(ticketFlag.length(), beginStation, end...

    sesvc.exe 阿萨德

    众所周知 HashMap 底层是基于 数组 + 链表 组成的,不过在 jdk1.7 和 1.8 中具体实现稍有不同。 Base 1.7 1.7 中的数据结构图: 先来看看 1.7 中的实现。 这是 HashMap 中比较核心的几个成员变量;看看分别是...

    深入浅析JDK8新特性之Lambda表达式

    总的来说,Lambda表达式是Java 8中一个重要的新特性,它推动了Java向函数式编程的转变,提高了代码的简洁性和可读性,降低了处理回调和事件驱动编程的复杂度。在实际开发中,熟练掌握Lambda表达式能显著提升开发效率...

    浅析Android手机卫士接收短信指令执行相应操作

    if (secSender.equals(sender)) { switch (body) { case "#*alarm*#": // 播放报警音乐 MediaPlayer mp = MediaPlayer.create(context, R.raw.alarm); mp.start(); abortBroadcast(); break; // 其他指令...

Global site tag (gtag.js) - Google Analytics