==与equals()方法的不同
==
==比较分为两种情况:基本数据类型比较与引用数据类型比较
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()方法的不同的更多相关文章
- List<T>Find方法,FindAll方法,Contains方法,Equals方法
假如传入的T是一个类, List<MessageInfos> MessageInfos = new List<MessageInfos>(); MessageInfos= Me ...
- [java] 更好的书写equals方法-汇率换算器的实现(4)
[java] 更好的书写equals方法-汇率换算器的实现(4) // */ // ]]> [java] 更好的书写equals方法-汇率换算器的实现(4) Table of Content ...
- java中的equals()方法重写
如何java中默认的equals方法跟实际不符的话,需要重写equals方法.例如: public class TestEquals { public static void main(String[ ...
- java提高篇(十三)-----equals()方法总结
equals() 超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等.该方法的源码如下: public boolean equals(Object obj) { retu ...
- Java中“==”与equals方法的区别
1. 用“==”比较两个变量,如果两个变量是基本类型变量,且都是数值类,则值相等就返回true 如果两个变量是引用型变量,则两个对象的地址一样,即指向同一个对象,则返回true 2.equals:St ...
- equals()方法
equals()方法是根类Object中的一个方法,子类可以根据需要重写该方法(比如:String类). 一.Object类中的equals()方法实现如下: public boolean equal ...
- C#中==与Equals方法的区别
using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Console ...
- java重写equals方法
@Override public int hashCode() { return task.getId(); } @Override public boolean equals(Object obj) ...
- 重写Object类中的equals方法
Object是所有类的父亲,这个类有很多方法,我们都可以直接调用,但有些方法并不适合,例如下面的student类 public class Student { //姓名.学号.年纪 private S ...
- java中hashCode方法与equals方法的用法总结
首先,想要明白hashCode的作用,必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重 ...
随机推荐
- git 恢复丢失的文件
务必进入当前controller下面,才能恢复 git checkout HEAD TestController.class.php
- Hibernate配置文件的hbm2ddl.auto属性
今天遇到一个有意思的问题,我目前做的一个网站采用Spring MVC + Spring + Hibernate的架构,我通过页面插入了一些数据到数据库,可是每次重启tomcat之后,数据都莫名其妙地丢 ...
- jbpm4.3表结构和表字段说明
整体说明: JBPM4_DEPLOYMENT 流程定义表JBPM4_DEPLOYPROP 流程定义属性表 JBPM4_EXECUTION 流程实例表JBPM4_HIST_ACTINST 流程活动 ...
- HDU 1969 Pie(二分搜索)
题目链接 Problem Description My birthday is coming up and traditionally I'm serving pie. Not just one pi ...
- append()常见错误
实例1 empty = [] print empty.append("Hi") 输出None print empty 输出["Hi"] 错误: 直接打印变量带a ...
- Mac 命令行中进入带有空格的文件夹
http://blog.sina.com.cn/s/blog_5e8392b10100jkvg.html 今天在公司用mac的时候,有个文件夹的名字有空格,怎么都进不去,在网上一查原来不能直接cd 文 ...
- k个区间相交的段落数 Educational Codeforces Round 4 D
http://codeforces.com/contest/612/problem/D 题目大意:给你n个区间,这n个区间会有相交的部分,如果一个区间相交的部分>=k,那么就把这个区间记录下来. ...
- Python基础学习笔记---5.输入\输出 I\O文件操作目录
在很多时候,你会想要让你的程序与用户(可能是你自己)交互.你会从用户那里得到输入,然后打印一些结果.我们可以分别使用 raw_input 和 print 语句来完成这些功能.对于输出,你也可以使用多种 ...
- C语言_函数【转】
引用地址:http://baike.baidu.com/link?url=U9h6MccLYX2w5uyVOqIFd3eps5gR2FZA10jYRLRnc66Ff_F5ZrmXGKA12DT-_2x ...
- c语言-三字符组
C 源程序源字符集在 7 位 ASCII 字符集中包含,但设置为 ISO 646-1983 固定的代码的超集. 三字符序列允许 C 程序编写使用 " 仅 ISO (国际标准组织的固定的代码. ...