站稳马步——(1)重写 equals 和 hashCode 方法

Cadence Allegro PCB文件对比实战:3分钟搞定两份设计差异(附颜色标注技巧) 本文详细介绍了如何高效使用Cadence Allegro的Design Compare功能进行PCB文件差异对比。通过实战工作流,可在3分钟内精准定位并理解两份设计在布局、布线、元件等方面的关键差异,并分享了自定义颜色标注技巧,帮助工程师快速聚焦重要修改,提升设计评审与团队协作效率。 阅读详情

站稳马步

——整理 Object 类(为什么重写 equals 和 hashCode 方法)

一.             关键字:

Object 、 equals() 、 hashCode ()

二.             为什么需要重写:

众所周知, Object 是所有类的父类。但,我们在实际开发中自定义自己类时,往往需要重写 Object 中 equals 和 hashCode 方法。为什么呢?首先看看 Object 的 API 吧。

Object 类中原始写法是:

public boolean equals ( Object obj ) {

              return ( this == obj ) ;

  }

可见,原始 equals 比较的是 2 个对象的“内存地址”。但,我们往往是需要判断的是“逻辑上的内容”是否相等,如: String 、 Integer 、 Math... 等等,时而我们关心是逻辑内容上是否相等,而不关心是否指向同一对象,所以所要重写。

再者,尽管 Object 是一个具体的类,但是设计它主要是为了扩展。它所要的非 final 方法( equals hashCode toString clone 和 finalize )都有通用约定( general contract ),因为它们被设计成要被覆盖( override )的。任何一个类,它在覆盖这些方法的时候,都有责任遵守这些通用的约定;如果不能做到这一点,其它依赖这些约定的类(例如 HashMap 和 HashSet )就无法结合该类一起正常运行。

       JDK API 上重写 equals 约定如下:

自反性 :

对于任何非空引用值 x ,x.equals(x) 都应返回 true 。

对称性 :

对于任何非空引用值 x 和 y ,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true 。

传递性 :

对于任何非空引用值 x 、y 和 z ,如果 x.equals(y) 返回 true ,并且 y.equals(z) 返回 true ,那么 x.equals(z) 应返回 true 。

一致性 :

对于任何非空引用值 x 和 y ,多次调用 x.equals(y) 始终返回 true 或始终返回 false ,前提是对象上 equals 比较中所用的信息没有被修改。

对于任何非空引用值 x ,x.equals(null) 都应返回 false

同时, API 规定“ 当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码 “所以也要重写 hashCode 方法。

    public native int hashCode () ;

说明是一个本地方法,它的实现是根据本地机器相关的,方法返回的是对象的地址值。时而重写 hashCode 一是为了遵守 API 约定,二是重点提高对象比较时效率。

因为,在 java 集合对象中比较对象是这样的,如 HashSet 中是不可以放入重复对象的,那么在 HashSet 中又是怎样判定元素是否重复的呢?让我们看看源代码(首先要知道 HashSet 内部实际是通过 HashMap 封装的):

public boolean add ( Object o ) { //HashSet 的 add 方法

           return map.put ( o, PRESENT ) == null ;

    }

 

public Object put ( Object key, Object value ) { //HashMap 的 put 方法

        Object k = maskNull ( key ) ;

        int hash = hash ( k ) ;

        int i = indexFor ( hash , table.length ) ;

         for ( Entry e = table [ i ] ; e != null ; e = e.next ) {

            if ( e.hash == hash && eq ( k, e.key )) { // 从这里可见先比较 hashcode

                Object oldValue = e.value;

                e.value = value;

                e.recordAccess ( this ) ;

                return oldValue;

            }

        }

        modCount++;

        addEntry ( hash , k, value, i ) ;

        return null ;

    }

 

所以在 java 的集合中,判断两个对象是否相等的规则是:
1
,判断两个对象的 hashCode 是否相等
     
如果不相等,认为两个对象也不相等,完毕
     
如果相等,转入 2
2
,判断两个对象用 equals 运算是否相等
     
如果不相等,认为两个对象也不相等
     
如果相等,认为两个对象相等

 

为什么是两条准则,难道用第一条不行吗?不行,因为 hashCode() 相等时, equals() 方法也可能不等 ,所以必须用第 2 条准则进行限制,才能保证加入的为非重复元素。

 

 

 

三.             例子:

1. 首先

class Student {

    String name ;

    int age ;

   

    Student ( String name , int age ){

       this . name =name ;

       this . age =age ;

    }

// 没有重写 equals 和 hashCode

}

 

/**

  * @author ydj

  * @version Apr 28, 2010 3:12:42 PM

  */

public class OverEqualsHashcodeTest {

 

    public static void main ( String [] args ){

       Set < Student > set= new HashSet < Student > () ;

      

       Student stu1= new Student ( "ydj" ,26 ) ;

       Student stu2= new Student ( "ydj" ,26 ) ;

       set.add ( stu1 ) ;

       set.add ( stu2 ) ;

      

       System .out . println ( "set.size():" +set.size ()) ;

    }

}

结果是: 2. (这个无须解释)

 

 

2. 现在重写 equals 方法如下:

    public boolean equals ( Object obj ){

       System .out . println ( "--------equals()-----------:" +obj ) ;

       if ( obj == null ){

           return false ;

       }

       if ( ! ( obj instanceof Student )){

           return false ;

       } else {

           Student oth= ( Student ) obj ;

           return this . age ==oth. age && this . name ==oth. name ;

       }

//     return true;

   }

结果是: 2. (为什么依然是 2 呢?!为什么连 equals 方法都没调用呢)

分析: 这就是为什么要重写 hashCode 的原因( 相等对象必须具有相等的哈希码 )。因为现在的 hashCode 依然返回各自对象的地址,就是说明此时的 hashCode 肯定不相等,故根本不会调用 equals ()。

 

3. 重写 hashCode 方法如下:

public int hashCode (){

          int res=17;

         res=31*res+ age ;

         res=31*res+ name . hashCode () ;

        

         return res;

   }

结果是: 1.

 

如果这样重写 hashCode :

public int hashCode (){

         int res= ( int )( Math.random () *100 ) ;

         return res;

   }

这样的话,就等于没有重写了。

 

 

四.             设计 equals ()和 hashCode ():

A .设计equals()

[1] 使用instanceof 操作符检查“实参是否为正确的类型”。

[2] 对于类中的每一个“关键域”,检查实参中的域与当前对象中对应的域值。

[2.1] 对于非float 和double 类型的原语类型域,使用== 比较;

[2.2] 对于对象引用域,递归调用equals 方法;

[2.3] 对于float 域,使用 Float.floatToIntBits ( afloat ) 转换为int ,再使用== 比较;

[2.4] 对于double 域,使用 Double.doubleToLongBits ( adouble ) 转换为int ,再使用== 比较;

[2.5] 对于数组域,调用Arrays.equals 方法。

 

 

B. 设计hashCode()

[1] 把某个非零常数值,例如17 ,保存在int 变量result 中;

[2] 对于对象中每一个关键域f (指equals 方法中考虑的每一个域):

[2.1]boolean 型,计算(f ? 0 : 1);

[2.2]byte,char,short 型,计算(int);

[2.3]long 型,计算(int) (f ^ (f>>>32));

[2.4]float 型,计算 Float.floatToIntBits ( afloat ) ;

[2.5]double 型,计算 Double.doubleToLongBits ( adouble ) 得到一个long ,再执行[2.3];

[2.6] 对象引用,递归调用它的hashCode 方法;

[2.7] 数组域,对其中每个元素调用它的hashCode 方法。

[3] 将上面计算得到的散列码保存到int 变量c ,然后执行 result=37*result+c;

[4] 返回result 。

 

例子:

class Unit {

    private short ashort ;

    private char achar ;

    private byte abyte ;

    private boolean abool ;

    private long along ;

    private float afloat ;

    private double adouble ;

    private Unit aObject ;

    private int [] ints ;

    private Unit [] units ;

 

    public boolean equals ( Object o ) {

       if ( ! ( o instanceof Unit ))

           return false ;

        Unit unit = ( Unit ) o ;

       return unit. ashort == ashort

              && unit. achar == achar

              && unit. abyte == abyte

              && unit. abool == abool

              && unit. along == along

              && Float.floatToIntBits ( unit. afloat ) == Float

                     .floatToIntBits ( afloat )

              && Double.doubleToLongBits ( unit. adouble ) == Double

                     .doubleToLongBits ( adouble )

              && unit. aObject . equals ( aObject ) && equalsInts ( unit. ints )

              && equalsUnits ( unit. units ) ;

    }

 

    private boolean equalsInts ( int [] aints ) {

       return Arrays.equals ( ints , aints ) ;

    }

 

    private boolean equalsUnits ( Unit [] aUnits ) {

       return Arrays.equals ( units , aUnits ) ;

    }

 

    public int hashCode () {

       int result = 17;

       result = 31 * result + ( int ) ashort ;

       result = 31 * result + ( int ) achar ;

       result = 31 * result + ( int ) abyte ;

       result = 31 * result + ( abool ? 0 : 1 ) ;

       result = 31 * result + ( int ) ( along ^ ( along >>> 32 )) ;

       result = 31 * result + Float.floatToIntBits ( afloat ) ;

       long tolong = Double.doubleToLongBits ( adouble ) ;

       result = 31 * result + ( int ) ( tolong ^ ( tolong >>> 32 )) ;

       result = 31 * result + aObject . hashCode () ;

       result = 31 * result + intsHashCode ( ints ) ;

       result = 31 * result + unitsHashCode ( units ) ;

       return result;

    }

 

    private int intsHashCode ( int [] aints ) {

       int result = 17;

       for ( int i = 0; i < aints . length ; i++ )

           result = 31 * result + aints [ i ] ;

       return result;

    }

 

    private int unitsHashCode ( Unit [] aUnits ) {

       int result = 17;

       for ( int i = 0; i < aUnits . length ; i++ )

           result = 31 * result + aUnits [ i ] . hashCode () ;

       return result;

    }

}

 

为什么要用 31 这个数呢?因为它是个奇素数。如果乘以偶数,并且乘法溢出的话,信息就会丢失,因为与 2 相乘等价于移位运算。使用素数效果不是很明显,但是习惯上都是使用素数计算散列结果。 31 有个好处的特性,即用移位代替乘法,可以得到更好的性能: 31*I = = ( I << 5 ) - I 。现代的 VM 可以自动完成这样优化。 ——《 Effctive java SE 》

 

 

五.             注意:

1.equals ()不相等的两个对象,却并不能证明他们的hashcode() 不相等。

换句话说,equals() 方法不相等的两个对象,hashcode() 有可能相等

2.hashcode() 不等,一定能推出equals() 也不等;hashcode() 相等,equals() 可能相等,也可能不等。

 

六.             参考:

1.       http://www.cnjm.net/tech/article4731.html

2.       http://zhangjunhd.blog.51cto.com/113473/71571

 

开源libmodbus编译为32位和64位动态库 libmodbus 是支持Linux,Mac OS X,window 的一个开源库,支持modbus TCP和RTU 两种模式。 阅读详情

相关推荐

别再手动折腾了!PICO Unity SDK 一键配置开发环境保姆级教程(含PDC串流调试)

本文详细介绍了PICO Unity SDK的一键配置功能,帮助开发者快速搭建VR开发环境。通过自动化配置流程,大幅减少手动设置时间,提升开发效率。文章还涵盖了PDC串流调试技巧和常见问题解决方案,是PICO VR开发的实用指南。

weixin_30335575的博客 449

【小知识探究系列一】为什么Object方法的equals和hashcode方法需要同时被重写

之前看java技术相关书时总会看到这样一句话,即如果在自定义类中重写equals方法,那么同时需要重写hashcode方法。但是对深层原因没有去深究,本片文章就去一探究竟,为什么equals方法和hashcode方法需要同时被重写。 结论:同时重写equals和hashcode方法的目的是方便我们将当前类的对象准确的插入到散列表中。原因如下: 要想探究这个问题的原因,首先就得从往散列表插入一条数据的实现机制说起,我们以HashMap为例进行探究,先上HashMap的put方法源码:(Talk is che

浪舟子的博客 514

用KalmanNet搞定非线性状态估计:当卡尔曼滤波遇上神经网络

本文深入探讨了KalmanNet如何将神经网络与卡尔曼滤波结合,以解决非线性状态估计中的模型失配和噪声不确定性问题。通过保留经典滤波框架并用RNN学习卡尔曼增益,该方法在无人机导航、机器人定位等场景中实现了模型驱动与数据驱动的优势互补,提升了估计的鲁棒性和灵活性。

mango的博客 309

Object类的equal和hashCode方法重写,为什么?

往HashMap添加元素的时候,需要先定位到在数组的位置(hashCode方法)。 如果只重写了 equals 方法,两个对象 equals 返回了true,集合是不允许出现重复元素的,只能插入一个。 此时如果没有重写 hashCode 方法,那么就无法定位到同一个位置,集合还是会插入元素。这样集合中就出现了重复元素了。那么重写的equals方法就没有意义了。 如下图: ...

suncat的博客 1470

因果推断(二):因果推断涉及的ITE、ATE、CATE等效应

因果效应也称为**处理效应(Treatment effect)**是用于评判干预与否的结果差异的指标(处理变量对结果变量的影响)。比如在接受治疗组中,如果这些人不接受治疗,这组人接受治疗和不接受治疗的效应差异是多少。定义为实验组中每个个体的处理效应差异,比如一个个体在接收治疗和不接受治疗的两个处理方式的健康程度得分的差。但是一个人因为不可能。比如我们想探究接受治疗的男性用户和不接受治疗的男性用户的平均效果差异就是CATE。前面说ITE是无法观测的,是因为一个人不能同时接受治疗又不接受治疗,这里关键的就是。

Y1n的博客 3712

某商场G区火灾自动报警与控制系统设计

某商场G区火灾自动报警与控制系统设计 摘要:随着我国经济建设的迅速发展,人民生活水平不断提高,城市用地日益紧张,促使建筑物正朝着高层化、密集化方向发展。高层建筑的特点决定其火灾的危险性和高层建筑的火灾自动报警系统的重要性,一套完整的火灾自动报警及联动控制系统是高层建筑发生火灾时人们生命财产的有利保障,是能否快速准确地发现火情,把火灾扑灭在萌芽状态的关键所在。文章通过消防设计,论述了火灾自动报警及消...

weixin_44026784的博客 5365

object对象重写equals方法时为什么需要重写hashCode方法

在Java语言中,equals方法在使用时:     针对包装对象,比较的是对象的值(包括 boolean,byte,char,short,int,long,float,double)     针对String对象,比较的也是String的值(因为String内部重写了equals方法和hashCode方法)     针对其他object对象,比较的是两个对象的引用是否指向同一个内存地址

Maxwell_7 2507

【华为OD技术面试手撕真题】1、长度最小的子数组 | 手撕真题+思路参考+代码解析(C & C++ & Java & Python & JS)(三种解法)

【华为OD面试手撕真题】长度最小的子数组,本专栏更新每年华为OD机试的高频手撕代码题,每个题目都会使用五种语言进行解答(C & C++& Java & Python & JS),思路分析都非常详细, 实现最低的时间复杂度和高通过率,每个解题思路超过百字,内含各个编程语言的八股文面试题,欢迎大家订阅学习, 代码可以直接运行使用,全网限时最低价,持续更新

KJ.JK 1万+

为什么重写 equals 还要重写 hashcode?

重写equals()和hashCode()的核心目的是保证对象在哈希表中行为的正确性。若忽略这一原则,会导致集合类无法正常工作,甚至引发难以调试的逻辑错误。一致性equals()和hashCode()需基于相同的字段。性能优化:合理的哈希算法能减少冲突,提升集合效率。版权声明:本博客内容为原创,转载请保留原文链接及作者信息。参考文章面试官:重写 equals 时为什么一定要重写 hashCode?- 腾讯云为什么重写equals()方法时必须重写hashCode()方法?

ning的博客 1983

模拟电路综合笔试题解析

本专栏预计更新60期,当前为第10期,文章约6000字,旨在帮助读者掌握模拟电路笔试的核心知识点与实战技巧。文章分为五个章节,涵盖基础理论、高频考点、大厂题目解析等内容。首先,文章详细解析了DC-DC与LDO的区别及选型依据,并通过真题分析帮助读者理解其应用场景。接着,文章深入探讨了运放电路设计、同步降压电路设计等高频考点,并结合实际案例提供解决方案。此外,文章还分享了特斯拉、华为、大疆等大厂的面试题及解析,帮助读者应对复杂电路设计挑战。最后,文章总结了模拟电路设计中的关键技巧与优化方法,为读者提供全面的笔

启芯硬件的博客 469

手把手写深度学习(27):如果获得相机位姿态的plücker embedding?以RealEstate10K为例

用plücker embedding表示相机的位姿是一种非常常用的方法,这篇博客以RealEstate10K数据集为例子,详细讲解如何从相机的轨迹坐标中获得plücker embedding,用于下一步模型的学习。

沉迷单车的追风少年 2239

为什么重写equals方法同时需要重写hashCode方法?

为什么重写equals方法同时需要重写hashCode方法? 众所周知equals()和hashCode()是Object类中定义的方法。Object类定义的方法如下: Object的equals()定义如下: 注释部分大概意思是: 请注意,每当重写此方法时,通常需要重写哈希代码,其中规定相等的对象必须具有相等的哈希代码。 Object的hashCode()定义如下: 以上...

饶艳辉 4347

人工智能算法面试大总结-总目录

涉及秋招、春招、社招

啥都生的博客 2万+

为什么要重写hashCode()和equals()

从源码的角度,介绍hashCode()和equals()函数的作用,解释为什么需要重写,什么时候需要重写,具体应该怎么重写。

LYQ20010417的博客 4904

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

重写hashCode()方法

hashCode()用于返回调用该方法的对象的散列码值,此方法将返回整数形式的散列码值。 在object类中,hashcode()方法是本地方法,返回的是对象的地址值,而object类中的equals()方法比较的也是两个对象的地址值,如果equals()相等,说明两个对象地址值也相等,当然hashcode()也就相等了。一旦一个类重写equals()方法,通常也会重写h...

weixin_30834019的博客 339

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

面试系列之Object类详解及重写equals为何要重写hashCode

Object类作为一个所有类的一个父类,常用的方法有哪些呢?为什么重写了equals方法,还要重写hashCode()方法呢?

lgy_2021的博客 786

深度学习工具包 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")

java when方法_java – Mockito异常 – when()需要一个必须是模拟方法调用的参数

我有一个非常简单的测试用例,它使用Mockito和Spring测试框架.当我做when(pcUserService.read("1")).thenReturn(pcUser);我得到这个例外.org.mockito.exceptions.misusing.MissingMethodInvocationException:when() requires an argument which has t...

weixin_42514783的博客 5636

单元测试常用 -- Mock 框架

文章目录**单元测试常用 -- Mock 框架****Mockito 框架****常用注解****示例代码****PowerMock 框架****Mock 入参对象****Mock 方法内部 new 出来的对象****Mock 普通对象的 final 方法****Mock 普通对象的静态方法、私有方法****踩坑指南** 单元测试常用 – Mock 框架 Mockito 框架 常用注解 @Mock:功能类似于 Spring 的注解 @Autowied,但不会真的注入单例,而是表示这个类要被 mock。 @I

weixin_44293582的博客 2816

Mockito模拟静态方法报错:org.mockito.exceptions.misusing.MissingMethodInvocationException.求解

Mockito模拟静态方法报错:org.mockito.exceptions.misusing.MissingMethodInvocationException.求解

weixin_45990146的博客 4227

重写equal()时为什么也得重写hashCode()之深度解读equal方法与hashCode方法渊源

今天这篇文章我们打算来深度解读一下equal方法以及其关联方法hashCode(),我们准备从以下几点入手分析: 1.equals()的所属以及内部原理(即Object中equals方法的实现原理) 说起equals方法,我们都知道是超类Object中的一个基本方法,用于检测一个对象是否与另外一个对象相等。而在Object类中这个方法实际上是判断两个对象是否具有相同的引用,

zejian的博客 7万+

java when方法,Mockito Exception - when()需要一个参数,它必须是一个模拟的方法调用...

I have a very simple test case that is using Mockito and Spring Test framework. When I dowhen(pcUserService.read("1")).thenReturn(pcUser);I get this exception.org.mockito.exceptions.misusing.MissingMe...

weixin_42500195的博客 2407

整理 Object 类(为什么重写 equals 和 hashCode 方法)

Object类(为什么重写equals和hashCode方法) 一.关键字: Object、equals()、hashCode() 二.为什么需要重写: 众所周知,Object是所有类的父类。但,我们在实际开发中自定义自己类时,往往需要重写Object中equals和hashCode方法。为什么呢?首先看看Object的API吧。 Object类中原始写法是: publicbool...

datoplay 391

为什么要重写java中对象的equals方法和hashCode方法以及如何重写

为什么要重写hashCode和equals方法以及如何重写

TimeTDIT的博客 4554

为什么重写equals方法要重写HashCode方法

为什么重写equals方法要重写HashCode方法 一、为什么重写equals方法要重写HashCode方法 在Object类中HashCode和equals是具有相同表现的 ① 如果两个对象equals为F,则表示两个对象的地址不同,则对应的HashCode不同。 ② 在所有的Hash*结构中,先判断HashCode。由于现有计算HashCode的算法的不完美性,两个完全不同的对象对应的HashCode是有可能相同的。因此,两个对象的HashCode相同,当使用equals进行比较时,结果可能是T,也可

Hello_mengkebao的博客 1912

Mockito测试静态方法

书接上回: https://blog.youkuaiyun.com/qq_36110736/article/details/107897223 在单元测试中非常有可能会遇到一些静态方法,由于静态方法无法被实例对象所调用所以我们通过 mock 的方式也无法直接测试静态方法,此时就需要 PowerMock 的方式来测试静态方法。 第一步 添加依赖: <dependency> <groupId>org.powermock</gro...

浮煌的博客 7294

详解重写equals()方法就必须重写hashCode()方法的原因

重写的作用: 如果重写(用于需求,比如建立一个Person类,比较相等我只比较其属性身份证相等就可不管其他属性,这时候重写)equals,就得重写hashCode,和其对象相等保持一致。如果不重写,那么一定保持一致。 1. 重写equals()方法就必须重写hashCode()方法主要是针对HashSet和Mao集合类型。集合框架只能存入对象(对象的引用(基本类型数据:自动装箱))。 在向HashSet集合中存入一个元素时,HashSet会调用该对象(存入对

怕什么真理无穷, 进一寸有一寸的欢喜 6万+
上一篇: 生成帮助文档(html或chm格式)
下一篇: 站稳马步——(2)clone(克隆)、Cloneable
易德军
博客等级 码龄19年 134粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值