zoukankan      html  css  js  c++  java
  • java equals == contentEquals

    equals与== 经常用于比较,用法如下:字符串比较相同用equals,普通数值(基本数据类型)比较用==, contentEquals下面讲

    理论准备:

    java的基本类型如int.float,double等,执行int a = 5,时,在内存中直接存储的是5这个数字,而使用new关键字创建

    一个对象时比如String str = "123",内存中先储存的是一个引用变量str,他存储的是一个指向"123"这个对象的内存地址

    1. == 比较的是什么?

    == 比较的是数值本身,所以使用==比较基本类型

    对于非基本类型, == 比较的是他们的内存地址是否相同(即是否指向同一个对象)

    接下来看这段代码

     第一个为true的原因是因为字符串的缓冲池,创建s1的引用对象"123"时,将其放入了缓冲池中,所以当我们String s2="123";时

    是把s2这个引用指向了缓冲吃中的"123".所以s1与s2的内存地址相同,上面说了 == 对于非基本类型比较的是内存地址所以

    输出结果是true

    而第二个false是因为new关键字是创建新的对象,在内存的堆中创建了两个String对象,其值都是"123",s1,s2分别指向这两个对象

    所以s1与s2储存的内存地址依旧不同,此外由于上面已经在缓冲池中有了"123"这个对象,所以new String("123")只是在堆中创建对象

    不会把这个对象添加到缓冲池中

    第三个false,s1指向缓冲池中的"123",s2是在堆中又新创建了一个值为"123"的对象,二者内存地址当然不同,所以是false

    小结:可以看到只要使用new关键字创建字符串,就一定会在堆中创建一个新的对象,并检测缓冲池中是否有该对象,无则添加

    而直接赋值的方式创建字符串是把该对象(如果缓冲池中没有)添加到字符串缓冲池中.有则从缓冲池中返回该对象的引用

    2.equals

    默认的equals方法效果和==相同,有Object中的equals源码为证

     而一些类重写了该方法,比如String中的equals方法,使用String的equals方法时要注意,它比较的是字符串

    说明:这里的value指的字符数组,是他们拼接成的字符串,可以看到987行比较时是对字符数组的每一个值进行比较,也就是说String的equals比较的是

    字符串的内容是否相同,这与==作用于非基本类型时比较内存地址是不同的

     3.contentEquals 与equals

    contentEqualsn方法比较的是任何实现了CharSequence接口的对象,而equals源码里有一行代码(上图已标注,978行),

    所以equals方法比较的是字符串,只有要比较的对象是字符串并且内容相同时才会返回true

  • 相关阅读:
    go os/exec执行外部程序
    Go signals 信号
    选择注册协议
    全选功能
    字符限制
    JS 数字,金额 用逗号 隔开(数字格式化)
    placeholder 不支持IE修复
    JS设置弹出小窗口。
    IE 文档模式
    js报错:email() is not a function
  • 原文地址:https://www.cnblogs.com/tele-share/p/8060370.html
Copyright © 2011-2022 走看看