zoukankan      html  css  js  c++  java
  • (1)== 和 equals 的区别是什么?

    Java数据类型分为:

             基本数据类型

             复合数据类型(包装类是基本数据类型的引用类型也属于复合数据类型)

    基本数据类型:

          byte,short,int,long,float,double,char,boolean 

    复合数据类型:

           包装类:Byte ,Short,Integer,Long,Float,Double,Character,Boolean

           对象:var obj ={"name":"xiaoming"}

           数组: var objarr = ["1","2","3"]

           函数:function f(){}

    转:https://blog.csdn.net/qq_35001600/article/details/82889515 

    1)基本数据类型之间比较用 == 且比较值,而复合数据类型 == 比较的时候两对象的地址值是否一致,所以除非是同一个new出来的对象,结果为true,否则为false。

    2)对于equals() 由于java中所有类都继承与Object基类,在Object类中定义了一个equals(),该方法初始化是比较对象的内存地址。

    但在一些类中重写了这个方法,如包装类String,Date等,equals()比较的是两个变量的值。

    ·String

    创建String对象的两种方式比较他们的==和equals会有不同的效果

    String s1=”sss”;

    String s2=new String(“sss”);

    System.out.println(s1.==s2);

    System.out.println(s1.equals(s2));

    输出结果:false

                  true

    研究这个结果就需要了解一下String对象的创建机制。

       

    String s1=”sss”;这种创建方式在内存中的过程是在方法区的常量池中创建一个”sss”字面值 ,然后之后由这种创建方式的变量都由栈中指向这个地址,所以只要值一样,变量之间==为true;

    而String s2=new String(“sss”);这种创建方式的过程具体是在堆中创建一个新的对象,所以在和值一样的变量比较==时为false,但是只要值一样的话.equals()还是为true的。

    String中还有个特殊的地方就是使用+号拼接得到的结果如果值和某变量值一致,不代表两变量地址一致,如果拼接的是一个字面值,则指向同一个值的常量池地址,两变量地址一致。但如果拼接的是一个变量相当于新建了一个对象,地址指向堆,所以即使值一致,地址也不一样。

    最后String中有个intern()方法。

    这个方法的作用是在常量池中检查是否有和该字符串相同的值,如果有,则返回常量值,若没有就创建该常量值,并返回。所以通过intern()得到的值会和指向同一个常量池值的变量地址一致且值一致

    针对String简单的总结一下:

    ①只要不新建对象,值相同地址一般相等

    ②String身为一个不可变值,对字符串的操作会新建一个对象。

    ③拼接时关注字符串是否新建对象

    ·包装类

    当包装类和基本类型进行”==”比较时,包装类会自动拆箱为基本数据类型再进行比较。而字面值的地址都指向常量池,值相同地址相同。

    两个相同包装类型的对象进行equals()比较时,equals()会先比较类型,如果类型相同再比较值,二者同时成立为true

    两个基本类型没有equals()比较方法

    包装类调用equals(),但是参数是基本类型,这时候会先进行自动装箱,基本类型转换为其包装类,先判断类型,再判断值,二者都成立时结果为true

    以Integer为例讨论一下直接赋值的情况下两变量的==结果和equals()值:

    例:Integer i1=123;

    Integer i2=123;

    System.out.println(i1==i2);

    输出结果:true

    因为Integer对象在编译期会自动拆箱(该特性在jdk1.5之后)。

    例:Integer i1=200;

    Integer i2=200;

    System.out.println(i1==i2);

    输出结果为:false

    这个记过就很神奇,和上一个例子明明一样为什么结果不一样。这是因为Integer自动拆箱的过程:Integer i1=200在编译期会调用一个叫valueOf()的静态方法

     

    由此可知,cache是一个数组,规定了整型在[-127,128]这个范围。超过这个范围的值就会在堆内存中创建一个新的对象,两对象地址不同。

    针对Integer简单总结一下:

    ①无论如何Integer变量不会和新创建的对象相等。

    ②Integer在==比较时会在编译时期自动拆箱。

  • 相关阅读:
    Redis学习六(java中使用redis)
    Redis学习五(新数据类型)
    Redis学习四(发布和订阅)
    Redis学习三(配置文件说明)
    Redis学习二(常用五大数据类型)
    Redis学习一(源码安装redis)
    RocketMq常见问题记录
    总结多种容器化技术对比
    关于Redis集群部署和持久化的相关问题
    配置Jenkins连接kubernetes的Pod Template模板
  • 原文地址:https://www.cnblogs.com/baimh/p/11220708.html
Copyright © 2011-2022 走看看