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 著 陈昊鹏 译
- String 重载"+"
- 重载String:Overload String
- String运算符重载
- string重载和类型转换
- c++ string 函数的重载
- c++运算符重载,string类重载详解,原理理解
- 注意String.Split的几个重载形式
- C# 操作符重载 模拟String
- 重载技巧+简单实现string和Vector
- 用重载运算符做String
- 用重载运算符做String
- 类string运算符的重载
- 【C++】String类中的运算符重载
- String系列——运算符重载
- string类的运算符重载
- string类中运算符重载实现
- 【Java】String的重载"+"操作与StringBuider
- C++学习笔记 lesson6 重载String类
- 微信小程序-实现省市区三级联动
- 好的MongoDB中文文档
- 2017-11-29 黑科技
- iOS学习地址
- IIC 通讯协议
- String 重载"+"
- TensorFlow学习笔记9:LSTM搭建
- 异步处理的原理
- IVs提取合并工具ivstools
- 第13周项目1(3)-验证二叉排序树相关算法
- 聚簇索引与非聚簇索引的区别
- 第十周 项目4
- 使用STS工具创建Spring Boot或Spring MVC项目
- robotFramework之ExcelLibrary库