java中关于字符串的比较问题

本文详细介绍了Java中字符串比较的方法,包括`equals`方法与`==`运算符的区别,以及`intern`方法的作用。通过实例代码解析了字符串对象在内存中的存储方式,并探讨了不同JDK版本下`intern`方法的行为差异,帮助读者深入理解Java字符串处理的细节。
摘要由CSDN通过智能技术生成

字符串的比较,不管在面试,或者是日常的开发中,都是经常会使用到的,本文将列举几种字符串的比较情况,先从简单的开始
1 equals的比较
1.1 下面的代码是true or false?

public static void main(String[] args){
        String s1 = "a";
        String s2 = new String("a");
        String s3 = "a";

        System.out.println(s1.equals(s2));
        System.out.println(s1.equals(s3));
    }

1.2 结果
答案都是true
1.3 为什么?
因为比较的是字符串的值
可以看下String的equals源码

public boolean equals(Object anObject) {
		// 地址相等,返回true
        if (this == anObject) {
            return true;
        }
        // 被比较的也是字符串,才进行下一步判断,否则返回false
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            // 比较和被比较的字符串长度相等,才进行下一步判断,否则返回false
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                // 循环判断字符串的每个字符是否都相等
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

1.4 题外话
如果要忽略大小写,可以使用String.equalsIgnoreCase()进行字符串的比较
2 通过==进行比较
2.1 下面的代码是true or false?

public class Test01 {
    public static void main(String[] args){
        String s1 = "a";
        String s2 = new String("a");
        String s3 = "a";

        System.out.println(s1 == s2);
        System.out.println(s1 == s3);
    }
}

2.2 结果
true
false
2.3 为什么?
通过==进行的字符串比较是通过地址进行比较,s1和s3通过字面量进行赋值,指向的是字符串常量池中的“a”,所以是true,而s2是通过new出来的String对象,所以和s1比较是false
2.4 拓展:String的intern方法
2.4.1 作用
将字符串对象放到常量池中
在这里插入图片描述
2.4.2 下面的代码是true or false?

public static void main(String[] args){
        String s2 = new String("a") + new String("b");
        s2.intern();
        String s1 = "ab";

        System.out.println(s1 == s2);
    }

2.4.2 答案
jdk6 之前为false
jdk7/jdk8 之后为true
2.4.2 为什么

  • jdk6情况下
    s2会生成"ab"字符串对象,这个对象是在堆中的,intern方法会在常量池中在创建一个"ab"字符串对象(这个对象是在永久代的),所以jdk6情况下s1!=s2
  • jdk7/jdk8情况下
    s2会生成"ab"字符串对象,这个对象是在堆中的,intern方法也会将"ab"放到常量池中,但是jdk7之后字符串常量池移到堆中了,所以虚拟机有一个优化,调用intern方法在将“ab”放到常量池的时候,若堆中已经有"ab"这个字符串对象,那么并不会再创建一个"ab"字符串到常量池,而是将堆中的这个"ab"字符串对象的引用放到常量池,当有通过字面量直接赋值字符串变量的时候,返回的其实是堆中的同一个对象,所以jdk7/jdk8的环境下,s1==s2
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值