==

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

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. AOE 网络

    1.定义 如果在无向环的带权有向图中 - 用有向边表示一个工程中的活动 - 用边上的权值表示活动的持续时间 - 用顶点表示事件 则这样的有向图叫做用边表示活动的网络,简称AOE网络 AOE在工程方面非 ...

  2. LoadLibrary 失败 GetLastError 126

    这个错误可能是 Load的库依赖另外的库,而其依赖的库不存在,也会返回这个错误!

  3. 用 rebar 来构建、编译、测试、发布 Erlang 应用程序

    转自:http://dhq.me/build-compile-eunit-release-erlang-application-with-rebar rebar 是一个遵循 Erlang/OTP 原则 ...

  4. HTTPS科普扫盲帖【转】

    为什么需要https HTTP是明文传输的,也就意味着,介于发送端.接收端中间的任意节点都可以知道你们传输的内容是什么.这些节点可能是路由器.代理等. 举个最常见的例子,用户登陆.用户输入账号,密码, ...

  5. JavaScript 构造函数 prototype属性和_proto_和原型链 constructor属性 apply(),call()和bind() 关键字this

    1.构造函数: 通常构造函数首字母需要大写,主要是为了区别ECMAScript的其它函数.(高程三 P145) 构造函数与其他函数的唯一区别,就在于调用它们的方式不同.只要通过new来调用,任何函数都 ...

  6. 有关webapplicationcontext的初始化

    ApplicationContext是Spring的核心,Context我们通常解释为上下文环境,我想用“容器”来表述它更容易理解一些,ApplicationContext则是“应用的容器”了:在We ...

  7. CSS BFC(Block Formatting Context)

    BFC是 W3C CSS 2.1 规范中的一个概念Block Formatting Context的缩写即格式化上下文,它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用.简单讲,它是提 ...

  8. HDU 1969 Pie

    二分答案+验证(这题精度卡的比较死) #include<stdio.h> #include<math.h> #define eps 1e-7 ; double a[ff]; d ...

  9. Apriori算法-java

    package com.yang; import java.util.*; public class Apriori { private double minsup = 0.2;// 最小支持度   ...

  10. Loadrunner中参数和变量的使用

    //字符串复制strcpy(str,"Hello ") ; //字符串连接strcat(str,"World !");lr_message("str: ...