大家好,欢迎来到IT知识分享网。
一、引入
以前将字符串比较的时候我们都是使用 ==
来比较的,如果是一样的,结果就是 true
,如果不一样,结果就是 False
。
那如果我们要比较的字符串,一个是 new
出来的,还有一个是直接赋值的,这个时候 s1
跟 s2
比较的结果是真还是假呢?
在这里我们就要来剖析一下 ==
号比较的原理。
二、==
号比的到底是什么?
1)介绍
这个问题需要分情况讨论的。
如果比较的是左边的基本数据类型,它比较的就是具体的值。
如果是左边的引用数据类型,这个时候 ==
号比较的是地址值。由于每一次 new
出来的都是新的小空间,因此 s1
和 s2
的地址值肯定不相同,所以这里的结果就是 false
。
2)示例代码1
来看下面的代码,由于下面是直接赋值的,直接赋值的字符串是在串池中的。
所以在这里它会去检查串池中有没有 'abc'
,第一次创建 s1
的时候肯定没有,所以它会在串池中创建一个新的 "abc"
。
第二次创建 s2
的时候,也是直接赋值的,它同样也会去串池检查,但是这次已经有了 "abc"
,这个时候它不会创建新的,而是会复用。所以在这个情况下,s1
跟 s2
记录的地址值是一样的,所以这里的结果就是 true
。
String s1 = "abc"; String s2 = "abc"; System.out.println(s1 == s2); // true
3)示例代码2
首先 s1
是 new
出来的,它就会在堆里开辟一个小空间。
而 s2
不是 new
的,它是直接赋值的,所以 s2
中的 "abc"
是在串池里面的。
因此上面的 s1
记录的是堆里面的地址,而下面的 s2
记录的是串池里面的地址。这两个记录的地址值所在的位置都不一样,结果肯定是 false
String s1 = new String("abc"); String s2 = "abc"; System.out.println(s1 == s2); // false
三、字符串的比较
在字符串中,Java提供了两个比较方法。在调用方法的时候我们需要传入要比较的字符串,它会有一个布尔类型的结果,如果返回 true
,就表示两个字符串是一致的;如果返回 false
,就表示两个字符串是不一致的。
boolean equals方法(要比较的字符串)
—— 完全一样结果才是true
,否则为false
例如当我们比较
用户名和密码
的时候,用户名和密码需要完全一模一样,这个时候我们就会使用equals
进行比较boolean equalsIgnoreCase(要比较的字符串)
—— 忽略大小写的比较例如我们需要比较
验证码
的时候就可以忽略大小写,此时就可以使用equalsIgnoreCase
。
代码示例1
package com.itheima.stringdemo; public class StringDemo2 {
public static void main(String[] args) {
//1.创建两个字符串对象 String s1 = new String("abc"); String s2 = "Abc"; //2.==号比较 //基本数据类型:比的是数据值 //引用数据类型:比的是地址值 System.out.println(s1 == s2);//false //3.比较字符串对象中的内容是否相等 boolean result1 = s1.equals(s2); System.out.println(result1); //4.比较字符串对象中的内容是否相等,忽略大小写 //忽略大小写只能是英文状态下的a A,涉及到英文就不行了,例如:1 一 壹 这不行 boolean result2 = s1.equalsIgnoreCase(s2); System.out.println(result2);//true } }
代码示例2
package com.itheima.stringdemo; import java.util.Scanner; public class StringDemo3 {
public static void main(String[] args) {
//1.假设我现在键盘录入一个abc Scanner sc = new Scanner(System.in); System.out.println("请输入一个字符串"); String str1 = sc.next();//abc,键盘录入得到的这个字符串是 `new` 出来的! //2.代码中再定义一个字符串abc String str2 = "abc"; //3.用==比较,这两者能一样吗? System.out.println(str1 == str2);//4.答案为false,一个是在堆中,一个是在串池中,肯定地址不一样! } }
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/131246.html