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

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

目录

==二元运算符和equals方法

根据数据类型的不同(值类型、引用类型、空类型),==运算符对于“值类型”和“空类型”,是比较他们的值;对于“引用类型”,比较的是他们在内存中的存放地址,即是否指向指向同一个对象。

Java中所有类都是继承于Object。Object类定义equals方法,这个方法的初始行为是比较对象的内存地址。实现如下:

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

但有些类库对这个方法进行了重写,如String,Integer,Date等,而不再是比较堆内存中的存放地址。

String

String对equals进行重写,比较值是否相等。实现如下:

public boolean equals(Object anObject) {       if (this == anObject) {           return true;    }    if (anObject instanceof String) {           String aString = (String)anObject;        if (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);

由于==运算符对于“引用类型”仅比较是否指向同一片内存,所以new的两个String实例不相等。示例代码如下:

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

String包装器支持字面量赋值,当使用形如:stringInstance="xxx"方式创建字符串时,程序首先会在字符串缓冲池中寻找相同值的对象,如果池中无相同值的对象,则在池中添加一个值。所以以下代码值相等:

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

但也应注意,如果使用new的方式创建字符串示例,则使用==会认为两边不相等。示例代码如下:

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

Integer

为提高Integer等包装器的性能,Java引入缓存池。Integer有两种实例方式:new Integer(xxx) 与 Integer.valueOf(xxx) 。两者的区别在于:new Integer(xxx)方式每次都会新建一个对象;Integer.valueOf(123) 会使用缓存池中的对象,多次调用会取得同一个对象的引用。在 Java 8 中,Integer 缓存池的大小默认为 -128~127。一旦超出这个范围,则不会缓存整数值。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

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

Float和Double

Float和Double未提供缓存池实现。使用时要特别注意。Float相关实现如下:

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

参考

Java中equals和的区别

java:String使用equals和比较的区别
[Java]缓存池
<cnblogs.com/Pjson/p/8777940.html> 深入剖析Java中的装箱和拆箱(缓存池技术)

转载地址:http://ldvcz.baihongyu.com/

你可能感兴趣的文章
Nginx配置负载均衡到后台网关集群
查看>>
Nginx配置限流,技能拉满!
查看>>
Nginx配置静态代理/静态资源映射时root与alias的区别,带前缀映射用alias
查看>>
Nginx面试三连问:Nginx如何工作?负载均衡策略有哪些?如何限流?
查看>>
Nginx:NginxConfig可视化配置工具安装
查看>>
ngModelController
查看>>
ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
查看>>
ngrok内网穿透可以实现资源共享吗?快解析更加简洁
查看>>
NHibernate学习[1]
查看>>
NHibernate异常:No persister for的解决办法
查看>>
NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>