• 【java基础】说清楚equals和==


    equals和==到底在比较什么?

    我们知道在java中,一个对象包含两部分:对象地址对象本身。 

    equals比较的是对象本身是否相等。==比较的是对象地址是否相等。这句话是对的,但是下面我们还是要针对一些迷惑性的东西详细说一下。

    关于equals

    equals是一个比较函数,对象的比较一般都会重写equals方法。大家根据其equals方法解读即可,不做展开。

    关于==

    ==的比较这里主要从3个点来说:包装类型、String类型、引用类型

    引用类型:

    引用类型一般用equals比较。用==比较的话就是比较地址,没有缓存机制,不做展开。

    包装类型:

    即Integer、Byte、Short、Long、Float、Double、Character。Java为了提高性能,针对一些范围的取值,采用了缓存机制。缓存范围如下:

    • byte Byte -128–127
    • short Short -128–127
    • int Integer -128—127
    • long Long -128—127
    • float Float 不缓存
    • double Double 不缓存
    • char Character 0–127

    以Integer示例来说明:

            Integer n = 1;
            Integer m = 1;
            Integer nn = 1000;
            Integer mm = 1000;
            // true -128~127缓存机制
            System.out.println("n==m?" + (n == m));
            // false 没有缓存机制
            System.out.println("nn==mm?" + (nn == mm));

    String类型

    String类是不可变的(final),对String类的任何改变,都是返回一个新的String类对象。 String 对象是 System.Char 对象的有序集合,用于表示字符串。String 对象的值是该有序集合的内容,并且该值是不可变的。
    这样的话把String类的引用传递给一个方法,该方法对String的任何改变,对原引用指向的对象没有任何影响,这一点和基本数据类型相似。 
    String是不可改变的,为了提高效率Java引用了字符串池的概念,例如new String("abc");首先会在String池中创建一个对象“abc”
    因为有NEW的 存在所以会分配地址空间copyString池的内容。当出现的String对象在String池中不存在时即在String池中创建该对象。

    以代码来说明

            String s1 = "a";
            String s2 = "b";
            String s3 = "ab";
            String s4 = "ab";
            // true 他们都指向了同一个缓冲池内的地址
            System.out.println("s3==s4? " + (s3 == s4));
    
            String s5 = "a" + "b";
            //true 因为相加的两个为常量所以编译器会把s5="a"+"b"优化为s5="ab"
            System.out.println("s3==s5? " + (s3 == s5));
    
            String s6 = s1 + s2;
            //false 因为是两个变量的相加所以编译器无法优化,
            // s1+s2即等同于
            // (new StringBuilder(String.valueOf(s1))).append(s2).toString();
            // 在运行时,会有新的String地址空间的分配,而不是指向缓冲池中的“ab”
            System.out.println("s3==s6? " + (s3 == s6));
    
            //false 根据缓冲池的定义在new的时候实际会新分配地址空间,s7指向的是新分配 
            //的地址空间所以与缓冲池地址不同
            String s7 = new String("ab");
            System.out.println("s3==s7? " + (s3 == s7));
    
            final String s8 = "a";
            final String s9 = "b";
            String s10 = s8 + s9;
            //类似于s3与s5,因为是final类型编译器进行了优化所以相同。
            System.out.println("s3==s10? " + (s3 == s10));
  • 相关阅读:
    PHP IDE NetBeans代码主题和除掉竖线解决方案
    初识Python
    从LazyPhp说起
    从Pycharm说起
    准备系统地研究一下"高性能网站开发",挑战很大,希望能坚持到底!
    IIS日志分析[资源]
    见一好东西:Threaded WebDownload class with Progress Callbacks
    ASP.net Application 中使用域用户登录
    看图找错
    汉字转拼音缩写的函数(C#)
  • 原文地址:https://www.cnblogs.com/kbian/p/12396411.html
Copyright © 2020-2023  润新知