【Java】字符串的比较

【Java】字符串的比较这个问题需要分情况讨论的

大家好,欢迎来到IT知识分享网。

一、引入

以前将字符串比较的时候我们都是使用 == 来比较的,如果是一样的,结果就是 true,如果不一样,结果就是 False

image-20240407103027211

那如果我们要比较的字符串,一个是 new 出来的,还有一个是直接赋值的,这个时候 s1s2 比较的结果是真还是假呢?

在这里我们就要来剖析一下 == 号比较的原理。


二、== 号比的到底是什么?

1)介绍

这个问题需要分情况讨论的。

如果比较的是左边的基本数据类型,它比较的就是具体的值。

如果是左边的引用数据类型,这个时候 == 号比较的是地址值。由于每一次 new 出来的都是新的小空间,因此 s1s2 的地址值肯定不相同,所以这里的结果就是 false

image-20240407103358529


2)示例代码1

来看下面的代码,由于下面是直接赋值的,直接赋值的字符串是在串池中的。

所以在这里它会去检查串池中有没有 'abc',第一次创建 s1 的时候肯定没有,所以它会在串池中创建一个新的 "abc"

第二次创建 s2 的时候,也是直接赋值的,它同样也会去串池检查,但是这次已经有了 "abc",这个时候它不会创建新的,而是会复用。所以在这个情况下,s1s2 记录的地址值是一样的,所以这里的结果就是 true

String s1 = "abc"; String s2 = "abc"; System.out.println(s1 == s2); // true 

3)示例代码2

首先 s1new 出来的,它就会在堆里开辟一个小空间。

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

(0)
上一篇 2025-08-09 15:20
下一篇 2025-08-09 15:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信