欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java中String、StringBuffer、StringBuilder的区别及面试经常出现的问题

程序员文章站 2022-03-03 09:42:11
...

1、String 、StringBuffer、StringBuilder的执行效率

      StringBuilder > StringBuffer > String

 

当然这个是相对的,不一定在所有情况下都是这样 如:

String a = 'a' + ‘b’ + 'c' 的效率比 StringBuffer buffer = new StringBuffer().append(‘a‘).append(’b‘).append(’c‘)要高

因此这三个类各有利弊,要根据自己的需要来决定用哪个

当字符串较少或者改动比较少的情况下 建议使用String

当字符串较多或者改动量比较大的情况下,建议使用StringBuilder,如果考虑使用线程,则用StringBuffer

 

1. 下面这段代码的输出结果是什么?

String a = "hello2";   String b = "hello" + 2;   System.out.println((a == b));

输出的结果是:true  "hello" + 2在编译的时候会隐式转换为"hello2" 因此a变量和b变量指向同一个对象

2.下面这段代码的输出结果是什么?

String a = "hello2";    String b = "hello";       String c = b + 2;       System.out.println((a == c));

输出的结果是:false  由于有引号的存在,所以编译的时候 不会把它当成一个常量

3.下面这段代码的输出结果是什么?

String a = "hello2";     final String b = "hello";       String c = b + 2;       System.out.println((a == c));

输出的结果是:true   final修饰的变量在编译的时候会将变量直接替换成真实的值 

4.下面这段代码输出结果为:

1
2
3
4
5
6
7
8
9
10
11
12
public class Main {
    public static void main(String[] args) {
        String a = "hello2";
        final String b = getHello();
        String c = b + 2;
        System.out.println((a == c));
    }
     
    public static String getHello() {
        return "hello";
    }
}

输出的结果是:false  虽然该变量是被final修饰 但是它是通过方法来赋值的 而在编译的时候 并不知道方法会返回什么值 

5.下面这段代码的输出结果是什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
    public static void main(String[] args) {
        String a = "hello";
        String b =  new String("hello");
        String c =  new String("hello");
        String d = b.intern();
         
        System.out.println(a==b);
        System.out.println(b==c);
        System.out.println(b==d);
        System.out.println(a==d);
    }
}

输出的结果是:

false 

false

false 

true 

这里涉及到String.intern方法的使用,intern方法会先在运行时常量池中查找是否有相同的字符串,如果有则返回指向该地址的引用,因此a和d指向的是同一个对象

6.String str = new String("abc")创建了多少个对象?

这个问题在很多书籍上都有说到比如《Java程序员面试宝典》,包括很多国内大公司笔试面试题都会遇到,大部分网上流传的以及一些面试书籍上都说是2个对象,这种说法是片面的。

很显然,new只调用了一次,也就是说只创建了一个对象。

这里有一个混淆的地方,就是该代码在加载和执行的时候的区别 加载的是 确实只new一个对象 在执行的时候 又创建了一个String对象

面试官在问这个问题的是  最好是问清楚下"是这段代码在执行的时候创建了多少个对象还是单纯的这段话涉及到了多少对象"

当然 如果是笔试的话 还是按照网上的来 2个对象 一个abc 一个通过new 创建并初始化的对象 内容是abc