博客
关于我
equals和==
阅读量:501 次
发布时间:2019-03-07

本文共 2262 字,大约阅读时间需要 7 分钟。

==二元运算符和equals方法==

在Java中,==运算符在不同数据类型之间有不同的行为。对于值类型和空类型,==运算符比较的是它们的值;而对于引用类型,则比较的是对象在内存中的存放地址,即是否指向同一个对象。

所有Java类都继承自Object类,而Object类定义了一个默认的equals方法,该方法最初的实现是比较对象的内存地址:

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

然而,许多类库都对这个方法进行了自定义实现,例如String、Integer、Date等。这些类重写了equals方法,使其比较的是对象的值而非内存地址。

String

String类对equals方法进行了重要的重写,改进了字符串的比较逻辑。现如今,String的equals方法主要用于比较字符串的文本内容,而非内存地址。以下是String的equals实现:

public boolean equals(Object anObject) {    if (this == anObject) {        return true;    }    if (anObject instanceof String) {        String aString = (String) anObject;        if (this.coder() == aString.coder()) {            return isLatin1() ? StringLatin1.equals(value, aString.value)                : StringUTF16.equals(value, aString.value);        }    }    return false;}

由于String重写了equals方法,下面的代码将返回true:

String str1 = new String("123");String str2 = new String("123"); // truestr1.equals(str2);

相反,使用==运算符比较两个String对象时,返回false:

String str1 = new String("123");String str2 = new String("123"); // falsestr1 == str2;

需要注意的是,当使用字面量赋值(如String str1 = "123";)创建String对象时,字符串将被缓存池重复使用。因此,str1 == "123"会返回true:

String str1 = "123"; // truestr1 == "123";

然而,如果使用new String("123")创建对象,则无法通过==运算符比较:

String str1 = new String("123"); // falsestr1 == "123";

Integer

为了提高Integer等包装器的性能,Java引入了缓存池技术。Integer有两种实例化方式:new Integer(x)和Integer.valueOf(x)。前者每次都会创建新的对象,而后者会从缓存池中获取现有的对象实例。

以下是Integer的valueOf方法实现:

public static Integer valueOf(int i) {    if (i >= IntegerCache.low && i <= IntegerCache.high) {        return IntegerCache.cache[i + (-IntegerCache.low)];    }    return new Integer(i);}

Short和Long

Short和Long类也采用了类似的缓存池策略。它们的valueOf方法实现如下:

public static Short valueOf(short s) {    final int offset = 128;    int sAsInt = s;    if (sAsInt >= -128 && sAsInt <= 127) {        return ShortCache.cache[sAsInt + offset];    }    return new Short(s);}public static Long valueOf(long l) {    final int offset = 128;    if (l >= -128 && l <= 127) {        return LongCache.cache[(int) l + offset];    }    return new Long(l);}

Float和Double

Float和Double没有提供缓存池实现,因此在使用这些类型时需要特别注意。它们的valueOf方法实现如下:

public static Float valueOf(float f) {    return new Float(f);}public Double(double value) {    this.value = value;}

参考资料

  • Java中equals和==的区别
  • Java的装箱和拆箱
  • 你可能感兴趣的文章
    python语言:装饰器原理
    查看>>
    Python 交互式数据可视化详解
    查看>>
    python语言有哪些优点和缺点_Python有哪些优缺点,你了解吗?
    查看>>
    Python 从入门到精通:30天速成教程到底有多狠?你能坚持下来吗?
    查看>>
    Python 从数据库中存储和检索密码的最安全方法
    查看>>
    Python语言及其应用 - 知识点遍历
    查看>>
    Python 优化提速的 8 个小技巧
    查看>>
    Python 余弦相似度与皮尔逊相关系数 计算
    查看>>
    python 使用execjs 报编码错误解决办法,UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xac in position 145: il
    查看>>
    python 使用filetype校验文件
    查看>>
    Python 使用flush函数将缓冲区数据立即写磁盘
    查看>>
    python 使用in判断不准确,in不好使
    查看>>
    Python 使用pandas 进行查询和统计详解
    查看>>
    Redis 配置文件redis.conf详细解释
    查看>>
    python网络爬虫(2)——scrapy框架的基础使用
    查看>>
    python网络爬虫实例教程试读_Python网络爬虫实战教程(全套完整版) - 学途无忧网 - 做技术的王者 - Powered By EduSoho...
    查看>>
    Python 使用哈希函数用于加密
    查看>>
    Python 依赖管理的革新——Poetry 深度解析
    查看>>
    python 保留精度及增加去除数字的千位分隔符(金额化数字)
    查看>>
    python 倒计时 9,8,7,。。。。。。0
    查看>>