String比较相等的问题探索
2016-02-01 20:04
211 查看
String比较相等的问题探索
工作上,有个同事犯了个低级错误,把字符串的计较用了==。由于代码已经交付客户,上了生产环境,给公司带了了损失。于是看了他的代码,自己根据以前学的知识,写了几个小demo,加深自己对字符串比较的认识。
例1:
!java
public static void main(String[] args) {String string= "";
if (string=="") {
System.out.println("相等");
} else {
System.out.println("不等");
}
}
run:
相等
例2:
#!java
public static void main(String[] args) {
String string= new String("");
if (string=="") {
System.out.println("相等");
} else {
System.out.println("不等");
}
}
run:不等
上面两例说明,String是对象,对象用==是比较的地址,例一之所以相等,是因为如果用赋值的方式来定义字符串,如果这个字符串已经定义过了,则字符串常量池中已经有此字符串了,就不会再重新生成一个。如果字符串常量池中没有此字符串,就会生成一个。例2的方式,是先在堆内存新建了个对象,对象里存有指向字符串常量池的地址(字符串在常量池的生成和上面原理一样)。也就是说例2中的对象地址不等于字符串的地址。
但是如果我们用String自带的equals方法,就不会出现这种情况。字符串的equals方法重写了Object的equals方法,比较的是内容。所以
我们在开发中,比较字符串都是用equals方法。
相关文章推荐
- 记录数据库操作到文本
- Redis工作系列之一 与 Memcached对比理解
- iOS深度学习 - Runtime
- Qt国际化(Q_DECLARE_TR_FUNCTIONS() 宏给非Qt类添加翻译支持,以前没见过QTextEncoder和QTextDecoder和QLibraryInfo::location()和QEvent::LanguageChange)
- Java中对象调用机制
- Javascript学习笔记6——BOM
- android *** Layout 11 ProgressBar && RatingBar && SeekBar
- T-SQL:GO语句和批处理
- (2)Mac环境搭建
- usleep和sleep的区别
- 如何在eclipse中配置arm交叉编译环境
- Andorid-15k+的面试题。
- 一个驱动支持多个设备再usb子系统、input子系统、platform、iic子系统 中的实现
- Appcan学习手记(2)——UI框架及布局定位
- MySQL存储过程
- Qt国际化相关类(以前没见过codec->toUnicode,QTextCodec,QLocale.toString和QLocale::setDefault,QInputMethod::locale())
- 第二次作业<2>
- eclipse 启动 tomcat 应用,报告 class-path 下的某个 properties 文件找不到
- 使用rebar编译lager,deps列表,lager要放到第一位。
- (1)架构和目录结构