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,StringBuilder和StringBuffer的区别

字符串,就是一系列字符的集合。 Java里面提供了String,StringBuffer和StringBuilder三个类来封装字符串,其中StringBuilder类是到jdk 1.5才新增的...
  • hj7jay
  • hj7jay
  • 2016年10月09日 20:31
  • 3223

Java基础之String,StringBuffer与StringBuilder的区别及应用场景

1 概述(1)String 字符串常量; (2)StringBuffer 字符串变量(线程安全),是一个容器,最终会通过toString方法变成字符串; (3)StringBuilder 字符串变...
  • chenliguan
  • chenliguan
  • 2016年07月14日 18:35
  • 5794

Java String为什么是不可变类,StringBuffer与StringBuilder区别

熟悉Java的都知道String类是不可变,但String类为什么设计成不可变类,如何做到不可变没有仔细想过。 String为什么设计成不可变类? 1.Java字符串池的设计方式。     Strin...
  • chenchaofuck1
  • chenchaofuck1
  • 2016年03月10日 15:15
  • 2019

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

1、String 、StringBuffer、StringBuilder的执行效率       StringBuilder > StringBuffer > String   当然这...
  • hanshouth6
  • hanshouth6
  • 2016年05月28日 11:39
  • 172

Java中String,StringBuffer与StringBuilder的区别

  • 2013年06月08日 11:22
  • 15KB
  • 下载

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

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

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

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

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

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

String StringBuffer和StringBuilder区别之源码解析

  • 2017年12月07日 20:08
  • 90KB
  • 下载

String、StringBuilder和StringBuffer的区别

  • 2011年06月09日 09:19
  • 55KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java中String、StringBuffer、StringBuilder的区别及面试经常出现的问题
举报原因:
原因补充:

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