==与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. 前者集合内的元素是有序的,元素可以重 ...
随机推荐
- JavaScript基础知识复习
1,javascript是基于对象和事件驱动的,并有安全性能的脚本语言: 2,javascript的特点: 1)向HTML中添加交互事件: 2)脚本语言,与java语法类似: 3)解释性语言,边执行边 ...
- 广播与P2P通道(下) -- 方案实现
在广播与P2P通道(上) -- 问题与方案 一文中,我们已经找到了最优的模型,即将广播与P2P通道相结合的方案,这样能使服务器的带宽消耗降到最低,最大节省服务器的宽带支出.当然,如果从零开始实现这种方 ...
- 2014web面试题
面试题目会根据你的等级和职位变化,入门级到专家级:范围↑.深度↑.方向↑; 类型: 技术视野.项目细节.理论知识型题,算法题,开放性题,案例题. 进行追问,可以确保问到你开始不懂或者面试官开始不懂为止 ...
- phpstudy 相关配置
在/etc/my.cnf中 添加 expire_logs_days=5 phpstudy add list del
- NOIP2011-普及组复赛-第二题-统计单词数
题目描述 Description 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给 ...
- SQL函数学习(一):substring()函数
秒懂例子: substring('98765',-1,3) 结果:9 substring('98765',0,3) 结果:98 substring('98765',1,3) 结果:987 在操作sql ...
- HDU - 5547 Sudoku(数独搜索)
Description Yi Sima was one of the best counselors of Cao Cao. He likes to play a funny game himself ...
- SQL IO监控
DBCC DROPCLEANBUFFERS --清空缓存 SET STATISTICS IO { ON | OFF } SET STATISTICS TIME { ON | OFF }
- git远程分支--remote
查看所有远程引用: $ git ls-remote From ssh://someone@example/testgit ebf3ef7551603cd57a699e80db0bfab36d1aa7b ...
- petstore-jdbc
拖了好多天,终于决定开始写作业了,搞了大半天的把软件安好. jdk(安装与环境配置) Tomcat(安装与环境配置) mysql(安装,同时配置图形化操作界面) eclipse for Javaee ...