重载equals方法时不必要重载(c# .net当我们比较两个字符串是否相等时比较的是)
本文目录
- c# .net当我们比较两个字符串是否相等时比较的是
- java中的equals和==
- java重载和重写问题;
- 调用equals方法对比,是不是必须要重写这个方法重写的话怎么写
- 为什么在重写equals方法时,一般都会重写hashcode方法
- java重载Object中equals()的方法时的问题
c# .net当我们比较两个字符串是否相等时比较的是
1、对于值类型,==和equals等价,都是比较存储信息的内容。
2、对于string类要特殊处理,它是一个内部已经处理好了equals方法和==的类,故==和equals等价,都是比较存储信。
3、对于引用类型,==比较的是引用类型在栈中的地址,equals方法则比较的是引用类型在托管堆中的存储信息的内容。
该值由字符串最前面的部分决定。如果字符串以合法的数字数据开始,就用该数字作为其值,否则其值为 0(零)。合法数字数据由可选的正负号开始,后面跟着一个或多个数字,后面跟着可选的指数。指数是一个“e”或者“E”后面跟着一个或多个数字。
扩展资料:
布尔值TRUE将被转换为字符串 "1",而值FALSE将被表示为 ""(即空字符串)。这样就可以随意地在布尔值和字符串之间进行比较。
整数或浮点数数值在转换成字符串时,字符串由表示这些数值的数字字符组成(浮点数还包含有指数部分)。
数组将被转换成字符串 "Array",因此无法通过echo()或者print()函数来输出数组的内容。请参考下文以获取更多提示。
对象将被转换成字符串 "Object"。如果因为调试需要,需要将对象的成员变量打印出来,请阅读下文。如果希望得到该对象所依附的类的名称,请使用函数get_class()。自 php 5 起,如果合适可以用 __toString() 方法。
java中的equals和==
第二个你采用的是equals方法比较,两个类型为 IntValue 的对象,IntValue并没有重写equals方法调用的是Object对象的equals方法,Object对象的equals方法和==是一样的,所以是false;如果你这个类中重写equals和hasCode方法后就会使true了,把IntValue改为class IntValue{ int a; public IntValue(int _a){ a=_a; } public int hashCode() { final int prime = 31; int result = 1; result = prime * result + a; return result; } public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; IntValue other = (IntValue) obj; if (a != other.a) return false; return true; } }
java重载和重写问题;
可以啊,你是不是参数传错了,我估计你是没注意到参数的类型,一个是EquesTest,一个是Object的类型。
调用equals方法对比,是不是必须要重写这个方法重写的话怎么写
这是object类的方法 也就是任何对象都有这个方法 调用如果没有重写自动调用object类的 没有必须要重写 重写就override就可以 声明返回布尔值 比如你要判断两个人 名字相等 这两个人的equals就返回真 就人的成员变量的属性和传入object参数向下转换成人的对象 取出属性if判断return就可以 一般来说 重写equals方法就需要重写hashcode方法 这两个是一对的 否则比如存入set集合就会和你需要的不同
为什么在重写equals方法时,一般都会重写hashcode方法
如果你重载了equals,比如说是基于对象的内容实现的,而保留hashCode的实现不变,那么很可能某两个对象明明是“相等”,而hashCode却不一样。这样,当你用其中的一个作为键保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一个作为键值去查找他们的时候,则根本找不到。使用HashMap,如果key是自定义的类,就必须重写hashcode()和equals()。而对于每一个对象,通过其hashCode()方法可为其生成一个整形值(散列码),该整型值被处理后,将会作为数组下标,存放该对象所对应的Entry(存放该对象及其对应值)。 equals()方法则是在HashMap中插入值或查询时会使用到。当HashMap中插入值或查询值对应的散列码与数组中的散列码相等时,则会通过equals方法比较key值是否相等,所以想以自建对象作为HashMap的key,必须重写该对象继承object的hashCode和equals方法。 2.本来不就有hashcode()和equals()了么?干嘛要重写,直接用原来的不行么? HashMap中,如果要比较key是否相等,要同时使用这两个函数!因为自定义的类的hashcode()方法继承于Object类,其hashcode码为默认的内存地址,这样即便有相同含义的两个对象,比较也是不相等的,例如,生成了两个“羊”对象,正常理解这两个对象应该是相等的,但如果你不重写 hashcode()方法的话,比较是不相等的!HashMap中的比较key是这样的,先求出key的hashcode(),比较其值是否相等,若相等再比较equals(),若相等则认为他们是相等的。若equals()不相等则认为他们不相等。如果只重写hashcode()不重写equals()方法,当比较equals()时只是看他们是否为同一对象(即进行内存地址的比较),所以必定要两个方法一起重写。HashMap用来判断key是否相等的方法,其实是调用了HashSet判断加入元素是否相等。引用别人说的一段话哈~一般来说,如果你要把一个类的对象放入容器中,那么通常要为其重写equals()方法,让他们比较地址值而不是内容值。特别地,如果要把你的类的对象放入散列中,那么还要重写hashCode()方法;要放到有序容器中,还要重写compareTo()方法。equals()相等的两个对象,hashcode()一定相等;equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。(我的理解是由于哈希码在生成的时候产生冲突造成的)。反过来:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等
java重载Object中equals()的方法时的问题
先看你的重载方法的: public boolean equals(Circle circle)而Object里的equals是: public boolean equals(Object obj)这两个方法的参数不同,所以Circle里的这个equals方法并没有覆盖object里的equals方法,而是增加了一个新的equlas方法,这个方法的参数是一个Circle引用,Circle还有1个继承自object的equals方法,这个方法的参数是一个Object引用。1.Object circle1 = new Circle();//这里Object改成Circle输出true,为什么? 当这里是Circle circle1 = new Circle();Circle circle2 = new Circle()时,circle1.equals(circle2)这一句传递给equlas的是一个Circle引用,所以调用的是自己的equals(Circle circle)方法,这个方法检测的是两个Circle的radius值,相等则为True。Circle的radius已在类中被初始化为1,所以这里输出true。 当这里是Object circle1 = new Circle(); Object circle2 = new Circle();时,circle1.equals(circle2)这一句传递给equlas的是一个Object引用,所以调用的是Object的equals(Object obj)方法,显然返回false。 当这里是Circle circle1 = new Circle(); Object circle2 = new Circle();时,circle1.equals(circle2)这一句传递给equlas的是一个Object引用,所以调用的是继承自Object的equals(Object obj)方法,显然返回false。 当这里是Object circle1 = new Circle(); Circle circle2 = new Circle();时,circle1.equals(circle2)这一句传递给equlas的是一个Circle引用。circle1是Object类型,对一个父类引用来说,即使赋给它子类的对象也无法调用父类没有定义过的函数,也就是说equals(Circle circle)这个方法对circle1来说就不存在,而Circle也是一个Object,所以调用的是Object的equals(Object obj)方法,显然返回false。2. System.out.println(circle1);//为什么不能看到radius变量?不是父类引用指向子类对象吗? Java中绑定有两种形式静态绑定static-binding(早绑定early-binding)和动态绑定dynamic-binding(晚绑定late-binding,或运行时绑定runtime-binding)。静态绑定是在编译时绑定,而动态绑定是在运行时根据对象的实际情况来选择绑定父类或者是某个子类的方法。Java中成员变量是静态绑定的,方法是动态绑定的。在进行“向上转型”的时候子类会覆盖父类的实例方法而不会覆盖父类的成员变量。父类的成员变量还是父类的成员变量,用Object circle1 = new Circle()向上转型,circle是个object,根本就没有radius这个成员变量,所以看不到。记住一点,多态仅仅针对的是方法。3.书上说在重载Object中equals()的方法时必须把里面的形参声明为Object,这里参数写成Object 不就不能用.radius了吗? 重载equals时,必须把参数声明为Object,否则不能覆盖父类的equals,造成上面第一条的结果。 像下面这样的equals,来自于Core Java卷一: public boolean equals(Object obj) { if (this == obj) return true; //如果引用同一个对象直接返回true if (obj == null) return false; //如果obj为null,直接返回false if (getClass() != obj.getClass()) return false; //如果不属于同一个类的话直接返回false Circle other = (Circle) obj; //强制转换为Circle,才能访问radius return radius == other.radius; //比较radius }
更多文章:
新闻网站源码去一品资源(求助:flash图片滚动新闻源代码(js))
2024年8月23日 01:55
在Word中插入图片,但是总是向左偏的,如何使之居中?如何在word中插入的图片居中
2024年7月23日 22:18
《堡垒之夜》第8赛季即将开启,官方预告透露了哪些信息?《第八天之夜》演员表都有谁
2024年7月13日 17:29
flash鼠标跟随效果代码(flash鼠标跟随代码 3.0)
2024年9月1日 11:30
国家二级c语言(全国计算机二级C语言考试属不属于全国计算机专业软件水平考试)
2024年9月10日 11:45
continue doing 和 to do区别(continue doing 和 to do区别)
2024年8月24日 05:35
知识管理系统架构图(知识库管理系统解决方案_知识库管理系统开源)
2024年3月10日 08:45
网页设计与制作实训总结(学网页设计还是平面设计还是影视制作好)
2024年6月29日 10:17
catch a fire的用法(catch a fire有没有a)
2024年3月21日 09:30
易语言字符串转数组(易语言 不能将“文本型”数据转换到“文本型 数组”数据问题在线等、)
2024年7月7日 03:07
asynctask的方法(安装QQ时提示无法启动程序,计算机丢失asynctask.dll文件)
2024年6月16日 23:07