网站首页 > java教程 正文
如何在JAVA中比较字符串(string)?
我们有两个字符串a和b,如何比较它们呢?用==还是.equals()?
==和.equals()有什么区别
==比较的左右两侧的值。当左右两侧为基本类型的时候,直接比较值,当左右两侧为引用类型的时候,比较的是引用本身的值。字符串变量为引用类型,因此==比较的是字符串引用本身的值。
.equals()一般是java类中声明的比较方法,比较自己和另一个实例是否为同一个值。string类型已经实现了.equals()方法,会比较自身和另一个字符串是否相等。
为什么有时候==在相同字符串的时候会返回true
查看下列代码:
String val1 = "val";
String val2 = "val";
// 输出为 true
System.out.println(val2 == val1);
因为字符串在java中非常常用,出于性能和复用的考虑,代码中直接声明的字符串会直接在字符串常量池中初始化,而且只初始化一次,后续使用都会引用这个常量。
val1 = 常量池引用 -> 字符串(常量池中)
val2 = ↑
可以看到,val1和val2的是同一个值,因此val1 == val2会返回true。
但是,当代码变成下面这样的时候:
String val1 = "val";
String val2 = new String("val");
// 输出为 false
System.out.println(val2 == val1);
上面的val2会在堆中新建一个对象,而不是常量池的对象,如下所示:
val1 = 字符串常量池引用 -> 字符串本体(位于常量池中)
val2 = 字符串堆中对象引用 -> 字符串本体(位于堆中)
因此两个引用的值并不相等。
如何正确使用.equals()
在上面的第二个例子中,很明显两个字符串是一样的,但是直接用==会得出false的结果,这时候就要使用equals了。
但是,.equals()使用也有要注意的地方:
当一个字符串常量和一个字符串变量比较时,要保持常量在前面。比如"张三".equals(name),而不是name.equals("张三")。这样可以保证在name
为null时,仍然可以获得比较的结果,如果反着写,就会得到一个空指针异常了。
当两个变量比较时,最好使用Objects.equals,比如比较两个名字是否一样,可以写成Objects.equals(name1,name2)。Objects.equals会在内部调用对象的equals,并且会提前判断变量是否为空,防止出现空指针异常。
- 上一篇: Java中如何比较字符串?
- 下一篇: Java String 性能和优化
猜你喜欢
- 2024-11-27 正确理解和使用JAVA中的字符串常量池
- 2024-11-27 面试Java岗 Integer和String必问知识点,你必须精通
- 2024-11-27 JAVA基础&String&StringBuffered&StringBuilder
- 2024-11-27 Java 17 I/O StringWriter 篇
- 2024-11-27 高端面试必备:一个Java对象占用多大内存?
- 2024-11-27 Java基础类String学习分析
- 2024-11-27 懵了!面试官问我:String 长度有限制吗?是多少?
- 2024-11-27 扒开外衣仔细分析:String为什么不可变
- 2024-11-27 对象的内存布局,怎样确定对象的大小
- 2024-11-27 「Java技术探索」带你进入String类的易错点和底层本质分析
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)