String 重载"+"

来源:互联网 发布:逆战磁暴矩阵 编辑:程序博客网 时间:2024/06/06 00:59

昨天在逛知乎的时候看到有一个公司的面试题是关于String对象 的,大概意思是String 类的 “+”是如何实现的,刚好前些天在书上有看到这个实现方式,现在写出来供大家参考。下面先来大致了解一下String 这个类:

public final class String extends Object implements Serializable, Comparable<String>, CharSequence

    String 类是被final 关键字修饰的因此该类不可以被继承,也意味着String 类的对象是不可变的,所以String 对象可以共享,String 类中的每一个看起来会修改String 值的方法,实际上都是创建了一个全新的String 对象,用来包含修改后的字符串内容,这也可以说明String 对象具有只读的属性。其中关于String 类的一些方法就不做介绍了。

这种不可变性意味着存在着一定的效率问题。当为String 类重载 “+” 操作符就是一个例子。

public class StringTest {    public static void main(String[] args) {        String apple = "Apple,";        String fruit = apple + "Pear," + "Orange";        System.out.println(fruit);    }}

输出
Apple,Pear,Orange

    不知道你们有没有想过这段代码是如何工作的,可能我们会想:String 类有一个append() 的方法,它会生成一个新的String 对象,以包含连接的字符串,首先它会先连接apple 与 “Pear,” 生成一个对象,然后该对象再与“Orange” 相连,生成另一个新的对象,以此类推,得到最终的String 对象。
    这种方式看似行得通,但是为了得到最终分的String 对象,会产生很多被垃圾回收机制回收的中间对象,这样实现的性能肯定是及其糟糕的。其实编译器在执行上述代码的时候会的自动引入java.lang.StringBuilder 类。虽然在上面的代码中我们并没有使用到StringBuilder 类,但是编译器却自动引入了它,因为它更高效。上面这个例子中,编译器会创建一个StringBuilder 对象,用来构造最终要生成的String,并为每一个字符串调用一次StringBuilder 中的append() 方法,因此上述代码一共执行了三次append() 方法。最后调用toString 生成最终的结果,并保存为fruit。

但是我们不能认为编译器已经帮我们做了优化,我们就可以随意的使用String 对象。下面是两种方法生成一个String:一个方法使用了String 对象,另一个使用了StringBuilder。

 public static String getString1(String[] strArray){        String result = "";        for(int i = 0; i < strArray.length; i++)            result += strArray[i];        return result;    }    public static String getString2(String[] strArray){        StringBuilder result = new StringBuilder();        for(int i = 0; i < strArray.length; i++)            result.append(strArray[i]);        return result.toString();    }

    上面两个方法都是用来对一个数组中的数据进行连接返回一个String 对象但是需要我们注意的是getString1 方法是在循环内部构造StringBuilder 对象的,这意味着每循环一次就会创建一个新的StringBuilder 对象。getString2 方法只生成了一个StringBuilder 对象,这样更简单更高效的实现了同getString1 一样的功能。所以在我们使用String 对象时,最好考虑一下是否可以用StringBuilder 对象更高效的实现我们想要的功能。

                                                                                                            参考书籍:
                                                                                                                《Java 编程思想》Bruce Eckel 著 陈昊鹏 译