听说你还不会实现equals方法?收藏这篇文章就够了!

Java Objects类中的 equals方法分析 阅读详情

1、何时需要重写equals

相信javaer们应该都知道equals方法,它是基类大佬Object中的一个方法,所以java下面所有的类都“自带”这个方法。看方法名就知道,意图就是对比传入的目标对象, 跟自己是否“相等”。我们先看看这个方法在Object类中的实现:

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

这个实现也算简单粗暴了,直接用“==”来跟目标对象作比较,这个意图就是:除非对方就是是自己本身,否则就不相等。 但就是因为这样的粗暴,造成限定得太死了。实际开发中,可能原生的equals不能满足业务的需求。所以需要重写,例如Integer中重写的equals方法,可以看到Integer并不强制目标对象是“自己本体”,而只是对比了被自己包装的int基本类型数值,这样的实现更加符合实际业务要求:

    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();//对比被包装的整型数值
        }
        return false;
    }

关于何时才需要重写equals方法,《Effective Java》中提到:

如果类具有自己特有的“逻辑相等”概念,而且超类还没有覆盖equals。这通常属于“值类”的情形。值类仅仅是一个表示值得类,例如Integer和String。程序员在利用equals方法来比较值对象的引用时,希望知道他们在逻辑上是否相等,而不是想了解它们是否指向同一个对象。

这句话翻译得有点拗口,不过意思还是明确的,何时才是需要重写equals,可以总结为以下两点:

  • **该类只代表一个具体的“值“。**例如Double、Integer、Long等这种包装类型,其实这些类再怎么复杂,它们也只是代表一个数值,只要类型和数值相等,它们对象也理应是相等的。
  • **业务逻辑相同的对象。**这个可以看作是第一点的延申,即对象间的成员变量、行为表现是一致的时候,也应该理解成是相同的对象。例如一个商品类Goods,只要它的商品ID,商品名称等关键信息是相等的,就是同一件商品。

2、重写equals方法要遵守的约定

2.1 重写equals错误示范

重写equals方法看似很简单,但是有很多重写的方式会导致意想不到的错误。举一个jdk里的一个错误例子,java.sql.Timestamp是继承自java.util.Date的,这两个类都分别重写了equals方法。我们可以来看看:

java.util.Date.equals:

  public boolean equals(Object obj) {
        return obj instanceof Date && getTime() == ((Date) obj).getTime();
  }

java.sql.Timestamp:

    public boolean equals(java.lang.Object ts) {
      if (ts instanceof Timestamp) {
        return this.equals((Timestamp)ts);
      } else {
        return false;
      }
    }

这两个类的equals方法,如果是各自单独使用起来的话,是没有任何问题的,但如果Date和Timestamp这两个类一起使用的话就有问题了,例如把这两个类的对象都存到一个集合list里,就会出问题了:

	static List<java.util.Date> dateList = new ArrayList<>();
	public static void addTimeObj(java.util.Date date) {
		if(!dateList.contains(date)) {
			dateList.add(date);
		}
	}
	
	public static void main(String[] args) {
		long currentTimeMillis = 1586669016742L;
		java.sql.Timestamp timestamp = new Timestamp(currentTimeMillis);
		Date date = new java.util.Date(currentTimeMillis);
		
		System.out.println(date.equals(timestamp));//true
		System.out.println(timestamp.equals(date));//false
		
		addTimeObj(timestamp);
		addTimeObj(date);//date对象加不进去
		
	}

由上面的代码可以看出,date.equals(timestamp)是true,timestamp.equals(date)是false,这个违反了下面将要说的对称性 ,因此有可能会产生意想不到的后果,例如第二个addTimeObj方法的调用,date是加不进去的,因为ArrayList.contains利用了对象的equals方法来进行对比的,然而timestamp.equals(date)==false。

     public boolean contains(Object o){
        //...省略一些代码
        for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))//timestamp.equals(date)==false
                    return i;           
       return false;
        //...省略一些代码
     }

2.2 重写equals要遵守的”军规“

所以,重写equals时,是有一定的约束的,《Effective Java》中提到了一些重写必须遵循的”军规“:

  • 自反性:对于任何非null的引用值x,x.equals(x)必须返回true;
  • 对称性:对于任何非null的引用x和y,当且仅当y.equals(x)返回true时,x.equals(y)必须返回true;
  • 传递性:对于任何非null的引用值x、y和z,如果x.equals(y)返回true,并且y.equals(z)返回true,则x.equals(z)返回true;
  • 一致性:对于任何非null的引用值x和y,只要equals的比较操作对象中所用的信息没有被修改,多次调用x.equals(y)就会一致地返回true,或者一致地返回false;
  • 对于任何非null的引用x,x.equals(null)必须返回false。

以上几条规定,如果违反了其中一条,就有可能会产生意想不到的后果,程序也许会表现得不正常,甚至崩溃。就像上面java.util.Date和java.sql.Timestamp的例子,这样的bug是很难排查出来的。

3、如何正确快速的重写equals方法

我们得知重写equals方法的一些约束后,会觉得,实现一个equals方法怎么那么难?其实,要实现equals方法,并不难,在实际开发中,有以下两个快速稳当的方法。

3.1 利用IDE的自动生成equals

目前的IDE都有equals方法的快捷生成方法,比如eclipse,”Alt+Shift+S“组合键—>Generate hashCode() and equals(),即可同时生成hashCode方法和equals方法*(由此也可以看出equals方法和hashCode方法是捆绑一起的,实现equals方法,必须也得实现hashCode方法)*

public class Graph {

	int n;
	
	LinkedList<Integer> [] table;

   //....此处省略了hashCode方法的实现

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Graph other = (Graph) obj;
		if (n != other.n)
			return false;
		if (!Arrays.equals(table, other.table))
			return false;
		return true;
	}
}

上面的equals方法是eclipse生成的(篇幅原因省略了hashCode的代码),粗略的看起来还挺全的,其实不一定符合我们实际开发中的业务需求,而且略显臃肿。所以在平时开发中用IDE生成的这种代码,往往都是需要调整一下,以适应实际业务,当然,前提是要遵循上面说到的几个军规。

3.2 重写equals方法的几个诀窍(步骤)

IDE生成equals方法非常便捷,但是生成的代码有时是比较”鸡肋“。因此,我们是否可以在遵循军规的基础上,自己快速手写一个equals方法呢?当然是可以的,可以按照以下几个步骤来一步步实现。

  1. 使用**==**操作符检查参数是否为这个对象的引用。如果是,则返回true。
  2. 使用instanceof操作符检查参数是否是正确的类型。如果不是,返回false。
  3. 把参数转成正确的类型。因为已经经过第二步的ininstanceof 校验,所以类型会转换成功。
  4. 对于该类中每个”关键域“,检查参数中的域是否与该对象中的对应的域相匹配。在检查域的时候,应该先检查性能开销最低的域,或者逻辑最可能不一致的域,按照这样的有序安排可以尽可能减少比较的次数,从而提高性能。
  5. 编写玩equals之后,应该考虑并检验三个问题:它是否是对称的、传递的、一致的?

根据这五个步骤,写出来的equals才是安全可靠的,下面构造了一个Goods类,并实现了它的equals方法和hashCode方法,最后再来检测下它的对称性、传递性、一致性,都是可以的!

public class Goods {

	int id;	
	String goodsName;
	
	@Override
	public boolean equals(Object obj) {
		//使用==操作符检查参数是否为这个对象的引用。如果是,则返回true。
		if(this == obj) 
			return true;
		
		//使用instanceof操作符检查参数是否是正确的类型。如果不是,返回false。
		if(!(obj instanceof Goods)) 
			return false;
		
		//把参数转成正确的类型。
		Goods target = (Goods)obj;
		
		/*
		 * 对于该类中每个”关键域“,检查参数中的域是否与该对象中的对应的域相匹配。
		 * 在检查域的时候,应该先检查性能开销最低的域,或者逻辑最可能不一致的域,
		 * 按照这样的有序安排可以尽可能减少比较的次数,从而提高性能。
		 */
		if(this.id != target.id)
			return false;
		if(target.goodsName == null || !target.goodsName.equals(this.goodsName))
			return false;
		
		return true;
	}
    
    @Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((goodsName == null) ? 0 : goodsName.hashCode());
		result = prime * result + id;
		return result;
	}
    
    
}

4、写在最后

覆盖equals方法是要比较严谨的,如果不是迫不得已,就不要轻易去重写equals方法。如果要重写,则一定要比较这个类的所有关键域,并且查看它们是否遵循equals的几条军规!而且还有另外一个很重要的是,重写equals方法后,必须同步实现hashCode方法,否则就会违反了hashCode的通用约定,而关于hashCode 如何重写,请看姐妹篇《如何实现高效的hashCode方法》

equals方法,你今天掌握了吗?

【技术科普】破解政务跨系统数据壁垒!亘川一网统管平台多源数据同步技术解析 本文解析亘川一网统管平台多源数据同步技术,针对政务跨系统数据壁垒难题,介绍组件的数据采集、校验、审计留痕等核心能力,结合营商环境项目落地案例,对比传统开发模式差异,讲解开源组件的实践价值,为政务项目开发者提供落地参考。 阅读详情

相关推荐

Halcon Camera-calibration 相关算子(一)

Halcon Camera-calibration 相关算子介绍

qq_44744164的博客 1366

equals方法详解

一、equale方法是什么? Object 类中的 equals 方法是用于检测一个对象是否等于另外一个对象。在Object类中实现的 equals 方法将确定两个对象是否具有相同的引用(内存地址)。如果两个对象具有相同的引用,那么他们一定是相等的,看看下面这段代码的运行: public static void main(String[] args) { Object o = new Object(); //分别将 o 赋值给变量o1,o2 Object o1 ...

qq_57887050的博客 3万+

BIOS硬件监控实战:如何手动读取IT8738芯片的温度与风扇数据(附代码)

本文深入探讨了如何绕过操作系统和HWMonitor等监控软件,直接通过寄存器级操作读取IT8738超级I/O芯片的硬件监控数据。文章提供了从动态定位EC空间、构建底层读写函数到解码传感器寄存器映射的完整实战指南,并附有C语言代码示例,帮助开发者理解BIOS硬件监控的底层原理,适用于定制硬件开发与故障诊断。

weixin_29192211的博客 108

实现equals方法诀窍

equals

浮生若梦 1634

FastGPT智能体开发:FastGPT OpenAPI 知识库接口

FastGPT OpenAPI 知识库接口

王国平的博客 323

YOLOv11模型剪枝实战:让检测速度翻倍,精度仅降1%的终极优化教程

模型剪枝是YOLOv11落地边缘场景的“关键一步”——它让模型在“瘦身”的同时,几乎不损失精度。从稀疏化训练到通道剪枝,再到工程部署,本教程已为你打通全流程。现在就动手尝试,让你的YOLOv11模型在嵌入式设备、移动端上也能“飞起来”——相信我,当你看到剪枝后的模型在资源受限设备上仍能精准检测时,你会明白这份技术的价值。

m0_64661770的博客 711

Equals方法的实现

先看一下Object类的Equals方法的实现: publicstaticboolEquals(objectobjA,objectobjB){if(objA==objB)//如果两个对象的引用相同,都指向同一个对象那么肯定是相等{returntrue;}if((objA!=...

diechu0181的博客 336

YOLOv8改进策略【YOLO和Mamba】| 2024 VM-UNet,高效的特征提取模块VSS block 二次创新提高精度

VM-UNet模型设计的出发点是解决现有CNN-based和模型在医学图像分割中的局限性,利用(SSMs)的优势,提出一种更有效的医学图像分割模型。具体来说,CNN-based模型在捕捉长距离信息方面存在不足,而模型由于自注意力机制的二次复杂度导致计算负担较重。SSMs模型如Mamba不仅在建模长距离依赖方面表现出色,还具有线性计算复杂度,这为VM-UNet的设计提供了理论基础。

Limiiiing的博客 616

如何在 Java 中正确实现 `equals` 方法以配合 `hashCode`?

实现equals方法时,必须同时遵守自反性、对称性、传递性和一致性原则。对于任何非null的引用值x应该返回false。如果你的类重写了equals方法,那么也应该重写hashCode方法,以确保相等的对象具有相同的哈希码。在实现equals方法时,通常需要同时考虑null值、正确的类型检查、字段比较等因素。

2401_87715607的博客 507

五十天精通硬件设计第6天-放大器知识及选型

运算放大器(Operational Amplifier,简称运放)是一种高增益的直流耦合差分放大器,广泛应用于信号处理、滤波、比较、积分、微分等电路中。

whm128的博客 593

搭建你的第一个MCP服务器(Python版)

在上两篇博客中,我们已经对MCP(Model Context Protocol)有了初步的了解。MCP是一种强大的协议,能够简化LLM(大型语言模型)与外部工具的交互。今天,我们将通过一个具体的例子,展示如何使用Python搭建一个简单的MCP服务器。通过这个过程,你将能够更好地理解MCP的工作原理,并为后续的应用开发打下基础。在MCP中,工具(Tool)是服务器提供给LLM的接口。我们将定义一个简单的工具,用于接收输入文本并返回处理后的结果。首先,我们需要定义一个工具类。这个工具类将继承自,并实现run。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 8094

Java中equals()方法重写,零基础入门到精通,收藏这篇就够了

1.对象内容的比较,需要使用equals()方法,若是对于已经重写该方法的类,例如String类,就无需再重写;若是没有重写,例如自定义的User类,就需要重写。2.Java语言中的“==”对于基本数据类型就是比较其值,而对于对象就是比较对象的引用。

leah126的博客 1091

STM32电机PID速度控制

2.3 STM32电机PID速度控制 之前的文章,完成了直流减速电机的PWM控制、电机测速。本篇文章,将实现电机的速度闭环控制。 在公众号:小白学移动机器人,发送:速度PID,即可获得本篇文章的STM32工程文件以及相关资料。 2.3.1 解决的问题 解决带编码器直流电机的速度闭环问题。 2.3.2 PID理论 将偏差的比例、积分、微分,通过线性组合构成控制量,用控制量对被控对象进行控制,这样的控制器称为PID控制器。在连续空间中,我们通常探讨模拟PID的控制原理,如图所示: 我们这里用电机速度控制为例,

「小白学移动机器人」一个专注分享移动机器人相关知识的公众号! 6万+

java equals方法实现_java equals()方法

一、equals方法介绍1.1.通过下面的例子掌握equals的用法1 package cn.galc.test;23 public class TestEquals {4 public static void main(String[] args) {5 /**6 * 这里使用构造方法Cat()在堆内存里面new出了两只猫,7 * 这两...

weixin_28797725的博客 1025

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

听说你还搞不定java中的==和equals?

相信很多读者关于==和equals懂了又懵,懵了又懂,如此循环,事实上可能是因为看到的博客文章之类的太多了,长篇大论,加上一段时间的洗礼之后就迷路了。本篇文章再一次理清楚。当然如果觉得本文太啰嗦的话,当然我也考虑到了,因为我也不喜欢长篇大论啰里啰嗦比比叨叨胡搅蛮缠的文章,毕竟大家入门java 的时候就知道个大概了,因此记住一句话就好了:equals本身和 == 没有区别,对于基本数据都是比较值,对于引用类型,则比较的是所指向的对象的地址!其他类在继承Object类之后对equals方法重写,所以表现的是比较

宜春 4236

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【Java基础】重写equals方法详讲,零基础入门到精通,收藏这篇就够了

区别就是getClass()限制了对象只能是同一个类,而instanceof却允许对象是同一个类或其子类,

Javachichi的博客 472

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

重写equals方法

一、为什么要重写equals方法? Object类是Java中所有类的基类,Object类中的equals方法实际比较的是两个对象的内存地址是否相等。如果两个引用指向同一个对象,则equals返回true,否则返回false Object类中equals方法定义如下: public boolean equals(Object obj) { return (this == o...

hxt的博客 2525

List的equals方法学习

之前没有了解过这个方法,初次在项目中看到它的时候还以为是在比较两个List的地址,后来看了源码才知道了这个方法的作用。 首先看一个例子: public class Test{ public static void main(String[] args){ ArrayList<String> str1 = new ArrayList<String&gt...

diweikang的博客 6672

看完这篇文章,我彻底理解了 equals 和 ==

本文将带你透过源码直击问题本质,彻底搞懂 == 和 equals 方法的区别!

weixin_54620350的博客 1804

为什么重写equals方法之后必须要重写hashCode

默认的equals看似能满足我们的要求,实则不然,多数情况下,我们更希望比较的是两个对象的内容是否想,比如两个字符串,String a = "12345",String b = "12345",内容完全一样,在我们看来这两个字符串就是相等的,但在equals方法看来,两个字符串的内存地址不相等,所以仍然会判定为不相等,这就与我们的判断结果发生了矛盾,所以我们需要去重写equals方法,只有重写了equals方法之后,我们再去判断a和b,这是判断结果才会相等。为什么遇到散列表,上面的代码就会出错呢?

m0_70325779的博客 1778

java equals方法实现_Java自定义实现equals()方法

Java自定义实现equals()方法以常见的自定义Date类型为例,没有经验的朋友可能会觉得直接比较年月日即可,从而写出以下的实现public class MyDate implements Comparable {private final int year;private final int month;private final int day;public MyDate(int year...

weixin_39815345的博客 416

关于 equals 和 hashCode,看这一篇真的够了!

作者:CringKong https://blog.youkuaiyun.com/CringKong/article/details/89429269 这几天在尝试手撸一个类似Lombok的注解式代码生成工具,用过Lombok的小伙伴知道,Lombok可以通过注解自动帮我们生产equals()和hashCode()方法,因此我也想实现这个功能,但是随着工作的深入,我发现其实自己对于equals()和hashCode()的理解,也处在一个很低级的阶段。 因此痛定思痛,进行了一番深入学习,才敢来写这篇博客。 1、equ.

Java技术栈,分享最主流的Java技术 1268

重写实体类的equals 和hashCode 方法!

什么是 equals 和 hashcode 方法? 这要从 Object 类开始说起,我们知道 Object 类是 Java 的超类,每个类都直接或者间接的继承了 Object 类,在 Object 中提供了 8 个基本的方法,equals 方法和 hashcode 方法就是其中的两个。 equals 方法:Object 类中的 equals 方法用于检测一个对象是否等于另一个对象,...

net343的博客 2559

为什么Comparator接口不需要实现equals方法

为什么Comparator接口不需要实现equals方法 查阅资料后加上个人的猜测: 首先Compare中有两个抽象方法 需要实现类去实现1.compare(T o1,T o2)方法 2. equals(Object obj)方法 但是实际上实现该接口时 只需要实现compare方法就不会报错 因为Object类是所有的类的父类,而该类中有自己的equals方法 所以我认为 comparator接口的实现类(这里说一下 我猜测实现接口的类也可以同时继承父类 所以是 实现类 implements 接口

qq_21375743的博客 1134

equals方法与hashcode方法的重写

很显然,输出的结果无论是用的==比较还是用的equals比较都是false;散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的。经过哈希表达式计算后的hashcode相等的实在不好找,就不敲代码测试了,欸嘿~当发生冲突时,对应的存储单元以链表的形式保存冲突的数据(链地址法)。常见的散列表实现方式:用数组作为哈希函数的输出域,引用类型的变量所指向的对象的地址。

SuYuewu的博客 1911

Java语言深入:深入研究Java equals方法,equals,==,equals用法

 网上关于equals 和 == 的区别的讨论巨多这里先简单分析下他们的区别吧:equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等。==用于比较引用和比较基本数据类型时具有不同的功能:比较基本数据类型,如果两个值相同,则结果为true 而在比较引用时,如果引用指向内存中的同一对象,结果为trueEg:s1 = new Strin

Defonds 的专栏 1万+
上一篇: 带你用广度优先搜索实现地铁计费功能
下一篇: 契约测试 No stubs or contracts were found for [XXX]问题解决
H阿布
博客等级 码龄12年 24粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值