Android面试题(5):String、StringBuffer、StringBuilder区别

《Effective Java》 第15条和第51条

1. 这个问题看似简单

你可能这么回答,String是字符串常量,不可变。StringBuffer是字符串变量,可以扩充和修改。而StringBuffer是线程安全的,StringBuilder是线程不安全的,但是性能更高。

你可以这么回答,但是你觉得面试官真的会问这么简单的问题吗?

如果StringBuffer的作用仅仅是扩充和修改字符串,那这个类的作用也太没有用了。
这个类真正解决的不是String不可变,而是操作String的性能,比如字符串拼接。

2. 了解final,字符串拼接的性能(String就是final修饰的一个不可变类)

Java中没有区分可变参数和不可变参数(kotlin在这方面就非常舒服……),但是我们可以用final修饰让他变为不可变参数。

不可变的好处很多,例如可以被内部类访问、线程安全等,简单来说就是可以被自由的共享。而不可变类唯一一个缺点就是:对于每个不同的值都需要一个单独的对象

例如我们需要将一个将很多条数据拼接成字符串(比如生成json时),当两个字符串被连接时,它们的内容都要被拷贝。那么在这个过程中,创建了非常多字符串对象,除了最后生成的那个字符串对象,其他对象都会被抛弃。为连接n个字符串而重复使用字符串连接操作符,是需要n的平方级时间

3. StringBuilder为什么能那么快

因为StringBuilder内部使用一个char数组,拼接的是字符,是基本数据类型,最后输出的时候才转为字符串输出。
看看StringBuilder拼接一个true的时候的代码

public AbstractStringBuilder append(boolean b) {
        if (b) {
            ensureCapacityInternal(count + 4);
            value[count++] = 't';
            value[count++] = 'r';
            value[count++] = 'u';
            value[count++] = 'e';
        } else {
            ensureCapacityInternal(count + 5);
            value[count++] = 'f';
            value[count++] = 'a';
            value[count++] = 'l';
            value[count++] = 's';
            value[count++] = 'e';
        }
        return this;
    }

一般情况下,StringBuilder能比普通String拼接快上几十倍到几百倍都有可能,这要看拼接的次数。直接通过String连接是n的平方级耗时,而StringBuilder的耗时是线性的。

4.说下我的面试经验

我去年遇到一个面试官,问我的问题都是比较简单,最后给我的评价就是,很平庸,也就那样,该懂得都懂,但是没亮点。我以为是我扩展的不够,接着后面几次面试,我都尽量扩展一下知识点,往问题上延伸。有些面试官就觉得不错,很受用。但是有些面试官就觉得你废话太多,没问你那些你一通balabala。
那段时间我是有点委屈的,简单的问题回答出来就是没亮点,说多了有觉得你啰嗦……

现在写面试题我是有些了解了,一些简单的面试题,看似简单,但是你如果回答的有深度,可能offer就能拿到手了。

扫描二维码关注公众号,回复: 857411 查看本文章

猜你喜欢

转载自blog.csdn.net/u010386612/article/details/79875301
今日推荐