每周10道Java面试题:String, String Pool, StringBuilder

栏目: Java · 发布时间: 7年前

内容简介:每周10道 Java 面试题由 ImportNew 整理编译自网络。面试题答案讨论请移步:

每周10道 Java 面试题由 ImportNew 整理编译自网络。

面试题答案讨论请移步: https://github.com/jobbole/java-interview/issues/1 Java面试题投递交流请移步: https://github.com/jobbole/java-interview/issues/2

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” 字符串。
细节分析可参见 Importnew:Java String 对 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 条件语句。

关于作者:唐尤华

每周10道 <a href='https://www.codercto.com/topics/22013.html'>Java</a> 面试题:String, String Pool, StringBuilder

我喜欢程序员,他们单纯、固执、容易体会到成就感;面对压力,能够挑灯夜战不眠不休;面对困难,能够迎难而上挑战自我。他们也会感到困惑与傍徨,但每个 程序员 的心中都有一个比尔盖茨或是乔布斯的梦想“用智慧开创属于自己的事业”。我想说的是,其实我是一个程序员。(新浪微博: @唐尤华

查看唐尤华的更多文章 >>


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Implementing Responsive Design

Implementing Responsive Design

Tim Kadlec / New Riders / 2012-7-31 / GBP 27.99

New devices and platforms emerge daily. Browsers iterate at a remarkable pace. Faced with this volatile landscape we can either struggle for control or we can embrace the inherent flexibility of the w......一起来看看 《Implementing Responsive Design》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具