Java中equals与==和comparaTo的区别
一.先说说Java中equals和==的区别:
Java中的数据类型,可分为两类:
1.基本数据类型(也叫原始数据类型)
八大基本数据类型 char byte short int long double float boolean
2.引用数据类型(也就复合数据类型)除了上面的8个,其他都是引用数据类型
区别:
基本数据类型比较只能用==,不能用equals,因为用equals(参数),参数必须为对象。
他们之间的比较,比较的是他们的值。
public class Test {
public static void main(String[] args) {
int a = 1;
int b = 1;
System.out.println(a == b);
}
}
当引用类型用(==)进行比较的时候
比较的是他们在内存中的存放地址,除非地址一样,否则比较后结果为false。
public class Test {
public static void main(String[] args) {
A a1 = new A();
A a2 = new A();
System.out.println(a1 == a2);// false
A a3 = a1;
System.out.println(a1 == a3);//true
}
}
class A {
}
Java当中所有的类都是继承于Object这个基类的,equals的方法在在Object中定义,这个方法的初始行为是比较对象的内存地址(如上面的例子),因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟用双等号(==)的结果相同。
Object里面的equals方法:
public boolean equals(Object obj) {
return (this == obj);
}
但是一些类中这个方法被重写了,如String,Integer,Date重写后的equals不再是比较对象在内存的存放地址了,而是比较的内容。
以String为例,equals方法代码为:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
举个例子:
public class Test {
public static void main(String[] args) {
Integer a = new Integer(1);
Integer b = new Integer(1);
System.out.println(a.equals(b));// true
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1.equals(s2));// true
}
}
上面的例子仅仅是纯比较而言的,如果中间加入其它代码,还是可以改变的。
二.比较String中comparaTo和equals的区别
只有实现了Comparable的类才有comparaTo方法,里面只有这一个方法。
package java.lang;
import java.util.*;
public interface Comparable<T> {
public int compareTo(T o);
}
String实现了Comparable接口的类,所以compareTo为String的方法。
public class Test {
public static void main(String[] args) {
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1.equals(s2));// true
System.out.println(s1.compareTo(s2));// 0
String s3 = new String("abc");
String s4 = new String("abca");
String s5 = new String("abcde");
String s6 = new String("abcd");
System.out.println(s3.compareTo(s4));// -1
System.out.println(s5.compareTo(s6));// 1
System.out.println(s5.compareTo(s4));// 3
System.out.println(s4.compareTo(s5));// -3
}
}
区别:
通常compareTo用来比较大小的 而equals是比较是否相等的。
同比之下,equals的效率高,因为compareTo是按字典顺序比较两个字符串。也就是按顺序比较字符串中各个字符的 Unicode值。
compareTo时:
当相同时:返回int 0;当小于时,如果此位为空,如果少一位,则返回-1,否则返回Unicode差值,当大于时,如果参数对应位为空,如果多一位,则为1,否则为差值。
Java中equals与==和comparaTo的区别的更多相关文章
- (转)Java中equals和==、hashcode的区别
背景:学习辉哥总结的基础知识,从头来,直面短板. 1 问题引入及分析 请看下面的代码清单1 @Test public void test01() { String a = "a" ...
- java中equals方法和contentEquals方法区别
java中,String类里提供了两种字符串的比较方式(算上“==”应该是三种) String line1 = new String("0123456789"); String l ...
- Java中equals,hashcode,==的区别
== :比较java栈局部变量表中变量的地址或值是否相等. equals : 比较变量的地址在java堆中引用对象是否为同一个对象. hashcode : 通过对象在JVM内存中的存储地址通过特定算 ...
- java中equals,hashcode和==的区别
https://www.cnblogs.com/kexianting/p/8508207.html
- java中equals和==的区别 (转)
java中equals和==的区别 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...
- 【转】Java中equals和==的区别
[转]Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boole ...
- 关于java中equals与==的区别的小实验
java中equals与==经常容易混淆,简单一点说就是equals比较的是值是否相等,是一种方法,==比较的两个对象在JVM中的地址,是一种操作符. 做了几个小实验比较结果. 实验一: String ...
- Java中equals和hashcode的区别?
Java中equals和hashcode方法是在Object对象中的,所以每个对象都有这两个方法,大多数时候我们为了实现特定需求需要重写这两个方法 equals和hashcode方法常用在同一个类中用 ...
- 深入探究Java中equals()和==的区别是什么
目录 相等判断符"==" "=="判断基本类型数据 "=="判断引用类型数据 相等判断方法equals() 思考:为什么要设计equals( ...
随机推荐
- tomcat的CATALINA_HOME可以不用设置
不配置tomcat的环境变量也是可以运行的 用记事本打开tomcat/bin目录下面的startup.bat 在文本的前一部分有下面的脚本代码 rem Guess CATALINA_HOME if n ...
- nodejs研究笔记
首先呢,安装 1:安装mongodb-win32-x86_64-3.2.5-signed.msi 2:手动创建目录 如 C:\data\db 及 C:\data\dbConf 3:管理员身份运行 cm ...
- 用户行为数据采集核心思维(APP、web数据采集/埋点)
关于数据采集(也就是所谓的埋点),有很多中形式,或者说方法.所有的数据采集都时围绕一个核心的三个点来做区别的处理. 数据采集核心思维三个点: 1.对象: 要采集谁,一个页面.一个按钮,页面或者按钮,就 ...
- SQL Server 查出未提交事务(长事务)SQL
),value )); INSERT INTO @tab EXEC('DBCC OPENTRAN WITH TABLERESULTS'); SELECT name,CAST(value AS DATE ...
- express 转
目录 此文重点介绍Express3.0的开发框架,其中还会涉及到Mongoose,Ejs,Bootstrap等相关内容.Express已经升级到4.x,请同时参考文章,Node.js开发框架Expre ...
- 设置代码Code高亮显示成蓝色
下面方法是让设置的关键字高亮显示,考虑到了注释与字符串的影响,所以备用,以便将来能够用到. private static void ColorizeCode(RichTextBox rtb) { st ...
- JS与Jquery学习笔记(二)
一. JS 的面向对象 JS没有类,其类就用function来代替如下所示: function Cat(name, color){ this.name=name; this.color=color; ...
- 写好Hive 程序的若干优化技巧和实际案例
使用Hive可以高效而又快速地编写复杂的MapReduce查询逻辑.但是一个”好”的Hive程序需要对Hive运行机制有深入的了解,像理解mapreduce作业一样理解Hive QL才能写出正确.高效 ...
- 如何给澳洲路局写信refound罚金,遇到交通罚款怎么办
在澳洲,100%的司机收到过罚单,包括停车,超速,闯红灯等等,其罚金一般都在200-500之间,当然其单位是AUD.所以,对大多数留学生来说,收到罚金意味着一个礼拜要吃吐了. 本人就收到过一次超速罚单 ...
- ASP.Net MVC跳转,分为form的submit提交跳转和ajax跳转
1,用jquery ajax跳转的话,需要在前台用window.location("跳转网址")来跳转,在success后使用 2,用原声的form的submit来跳转,如下图 3 ...