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

原创 2016年05月30日 14:22:12

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修饰的变量在编译的时候会将变量直接替换成真实的值  获取【下载地址】  springmvc+mybatis+spring 整合

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

1、String 、StringBuffer、StringBuilder的执行效率       StringBuilder > StringBuffer > String   当然这...

Java面试之谈谈String,StringBuilder,StringBuffer区别

引言 这是一个很常见的问题了,在这里我并不是要提出什么不一样的观点,只是想通过分析源码来加深对这一问题的理解。如果您恰好也感兴趣的话,不妨随我一读。 注意:以下源码来自orcal JDK1.8。 ...

Java面试04--StringBuffer、StringBuilder、String的区别

很多人对String和StringBuffer的区别已经很了解了吧,可能还有人对这两个类的工作原理有些不清楚的地方,复习一下吧,顺便牵出J2SE 5.0里面带来的一个新的字符操作的类StringBui...

JAVA基础:String, StringBuffer, StringBuilder ——区别,用法及常见问题

引言这几天看到知乎上讨论一道入门级JAVA面试题目,发现自己竟然答不上来,遂查阅相关资料恶补一下。问题:String,StringBuffer和StringBuilder区别?衍生问题 - 为什么能...

面试必备:String,StringBuffer,StringBuilder区别

首先说一下,这三个类都是用来处理字符串的, StringBuilder是JavaSE5之后引入的,用来替代StringBuffer, StringBuffer相对于StringBuilder线...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)