Java必须掌握的字符串比较(含面试大厂题和源码)

本文详细解析了Java面试中关于字符串比较的三个问题,涉及equals()与==的区别、compareTo()方法的应用以及字符串常量池的影响,帮助面试者深化理解相关概念。
摘要由CSDN通过智能技术生成

在大厂的Java面试中,关于字符串比较的问题不仅考察你对String类方法的理解,还考察你对Java中字符串池、字符串不可变性等概念的深入了解。以下是几个可能出现在面试中关于Java字符串比较方法的问题,每个问题都附带了源码示例和相应的解释,旨在帮助你准备面试。

面试题1:equals()==的区别

问题描述:

解释String类中equals()方法和==操作符在比较字符串时的区别,并提供示例代码说明。

源码示例:

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

        System.out.println(s1 == s2); // 输出1
        System.out.println(s1.equals(s2)); // 输出2
        System.out.println(s2 == s3); // 输出3
    }
}

解释:

  • ==:比较操作符==用于比较两个对象的引用是否相同,即它们是否指向内存中的同一个位置。
  • equals()String类重写了Object类的equals()方法,用于比较两个字符串的内容是否相等。

输出解释:

  • 输出1:false,因为s1是通过new关键字创建的,指向堆内存中的一个对象,而s2是字面量赋值的,指向字符串常量池中的对象,它们的引用不同。
  • 输出2:true,因为equals()方法比较的是字符串的内容,s1s2的内容相同。
  • 输出3:true,因为s2s3都是通过字面量方式赋值的,它们引用的是字符串常量池中的同一个对象。

面试题2:compareTo()方法的使用

问题描述:

解释String类中compareTo()方法的作用,并给出示例代码说明如何使用该方法比较两个字符串。

源码示例:

public class CompareToExample {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "world";
        String s3 = "hello";

        System.out.println(s1.compareTo(s2)); // 输出1
        System.out.println(s1.compareTo(s3)); // 输出2
        System.out.println(s2.compareTo(s1)); // 输出3
    }
}

解释:

compareTo()方法用于按字典顺序比较两个字符串。如果字符串相等,方法返回0;如果调用字符串(s1)小于参数字符串(s2),则返回值小于0;如果s1大于s2,则返回值大于0。

  • 输出1:返回一个小于0的值,因为s1(“hello”)按字典顺序小于s2(“world”)。
  • 输出2:返回0,因为s1s3内容相同。
  • 输出3:返回一个大于0的值,因为s2(“world”)按字典顺序大于s1(“hello”)。

面试题3:字符串常量池的影响

问题描述:

给定以下代码,解释为什么str1.equals(str3)str2 == str3的结果不同。

源码示例:

public class StringPoolEffect {
    public static void main(String[] args) {
        String str1 = new String("pool");
        String str2 = "pool";
        String str3 = str1.intern();

        System.out.println(str1.equals(str3)); // 输出1
        System.out.println(str2 == str3); // 输出2
    }
}

解释:

  • str1.equals(str3)返回true,因为equals()方法比较的是两个字符串的内容,而str1str3的内容相同。
  • str2 == str3返回true,因为str1.intern()返回的是字符串常量池中"pool"的引用,这与str2直接指向的常量池中的"pool"是同一个引用。

这个问题旨在考察面试者对字符串常量池的理解,以及intern()方法的作用,它可以用来确保字符串来自常量池,从而允许使用==操作符进行比较。
以下是三道与Java字符串比较方法相关的面试题,包括源码示例和问题解析。这些题目旨在考察面试者对字符串比较、字符串常量池以及字符串不可变性的理解。

面试题1:字符串常量池探索

问题描述:

考虑以下Java代码。解释输出结果并说明原因。

源码示例:

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

        System.out.println(s1 == s2); // 输出1
        System.out.println(s1 == s3); // 输出2
        System.out.println(s1.equals(s3)); // 输出3
    }
}

解释:

  • 输出1:true,因为s1s2都是通过字符串字面量创建的,它们指向字符串常量池中的同一个对象。
  • 输出2:false,因为s3是通过new关键字创建的,这会在堆上创建一个新的字符串对象,即使其内容相同,s1s3的引用也不相同。
  • 输出3:trueequals()方法比较的是两个字符串的内容,而不是引用,因此即使s1s3引用不同,它们的内容相同,结果为true

面试题2:intern()方法使用

问题描述:

通过下面的代码,解释intern()方法的作用及其对字符串比较的影响。

源码示例:

public class StringIntern {
    public static void main(String[] args) {
        String s1 = new String("intern");
        String s2 = s1.intern();
        String s3 = "intern";

        System.out.println(s1 == s2); // 输出1
        System.out.println(s2 == s3); // 输出2
    }
}

解释:

  • intern()方法确保所有相同内容的字符串都指向字符串常量池中的同一个对象。
  • 输出1:false,因为s1是通过new创建的,位于堆上,而s2s1内容在常量池中的引用,即使内容相同,它们的引用不同。
  • 输出2:trues2s3都指向字符串常量池中相同内容的单一对象。intern()方法使s2引用常量池中的对象,而s3直接引用常量池中的对象。

面试题3:比较equals()compareTo()

问题描述:

解释equals()方法与compareTo()方法在字符串比较中的不同用途,并通过示例代码说明。

源码示例:

public class StringComparisonMethods {
    public static void main(String[] args) {
        String str1 = "abc";
        String str2 = "abc";
        String str3 = "abd";
        
        // 使用equals()比较
        System.out.println(str1.equals(str2)); // 输出1
        System.out.println(str1.equals(str3)); // 输出2
        
        // 使用compareTo()比较
        System.out.println(str1.compareTo(str2)); // 输出3
        System.out.println(str1.compareTo(str3)); // 输出4
    }
}

解释:

  • equals()方法用于检查两个字符串的内容是否完全相同。如果两个字符串相同,返回true;否则返回false
  • compareTo()方法用于按字典顺序比较两个字符串。如果字符串相等,返回0;调用字符串小于参数字符串,返回小于0的值;调用字符串大于参数字符串,返回大于0的值。
  • 输出1:true,因为str1str2内容相同。
  • 输出2:false,因为str1str3内容不同。
  • 输出3:0,因为str1str2内容相同,按字典顺序相等。
  • 输出4:返回一个小于0的值(如-1),因为str1(“abc”)按字典顺序小于str3(“abd”)。

这些题目旨在考察面试者对Java字符串操作的深入理解,包括字符串常量池的工作原理、字符串不可变性的影响,以及不同字符串比较方法的适用场景。

  • 21
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值