当前位置: 首页 > news >正文

JAVA中equal()和==的区别

一般认为:

==比较的是基础数据的值或者是对象的引用地址

equal()比较的是对象的内容

 

其实:

==和equal()都是比较的引用地址,其实是栈内存中变量(包括基本数据类型的变量和对象变量)的值

equals()方法在object类中定义如下:

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

但是在String、Integer、Math、Double......等这些封装类中,覆盖了Object类中的equal()方法,

比如String类中:

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

很明显,equal()经常重写之后,已经不是地址的比较,而是内容的比较,依次类推Double、Integer、Math......等等这些类都是重写了equal()方法,从而进行的是内容的比较。

注意:hashCode()也存在同样的覆盖重写情况

 

System.out.println(对象)

这样的语句输出的不是对象的地址,虽然它看起来像,其实这条语句相当于:System.out.println(对象.toString());

也就是说如果一个类没有重写Object.toString()方法,那么打印语句得到的都将是:类名+"@"+十六进制表示的对象的哈希值

Object的代码:

public String toString () {
    return this.getClass().getName() + "@" + Integer.toHexString(this.hashCode());
}

我们打印出来的对象的地址其实是一个伪地址,因为不同的对象可能会是同一个hashCode

 

import java.util.ArrayList;
import java.util.List;

public class Prove
{
    public static void main(String[] args)
    {
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < 3000; i++)
        {
            Prove p = new Prove();
            if (!list.contains(p.hashCode()))
                list.add(p.hashCode());
        }
        System.out.println(list.size());
    }
}

生成了3000个Prove对象,应该新分配3000个内存地址,最后却只有2998个hashCode

 

 

 

 

转载于:https://www.cnblogs.com/jingyunyb/p/3797652.html

相关文章:

  • 区块链软件公司:区块链技术能带来什么
  • Android:让WebView支持input type=”file”…元素
  • P3235 [HNOI2014]江南乐
  • ZYNQ的数据处理能力
  • Keras之父:比特币网络危机重重
  • 提高sql2005中带freetexttable和rank的全文检索的速度
  • js中if else switch 条件判断的替代方法
  • 菜根谭#142
  • 活在台积电的阴影下
  • 个性化注册表单
  • Implicit declaration of function 'CC_MD5' is invalid in C99
  • js中怎么获取CSS属性值
  • shell提取MySQL结果到变量中
  • 写GULP遇到的ES6问题详解
  • [leetcode] 3Sum
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • CSS3 变换
  • ES6核心特性
  • es的写入过程
  • exports和module.exports
  • java8 Stream Pipelines 浅析
  • Java编程基础24——递归练习
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Nodejs和JavaWeb协助开发
  • Node项目之评分系统(二)- 数据库设计
  • Objective-C 中关联引用的概念
  • Sass Day-01
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • vue自定义指令实现v-tap插件
  • 记录一下第一次使用npm
  • 实战|智能家居行业移动应用性能分析
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 微服务框架lagom
  • 想写好前端,先练好内功
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​学习一下,什么是预包装食品?​
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #pragma once
  • (003)SlickEdit Unity的补全
  • (1) caustics\
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (10)STL算法之搜索(二) 二分查找
  • (13):Silverlight 2 数据与通信之WebRequest
  • (分布式缓存)Redis分片集群
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .Net Memory Profiler的使用举例
  • .net 托管代码与非托管代码
  • .Net7 环境安装配置
  • .NET分布式缓存Memcached从入门到实战
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [AX]AX2012 AIF(四):文档服务应用实例