java中的数据类型

基础数据类型

基础数据类型有byte、short、char、int、long、float、double、bool、String。除了 String 会比较地址,其它的基础类型的比较,使用 == 和 equals() 两者都是比较值。

  • String类的equals()方法源码

     public boolean equals(Object anObject) {
    if (this == anObject) { //先比较地址,如果相同直接返回true
    return true;
    }
    if (anObject instanceof String) {//如果地址不相同,判断要比较的对象是不是String实例,如果不是直接返回false
    String anotherString = (String) anObject;
    int n = value.length;
    if (n == anotherString.value.length) {//比较两个对象的长度,如果不相等直接返回false
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = 0;
    while (n-- != 0) {
    if (v1[i] != v2[i])
    return false;
    i++;
    }
    //比较两个string对象的每个字符,如果都相等,就返回true,有一个不相等就返回false
    return true;
    }
    }
    return false;
    }

    查看源码可知,String 类型的 equals 方法既会比较地址,也会比较字符串的每个字符(值).

  • String类型的equals()比较

     public class Main {
    public static void main(String[] args) {
    String name1 = new String("123");
    String name2 = new String("123");
    System.out.println(name1 == name2);//false
    System.out.println(name1.equals(name2));//true
    }
    }

    结果分析: name1 和 name2 是 String 的两个不同实例,name1==name2 是比较 name1 与 name2 的地址,所以返回 false。而 name1.equals(name2) 先是比较两者的地址,发现不同后接着比较两者的值,相同,所以返回 true。

复合数据类型(类)

  • Object类中equals()方法源码

     public boolean equals(Object obj) {
    return (this == obj);
    }

    查看源码可知,当自己定义的类如果不重写 Object 类中 equals() 方法时,调用 equals() 方法其实和直接用 == 判断的效果一样。

  • 未重写时

     public class Person {
    private String name; public Person(String name) {
    this.setName(name);
    } public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    }
    }

    Person.java

     public class Test {
    public static void main(String[] args) {
    Person person1 = new Person("zze");
    Person person2 = new Person("zze");
    System.out.println(person1 == person2);//false
    System.out.println(person1.equals(person2));//false
    }
    }
  • 重写时

     public class Person {
    private String name; public Person(String name) {
    this.setName(name);
    } public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    } @Override
    public boolean equals(Object obj) {
    if(obj instanceof Person){
    return this.name==((Person) obj).name;
    }
    return false;
    }
    }

    Person.java

     public class Test {
    public static void main(String[] args) {
    Person person1 = new Person("zze");
    Person person2 = new Person("zze");
    System.out.println(person1 == person2);//false
    System.out.println(person1.equals(person2));//true
    }
    }

结论

首先,基本数据类型与复合数据类型在内存中存储的的方式是不同的:

  • 基本数据类型在栈中存储的是值。
  • 复合数据类型在栈中存储的是地址,来指向堆内存的实例。

可以这样理解:使用 == 比较的时候都是比较变量中存储的值,但基础类型的变量中存储的值就是实际值,而复合数据类型变量中存储的值是指向堆对象的引用地址。而 equals() 方法就是一个依赖于 == 实现普通函数,只不过它的实现是在所有对象的基类 (Object) 中.

java中equals()和==的区别的更多相关文章

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

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

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

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

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

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

  4. java中.equals和==的区别?

    Java中的equals是十分重要的,和= =要区别开来,孙卫琴的JAVA面向对象编程一书对这个做了阐述,现在小结其主要内容,而且要将 = =和 equals列为重要的对比概念来学习 1.声明格式   ...

  5. (转)Java中equals和==的区别

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

  6. Java 中 Equals和==的区别(转)

    另外一篇参考: https://blog.csdn.net/striverli/article/details/52997927 在谈论equals和==的区别前,我们先简单介绍一下JVM中内存分配的 ...

  7. Java中equals和==的区别?为什么重写equals方法后,一定要重写hashCode方法?

    首先明确一点,equals是方法,==是操作符. 1. 如果比较的是基本数据类型: 只讨论==,因为equals是不存在的,因为java中基本数据类型不能调用method的. 2. 如果比较的是引用类 ...

  8. java中equals和==的区别详解

    java中的数据类型,可分为两类: 1.基本数据类型. byte,short,char,int,long,float,double,boolean这八大原始数据类型他们之间的比较,使用“==”,比较的 ...

  9. java中equals和"=="的区别

    "=="号,它比较的是一个对象在内存中的地址值, 比如2个字符串对象String s1 = new String("str");String s2 = new ...

  10. Java中equals和“==””的区别,String特殊

    public class TestString { /* * java中的数据类型,可分为两类: * 1.基本数据类型,也称为原始数据类型.byte,short,char,int,long,float ...

随机推荐

  1. Android 架构:Android Jetpack 架构组件的学习和分析

    参考:https://mp.weixin.qq.com/s/n-AzV7Ke8wxVhmC6ruUIUA 参考:https://jekton.github.io/2018/06/30/android- ...

  2. Atitit mysql 存储过程捕获所有异常,以及日志记录异常信息

    Atitit mysql 存储过程捕获所有异常,以及日志记录异常信息 1.1. 异常的处理模式exit  continue undo模式 1 1.2. 捕获所有异常使用        DECLARE ...

  3. [rook] rook的控制流

    以下是rook为一个pod准备可用块存储的过程: 1. rook operator运行,并且在k8s每台机器上运行一个rook agent的pod: 2. 用户创建一个pvc,并指定storagecl ...

  4. SSL SSH

    http://www.91ri.org/13679.html https://www.linux.com/blog/how-install-ssl-certificate-linux-server h ...

  5. 【C#】读取Excel中嵌套的Json对象,Json带斜杠的问题(其一)

    策划填Excel表时,约定对于复杂类型的数据采用Json的格式填写.如下图,D列的内容是Json数据. 单元格中的Json如下. { "name": "BeJson2&q ...

  6. 【转】Yelp是如何实现每天运行数百万个测试的

    Yelp每天要运行数百万个测试,确保开发人员提交的代码不会对已有的功能造成破坏.如此巨大规模的测试,他们是怎么做到的呢?以下内容翻译自 Yelp 的技术博客,并已获得翻译授权,查看原文 How Yel ...

  7. PHP 数组转XML 格式

    function buildXml( $data, $wrap= 'xml' ){ $str = "<{$wrap}>"; if( is_array( $data ) ...

  8. 【thinkphp5.1】 endroid/qrcode 二维码生成

    composer 链接: https://packagist.org/packages/endroid/qrcode 注意:PHP版本 要求 7.1+ 1. 使用 composer 安装 endroi ...

  9. 新Windows本地提权漏洞学习(CVE-2019-0841)

    1.这是一个啥漏洞? 睁眼一看,妈呀本地提权,快加入本地提权漏洞利用包里,速度加入.github连接我就不发了.担心被认为是传播黑客工具,咱们在这里单纯学习一下漏洞的原理和部分源代码. 2.文件读写权 ...

  10. JDBC driver for MySQL连接提示"The connection property 'zeroDateTimeBehavior' acceptable values are: 'CONVERT_TO_NULL', 'EXCEPTION' or 'ROUND'. The value 'convertToNull' is not acceptable."解决方案

    1.使用了8.0以上版本的JDBC driver for MySQL,降回5.x版本. 2.不对JDBC driver for MySQL降级.修改数据库连接字符串,添加serverTimezone属 ...