==

==比较分为两种情况:基本数据类型比较与引用数据类型比较

1.基本数据类型,根据基本数据类型的值是否相等来判断,相等则返回true,不相等则返回false。两端数据类型可以不同,如果转换后的数值相等,则也返回true。

    public static void main(String[] args) {
int i = 65;
int j = 65;
char c = 65;
float f = 65.0f;
char a = 'A';
System.out.println(i == j);
System.out.println(i == c);// char型隐式转换成int型
System.out.println(i == f);// char型隐式转换成float型
System.out.println(i == a);// char型隐式转换成int型
}

以上全部是true。

2.引用数据类型,比较引用类型变量的地址值(即引用类型变量对应的堆空间的对象实体的首地址)是否相等。

    public static void main(String[] args) {
Object obj1 = new Object();
Object obj2 = new Object();
Object obj3 = obj1;
System.out.println(obj1);
System.out.println(obj2);
System.out.println(obj3);
System.out.println(obj1 == obj2);
System.out.println(obj3 == obj1);
}

以上打印的结果是:

java.lang.Object@5197848c
java.lang.Object@17f052a3
java.lang.Object@5197848c
false
true

3、基本类型和引用类型比较

基本类型和包装类型比较,是怎样的呢?示例如下

    public static void main(String[] args) {
int a = 128;
Integer b = 128;
System.out.println(a == b);
}

基本类型和包装类型比较,包装类型会有一个拆箱操作,比较的是基本类型的值,可以在包装类型的intValue()方法上打断点来验证。如果基本类型的值不能比较,如布尔类型的值不能其他原始类型比较,就会报编译错误。如Boolean c = true,a == c就会报编译错误。基本类型和非包装类型比较,也会报编译错误。如String d = "1",a==d会报编译错误。

再多说一点,在把原始类型值直接赋值给Integer类型的b时,会有一个装箱操作,可以通过在valueOf()方法上打断点来验证。

在本例中,Integer b = 128,其实执行的是Integer b = Integer.valueOf(128),a == b,其实执行的是a == b.intValue()。

equals()

equals()比较,则只能用于引用数据类型比较

以下是Object类的equal方法的源代码:

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

Object类中的equal()方法比较的仍然是两个引用变量的地址值是否相等

   public static void main(String[] args) {
Object obj1 = new Object();
Object obj2 = new Object();
System.out.println(obj1.equals(obj2));
}

以上比较的结果仍然是false。

而String类、包装类、File类、Date类都重写了Object类的equal()方法,此时的equal()方法比较的是两个对象的实体内容是否相同。

需要注意的是,StringBuffer类没有重写Object的equal()方法。

所以说,以后再辨析==与equal()方法时,要分情况辨析。

一道面试题:

    public static void main(String[] args) {
System.out.println((" String ").trim() == "String");
}

打印出的结果是false。

解析如下:

trim()方法,如果调用者两边都没有空白的话,会返回调用者本身,否则会调用substring()方法。substring()方法,如果从头截到尾,会返回调用者本身,否则会新生成一个String对象,调用的构造器是String(char value[], int offset, int count),第一个参数是字符数组。如此," String ".trim()会新生成一个String对象,与常量池中的"String"等等比较肯定返回false。

trim()和substring()两个方法具体实现如下:

    public String trim() {
int len = value.length;
int st = 0;
char[] val = value; /* avoid getfield opcode */ while ((st < len) && (val[st] <= ' ')) {
st++;
}
while ((st < len) && (val[len - 1] <= ' ')) {
len--;
}
return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
}
    public String substring(int beginIndex, int endIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
if (endIndex > value.length) {
throw new StringIndexOutOfBoundsException(endIndex);
}
int subLen = endIndex - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
return ((beginIndex == 0) && (endIndex == value.length)) ? this
: new String(value, beginIndex, subLen);
}

==与equals()方法的不同的更多相关文章

  1. List<T>Find方法,FindAll方法,Contains方法,Equals方法

    假如传入的T是一个类, List<MessageInfos> MessageInfos = new List<MessageInfos>(); MessageInfos= Me ...

  2. [java] 更好的书写equals方法-汇率换算器的实现(4)

    [java] 更好的书写equals方法-汇率换算器的实现(4) // */ // ]]>   [java] 更好的书写equals方法-汇率换算器的实现(4) Table of Content ...

  3. java中的equals()方法重写

    如何java中默认的equals方法跟实际不符的话,需要重写equals方法.例如: public class TestEquals { public static void main(String[ ...

  4. java提高篇(十三)-----equals()方法总结

    equals() 超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等.该方法的源码如下: public boolean equals(Object obj) { retu ...

  5. Java中“==”与equals方法的区别

    1. 用“==”比较两个变量,如果两个变量是基本类型变量,且都是数值类,则值相等就返回true 如果两个变量是引用型变量,则两个对象的地址一样,即指向同一个对象,则返回true 2.equals:St ...

  6. equals()方法

    equals()方法是根类Object中的一个方法,子类可以根据需要重写该方法(比如:String类). 一.Object类中的equals()方法实现如下: public boolean equal ...

  7. C#中==与Equals方法的区别

    using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Console ...

  8. java重写equals方法

    @Override public int hashCode() { return task.getId(); } @Override public boolean equals(Object obj) ...

  9. 重写Object类中的equals方法

    Object是所有类的父亲,这个类有很多方法,我们都可以直接调用,但有些方法并不适合,例如下面的student类 public class Student { //姓名.学号.年纪 private S ...

  10. java中hashCode方法与equals方法的用法总结

    首先,想要明白hashCode的作用,必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重 ...

随机推荐

  1. 判断一个数是否为2的n次幂

    参考:http://bbs.csdn.net/topics/370058619 如题,如何判断一个整数是否是2的N次方,我能想到的方法有两个 1.一直除2,看最后是否等于1.(最笨的方法) 2.转换成 ...

  2. LeetCode OJ 85. Maximal Rectangle

    Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and ...

  3. Chapter 15_0 模块和包

    通常,Lua不会设置规则,相反会提供很多强有力的机制来使开发者有能力实现出最适应的规则. 然而,这种方法对于模块就不行了.模块系统的一个主要目标是允许以不同的形式来共享代码. 但若没有一项公共的规则就 ...

  4. Python 邮件发送

    python发送各类邮件的主要方法   python中email模块使得处理邮件变得比较简单,今天着重学习了一下发送邮件的具体做法,这里写写自己的的心得,也请高手给些指点.     一.相关模块介绍 ...

  5. javascript动画效果之缓冲动画(修改版)

    在编写多块同时触发运动的时候,发现一个BUG, timer = setInterval(show, 30);本来show是一个自定义函数,当设为timer = setInterval(show(one ...

  6. 设M=5^2003+7^2004+9^2005+11^2006,求证8|M。(整除理论,1.1.8)

    设M=52003+72004+92005+112006,求证8|M. 证明: 前提:对于,52003让我们去构造8,即用8-3替换5 第一步:用8-3替换5,且仅替换一个, 第二步:进行分项,则前一项 ...

  7. 网页 HTML表单

    今天,我首先先学习了图片热点和在原来页面嵌入其他页面. 图片热点:<img src="" usemap="#ditu"/> <map name ...

  8. iOS解析后台返回的二进制图片

    UIEdgeInsets insets = {0,0,0,0}; [self.showidentifyButton setImageEdgeInsets:insets]; NSData *imageD ...

  9. Xcode调试之查看变量

    从其他开发语言转行进军IOS开发的小伙伴可能会有这样一件苦恼的事情,调试程序时如何查看变量值?我并不喜欢每次都要通过打印去查看变量的值,也不喜欢通过光标悬浮到变量上来显示变量的值,如果要查看变量的属性 ...

  10. 关于array_agg 函数

    今天一个客户问怎样把表中相同键值对应的文本按照一定顺序拼接起来.如果使用SQL实现将非常麻烦,并且效率低下.GP4.1以后提供了一个函数array_agg可以方便快捷,高效的实现该功能 比如原始查询是 ...