美文网首页Java 杂谈程序员JVM
Java面试题:String, String Pool, Str

Java面试题:String, String Pool, Str

作者: _年少无为 | 来源:发表于2019-01-17 21:42 被阅读7次

    本人收集了一些在大家在面试时被经常问及的关于String, String Pool, StringBuilder的主要问题,这些问题有可能在你下次面试时就会被问到。

    对于本文中未提及的Spring其他模块,我会单独分享面试的问题和答案。需要更多面试题以及答案详解的可以加小编QQ群937053620,获取!

    1. 写出下面代码的运行结果。

    int src = 65536;
    Integer dst = new Integer(65536);
    System.out.println(src == dst);
    System.out.println(dst.equals(src));
    

    答案:true true
    考点:Integer 的 equals 实现。查看源代码可以发现,65536 装箱为 Integer 对象后,dst.equals 方法比较的是 obj.intValue。

    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }
    

    2. 写出下面代码执行结果。

    // 1. 打印 null String
    String s = null;
    System.out.println(s);
     
    // 2. 打印 null Integer
    Integer i = null;
    System.out.println(i);
     
    // 3. 打印 str
    String str = null;
    str = str + "!";
    System.out.println(str);
    

    答案:

    null
    null
    null!
    

    考点:打印函数 print 与字符串拼接函数对 null 都进行了特殊处理,因此不会出现运行时异常,而是输入出 “null” 字符串。

    3. 写出下面代码的运行结果。

    public class Example {
        private static void sayHello() {
            System.out.println("Hello");
        }
     
        public static void main(String[] args) {
            ((Example)null).sayHello();
        }
    }
    

    答案:Hello
    考点:null 作为非基本类型,可以做类型转换,转换后调用静态方法输出字符串。基本类型,比如 int,类型转换时会报告空指针异常,比如 int a = (Integer)null; 原因就是转换过程中会调用 intValue(),因此会报告异常。

    4. String类能被继承吗,为什么?

    答案:不能。因为 String 类的定义为 final class,被 final 修饰的类不能被继承。

    public final class String
    

    考点:String 对象不可变的(immutable)。分析为什么要这么设计,可能有以下3个原因:

    • String pool:这是方法(method)区域里一个特殊的存储区域,创建一个 String 时,如果已经在 String pool 中存在,那么会返回已存在的 String 引用。
    • 允许 String 缓存 hashcode:String 定义中,有 hash 成员变量 private int hash; // 默认为0,对 hashcode 进行缓存。
    • 安全性:确保不会被恶意篡改。

    5. 写出下面代码的运行结果。

    String s1 = "Cat";
    String s2 = "Cat";
    String s3 = new String("Cat");
     
    System.out.println("s1 == s2 :"+(s1==s2));
    System.out.println("s1 == s3 :"+(s1==s3));
    

    答案:

    s1 == s2 :true
    s1 == s3 :false
    

    考点:理解 String pool,s1 与 s2 字符串内容相同,因此直接从 String pool 中返回相同的地址。s3 会创建一个新的 String 对象,因此 s1==s3 结果返回 false。

    6. String s3 = new String(“Cat”) 这句代码会创建几个 String 对象?

    答案:1 或 2 个。

    考点:理解 String pool 机制。如果 Spring pool 在执行语句之前没有 “Cat” 对象,那么会创建 2 个 String;反之只创建 1 个 String 对象,”Cat” 会从 String pool 中直接返回对象。

    7. String、StringBuffer、StringBuilder的区别?

    答案:有以下区别:

    1. String 是不可变的,StringBuffer、StringBuilder 是可变的;
    2. String 、StringBuffer 是线程安全的,StringBuilder 不是线程安全的。
    3. StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。

    8. 如何比较两个字符串?使用 “==” 还是 equals() 方法?

    答案:简单来讲,“==” 测试的是两个对象的引用是否相同,而equals()比较的是两个字符串的值是否相等。除非你想检查的是两个字符串是否是同一个对象,否则你应该使用 equals() 来比较字符串。

    用之前的例子:

    String s1 = "Cat";
    String s3 = new String("Cat");
     
    System.out.println("s1 == s3 :"+(s1==s3));
    System.out.println("s1.equals(s3) :"+(s1.equals(s3)));
    

    运行结果:

    s1 == s3 :false
    s1.equals(s3) :true
    

    9. 为什么针对安全保密高的信息,char[] 比 String 更好?

    答案:因为String是不可变的,就是说它一旦创建,就不能更改了,直到垃圾收集器将它回收。而字符数组中的元素是可以更改的,这就意味着你可以在使用完之后将其更改,而不会保留原始数据。所以使用字符数组的话,安全保密性高的信息,如密码之类信息,将不会存在于系统中被他人看到。

    10. 可以针对字符串使用 switch 条件语句吗?

    答案:JDK 7 及更新版本可以,在JDK 6或者之前的版本,则不能使用 switch 条件语句。

    欢迎大家向我推荐你在面试过程中遇到关于Spring的问题。我会把大家推荐的问题添加到下面的Spring常用面试题清单中供大家参考。

    【文章彩蛋】

    为了解决小伙伴们的燃眉之急,小编特地为大家整理了一些Java相关的面试题,可以加小编的QQ群:937053620,获取!后期也会不断更新添加新的面试题,希望可以帮助到大家。

    相关文章

      网友评论

        本文标题:Java面试题:String, String Pool, Str

        本文链接:https://www.haomeiwen.com/subject/ybewdqtx.html