今天在写表达式求值的时候,发现了equals和==||!=和!equals()之间是不一样的。

我就从网上搜了搜关于这方面的知识,然后在下面做一个总结:

Java中有两类数据类型:

基本数据类型(Primitive Data Types)

其中:byte,short,char,int,long,double,boolean

他们用(==)、(!=)、(.equals())这三种方法进行比较的时候都是比较值

复合数据类型(Composite Data Types)

其中:String,数组,一般的类,接口等

下面我主要依靠String来比较==与.equals()的不同

当它们用==操作来进行比较时,比较的是它们在内存中的地址。

而当它们使用.equals()时,比较的是它们的值。

话不多说,先上代码

public class Test{
public static void main(String args[]){
String str1 = "Test";
String str2 = "Test"; System.out.println(str1==str2);
      System.out.println(str1.equals(str2));
}
}

运行后,输出:

true

true

下面我们对程序进行稍许改动,发现

public class Test{
public static void main(String[] args) {
String str1 = "Test";
String str2 = new String("Test"); System.out.println(str1==str2);
System.out.println(str1.equals(str2));
}
}

运行后,输出

false

true

这些是因为什么呢?

下面我们提到字符串缓冲池(String Buffer Pool)

程序在运行时会创建一个字符串缓冲池,在第一个程序中,str1和str2都等于"Test",程序会首先在这个字符串缓冲池中寻找有相同值的对象,因为str1那条语句先被执行,所以str2在后来创建的时候,就用了具有相同值str1的地址,所以str1==str2这个表达式才会返回true;

但是第二个程序就不同了,因为第二个程序使用了new关键字,在对空间中为str2分配了一个新的地址,所以在str1==str2就会返回false。

最后,再做一个简单的升华

Java中Object是所有类的基类,在Object中定义了这个.equals()方法,这个方法本身是用来比较对象的地址的。但是在String,Integer,Date等等类中,对.equals()方法进行了重写,所以我们在使用的时候,这个函数比较的就不再是它们的地址了,而是它们的value了。

by 一枝猪

Java中equals和==之间的区别的更多相关文章

  1. Java中equals和hashcode的区别?

    Java中equals和hashcode方法是在Object对象中的,所以每个对象都有这两个方法,大多数时候我们为了实现特定需求需要重写这两个方法 equals和hashcode方法常用在同一个类中用 ...

  2. (转)java中equals和等号(==)的区别浅谈

    java中的数据类型,可分为两类:1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==) ...

  3. java中equals和compareTo的区别---解惑

    大多转载自 百度知道,个人整理以便日后阅读. value1.compareTo(value2) == 0 value1.equals(value2) equals的效率高些,compareTo其实就是 ...

  4. 简述java中equals()方法和==的区别

    ==与equals的主要区别是: ==: ==常用于比较原生类型(基本数据类型):byte,short,char,int,long,float,double,boolean,比较的是他们的值. 若用= ...

  5. java中equals与==号的区别

    1.==号对于基本数据类型来说,比较的是值,对于引用数据类型来说比较的是地址值 2.equals方法在object类中,比较的是地址值,但是String类重写了Object类中的equals方法,所以 ...

  6. Java中equals与==和comparaTo的区别

    一.先说说Java中equals和==的区别: Java中的数据类型,可分为两类: 1.基本数据类型(也叫原始数据类型) 八大基本数据类型 char byte short int long doubl ...

  7. java中equals和==的区别 (转)

    java中equals和==的区别  值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...

  8. 【转】Java中equals和==的区别

    [转]Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boole ...

  9. 关于java中equals与==的区别的小实验

    java中equals与==经常容易混淆,简单一点说就是equals比较的是值是否相等,是一种方法,==比较的两个对象在JVM中的地址,是一种操作符. 做了几个小实验比较结果. 实验一: String ...

随机推荐

  1. 看完给跪了:技术大牛总结的Github与华为软件开发云完整对比

    华为软件开发云配置管理 服务和Github是国内外比较有代表性的代码托管平台,它们以git作为版本管理工具,使项目中身处各地的人员可以协同工作,主要操作涉及仓库.分支.提交.pull request等 ...

  2. nodejs 文件读取一行

    作者QQ:1095737364    QQ群:123300273     欢迎加入!   废话没有,直接上代码: app.get('/company', function (req, res, nex ...

  3. QtWebKit/QtWebEngine移植差异(网摘)

    QtWebKit/QtWebEngine移植差异 原文出处:[wiki.qt.io] This guide gives an overview of the differences between t ...

  4. MJExtension框架源码分析

    iOS开发中经常会用到数据和模型的互相转换,大致有两种转换方式:1.手动写转换的代码,2.利用开源库进行转换.常用的开源库有:JSONModel.Mantle.MJExtension.YYModel等 ...

  5. 2、粘包现象(struct模块)

    昨天我们所做的套接字是有漏洞的,它会出现粘包现象,没有发现这个问题的我们今天会进行演示.今天也会稍微讲解一下基于udp的套接字. 一.基于udp的套接字 udp是无链接的,先启动哪一端都不会报错 ud ...

  6. [Python] wxPython 状态栏组件、消息对话框组件 学习总结(原创)

    1.状态栏组件 1.基本介绍 上图: 红框框内的就是状态栏. 他可以分成若干个区块,比如上者分为了两个区块,并且比例是固定的,创建时可以指定 每个区块都能够显示 信息,一般通过 绑定事件 实时更新 各 ...

  7. APP软件半成品测试技巧

    由于现在产品类型的多样性,产品功能的先进性,更多体现在产品质量的稳定性和可靠性.软件应用的领域不断深入,设计的复杂程度逐步扩大,开发的周期不断缩短,质量的要求就逐渐提高.然而根据我们公司的版本迭代速度 ...

  8. Java 实现 Domino邮箱自动注册

    一.前提条件 Domino服务器需开通DIIOP服务 二.需要导入Java包 import lotus.domino.*; 三.实现Java代码 public void cerateID(MailPe ...

  9. Windows环境下Mysql如何快速导入或恢复表为innodb的数据

    注: 一.这个是对Innodb的数据恢复.MyISAM不需要这么麻烦,只要数据文件存在直接复制过去就可以. 二.该方法只适用于 1:想要恢复或者导入表的ibd文件和frm文件 2:你不仅需有ibd和f ...

  10. How to enable your website to public(set up your web server at home)

    As a so exciting dream, I would like set up my owned web site which can be accessed anywhere nomatte ...