java中this的用法==和equals的区别

java中equals和等号(==)的区别浅谈 - 博客频道 - CSDN.NET
分类:java_菜鸟的进阶史
java中的数据类型,可分为两类:
1.基本数据类型,也称原始数据类型。
byte,short,char,int,long,float,double,boolean&& 他们之间的比较,应用双等号(==),比较的是他们的值。
2.复合数据类型(类)&
& 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。&&
对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。
publicclass TestString {
publicstaticvoid main(String[] args) {
String s1 =&Monday&;
String s2 =&Monday&;
if (s1 == s2)
System.out.println(&s1 == s2&);}
System.out.println(&s1 != s2&);}
编译并运行程序,输出:s1 == s2说明:s1 与 s2 引用同一个 String 对象 -- &Monday&! 2.再稍微改动一下程序,会有更奇怪的发现:
publicclass TestString {
publicstaticvoid main(String[] args)
String s1 =&Monday&;
String s2 =new String(&Monday&);
if (s1 == s2) {System.out.println(&s1 == s2&);
System.out.println(&s1 != s2&);
if (s1.equals(s2))
System.out.println(&s1 equals s2&);
System.out.println(&s1 not equals s2&);
我们将s2用new操作符创建 程序输出: s1 != s2 s1 equals s2 说明:s1 s2分别引用了两个&Monday&String对象
3. 字符串缓冲池&
原来,程序在运行的时候会创建一个字符串缓冲池当使用 s2 = &Monday& 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1 将s2引用s1所引用的对象&Monday& 第二段程序中,使用了 new 操作符,他明白的告诉程序:&我要一个新的!不要旧的!&于是一个新的&Monday&Sting对象被创建在内存中。他们的值相同,但是位置不同,一个在池中游泳一个在岸边休息。哎呀,真是资源浪费,明明是一样的非要分开做什么呢?
4.再次更改程序:
publicclass TestString
publicstaticvoid main(String[] args)
String s1 =&Monday&;
String s2 =new String(&Monday&);
s2 = s2.intern();
if (s1 == s2)
System.out.println(&s1 == s2&);
System.out.println(&s1 != s2&);
if (s1.equals(s2))
System.out.println(&s1 equals s2&);
System.out.println(&s1 not equals s2&);
这次加入:s2 = s2.intern(); 程序输出: s1 == s2 s1 equals s2 原 来,(java.lang.String的intern()方法&abc&.intern()方法的返回值还是字符串&abc&,表面上看起来好像这个方 法没什么用处。但实际上,它做了个小动作:检查字符串池里是否存在&abc&这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会 把&abc&添加到字符串池中,然后再返回它的引用。
排名:千里之外
(4)(2)(1)(0)(1)Java中关于String和equals
Java中关于String和equals
小白一个,做做笔记帮助自己理解。
今天学习Java的时候,刚好学到关于判断字符串是否相等的问题,于是引发了一个区别“==”和“equals”的一个问题,还是从程序入手吧。
public class equal {
public static void main(String[] args) {
// TODO Auto-generated method stub
String A=new String("美好一天");
String B=new String("美好一天");
System.out.println(A.equals(B));
System.out.println(A==B);
String C="美好一天";
String D="美好一天";
System.out.println(C.equals(D));
System.out.println(C==D);
以上程序的输出结果分别是
为什么会出现上面的结果呢,这要从“==”和“equals”的比较的作用来探讨。equals()方法是用来判断两个字符串的内容是否相等。容易和“==”混淆,“==”也可以用来比较两个字符串,但是用“==”比较的不只是字符串的内容是否相等,它还会检查这两个字符串的地址是否相同,即两个字符串是否处在同一个位置上。只有字符串内容相同而且它们的地址也相同的情况下,才返回true,否则返回false。关于String A=new String(&美好一天&);和String C=&美好一天&;这二者的区别,大家可以自行上网查阅。
本文原创发布于慕课网 ,转载请注明出处,谢谢合作!
相关标签:
分享即可 +1积分
请登录后,发表评论
评论(Enter+Ctrl)
评论加载中...
评论加载中...
每天醒来都有新的期待
作者的热门手记
Copyright (C)
All Rights Reserved | 京ICP备 号-2C# 中的 == 和 equals()有什么区别? - 文章 - 伯乐在线
& C# 中的 == 和 equals()有什么区别?
如以下代码:
int age = 25;
short newAge = 25;
Console.WriteLine(age == newAge);
Console.WriteLine(newAge.Equals(age)); //false
Console.ReadLine();
int age = 25;&short newAge = 25;&Console.WriteLine(age == newAge);&&//true&Console.WriteLine(newAge.Equals(age)); //false&Console.ReadLine();
int和short为原始类型,但与“==”比较返回true,equals()比较返回false。为什么呢?
简而言之:
“equals()”相比“= =”复杂。
具体来说:
原始类型覆盖(override)基类的object.Equals(object),并且当括弧中的object与其类型和值相同时返回true (注意Nullable类型也适合上述判断;非空Nullable类型总是装箱到一个基础类型实例)。
由于newAge是short,因此在object是short且值与newAge值相等时,newAge.Equals(object)返回true。你传递的是一个int对象,所以它返回false。
相比之下,“= =”运算符被定义为带两个整形(int)或两个短整型(short)或两个长整形(long)的运算。当“= =”两个参数一个是整形和一个短整型时,编译器会隐式转换short为int,并比较转换后int值大小。
使其工作其他方法:
原始类型也有自己的equals()方法,equals接受相同的类型的参数。
如果你写age.Equals(newAge),编译器将选择int.Equals(int)作为最好的重载(overload)方法且隐式转换short为int。然后,它会返回true,因为这种方法直接比较两个int值大小。
short也有一个short.Equals(short)方法,但是int类型不能隐式转换为short,所以就不会调用它。
你可以使用cast转换强制调用这个方法:
Console.Writeline(newAge.Equals((short)age)); //true
&&&&&& Console.Writeline(newAge.Equals((short)age)); //true
这将直接调用short.Equals(short),没有装箱操作。如果age大于32767,它会抛出一个溢出异常。
你也可调用short.Equals(object)这个重载,但需要明确地传递一个经过装箱的具有相同类型的对象:
Console.WriteLine(newAge.Equals((object)(short)age)); // true
Console.WriteLine(newAge.Equals((object)(short)age)); // true
像前面可选方法(short.Equals(short))一样,如果大小超过short范围,同样抛出一个溢出异常。不同于以往的解决方案,它将short装箱成一个object——浪费time和memory。
Source Code:
这里是实际中使用的Equals():
public override bool Equals(Object obj) {
if (!(obj is Int16)) {
return m_value == ((Int16)obj).m_
public bool Equals(Int16 obj)
return m_value ==
12345678910111213141516171819
public override bool Equals(Object obj) {&&&&&&&&&if (!(obj is Int16)) {&&&&&&&&&&&&&return false;&&&&&&&&&}&&&&&&&&&return m_value == ((Int16)obj).m_value;&&&&&}&&&&&public bool Equals(Int16 obj)&&&&&{&&&&&&&&&return m_value == obj;&&&&&}
关于作者:
可能感兴趣的话题
閱畢原文後覺得翻譯中的「“equals()”相比“= =”复杂。」有點問題。
原文應是指出「相等並不是你想像中那麼簡單。」 (Equality is complicated.)
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线(IT行业交流)
(IT行业交流)
(IT行业交流)
(IT行业交流)
(IT行业交流)
第三方登录:java中“==”、equals和hashCode的区别
java中“==”、equals和hashCode的区别
1.“==”运算符是用来比较两个变量的值是否相等。也就是比较变量对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用类型变量是否相等只能使用“==”来比较。
如果变量是基本数据类型,那么可直接用“==”比较。
String s = "hello";
String t = "hello";
返回的是true。
如果变量是指向数据的对象(引用类型),那么此时涉及到两块内存,对象本身占用一块内存空间(堆内存),变量也占用一块内存。
String s = new String("hello");
变量s占用一块存储空间,而new String("hello")则存储在另一块存储空间里。此时,变量s的值就是new String("hello")占用内存的首地址。
String s = new String("hello");
String t = new String("hello");
返回的是false。
2.equals是Object类提供的方法之一。每一个Java类都继承自Object类,所以每一个对象都具有equals这个方法。Object类中定义的equals(Object)方法是直接使用“==”运算符比较两个对象,所以在没有覆盖equals(Object)方法的情况下,equals(Object)和“==”一样,比较的是引用。
相比“==”运算符,equals(Object)方法的特殊之处在于它可以被覆盖,所以通过覆盖的方法让它比较数据内容而不是比较引用。如String类覆盖了equals(Object)方法(而StringBuffer的equals方法没有覆盖Object的方法),所以String类的equals()方法是用于比较两个独立对象的内容是否相同。
String s = new String("hello");
String t = new String("hello");
返回的是false,而s.equals(t)将返回true。所以要比较量比较两个实例对象的内容是否相同,那你必须覆盖equals()方法,然后再进行比较。
3.hashCode()方法是从Object类中继承过来的,它也用来鉴定两个对象是否相等。Object类中的hashCode()方法返回对象是在内存中地址转换成的一个int值,所以如果没有重写hashCode()方法,任何对象的hashCode()方法都是不相等的。
既然说hashCode()也是用来鉴定两个对象是否相等,那么它和equals()方法有什么区别呢?
一般来说,equals()方法是给用户调用的,如果你想判断2个对象是否相等,你可以重写equals()方法,然后在代码中调用,就可以判断他们是否相等了。简单来讲,equals()方法主要是用来判断从表面上看或者从内容上看,2个对象是不是相等。举个例子,有个学生类,属性只有姓名和性别,那么我们可以认为只要姓名和性别相等,那么就说这2个对象是相等的。
而hashCode()方法一般用户不会去调用它,比如在hashmap中,由于key是不可以重复的,它在判断key是不是重复的时候就判断了hashCode()这个方法,而且也用到了equals()方法。这里不可以重复是说equals()和hashCode()只要有一个不等就可以了!所以简单来讲,hashCode()相当于是一个对象的编码,就好像文件中的md5,它与equals()不同就在于他返回的是int型的,比较起来不直观。
一般在覆盖equals()的同时也要覆盖hashCode(),否则,就会违反Object.hashCode的通用约定,从而导致该类无法与所有基于散列值(hash)的集合类(HashMap、HashSet和Hashtable)结合在一起正常运行。
hashCode()方法的返回值和equals()方法发关系:
x.equals(y)
返回true,那么调用这2个对象中任意一个对象的hashCode()方法都必须产生同样的整数结果
返回false,那么x和y的hashCode()方法发返回值有可能相等,也有可能不想等。
反之,hashCode()方法返回值不相等,equals()方法返回值一定不相等。hashCode()方法返回值相等,equals()方法返回值可能相等,也可能不相等。
我的热门文章
即使是一小步也想与你分享}

我要回帖

更多关于 java中super的用法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信