Android中字符串拼接那些事

您所在的位置:网站首页 xml中字符串拼接 Android中字符串拼接那些事

Android中字符串拼接那些事

2024-03-29 02:03| 来源: 网络整理| 查看: 265

一.概述 字符串是个什么?

字符串是由字符组成的,而字符由字节根据编码规则而来。这里我们的问题停留在字符以及字符串上,不涉及字符和字节的转换,想了解字符和字节转换以及编码规则请看字符编码(ASCII,Unicode和UTF-8,GBK)

问题

平时开发中涉及到字符串拼接到底什么情况使用什么方法最合适呢?以及为什么选择这种方法呢?(或者说一下String,StringBuilder,StringBuffer异同等)相信大家面试的时候都遇到过。

结论

下面先给出结论,再将结论的得出过程仔细分析一下。(jdk版本为1.8.0-51) 先给出拼接方式如下: 方法一: 使用“+”; 方法二: String.concat方法 方法三: StringBuilder.append方法 方法四: StringBuffer.append方法 下面是选择原则:

简单拼接使用方法一“+”百分百确定不涉及多线程,大量拼接使用方法三StringBuilder.append不确定会涉及多线程,大量拼接使用方法四StringBuffer.append

下面看看如何得出的这些结论。

二.拼接实际过程 2.1先看各个类的定义

String:是一个常量,一旦赋值就不可以修改了。(内部实现为字符数组,其为final类型) StringBuilder:字符串变量(非线程安全)。(内部实现也是字符数组) StringBuffer:字符串变量(Synchronized,即线程安全)。(内部实现也是字符数组)

2.2各种方法拼接的实质 2.2.1 方法一: 使用“+”

String既然是final的,那么哪里来的拼接呢?其实,所有的所谓字符串拼接,都是重新生成了一个新的字符串。如下:

String s2 = "Hello"; String s3 = "Word"; String s4 = s2 + s3;

如果我们反编译会发现其内部在编译的时候其实是使用了StringBuilder。上面的拼接过程是:

String s4 = new StringBuilder().append(s2).append(s3).toString(); 但是注意

如果如下

String s1 = "Hello" + "Word";

其内部的实现和上面的原理就不同了,上面的这种拼接方法就相当于:

String s1 = "HelloWord";

因为在编译时候Hello和Word两个字符串被保存入常量池中,编译的时候就已经将两个字符串拼接为一个。关于类加载和编译相关的知识这里不展开说明。

2.2.2 方法二: String.concat方法

下面是源码:

@FastNative public native String concat(String str);

在jdk版本为1.8.0-51中已经成为了native方法,从注解@FastNative来看它是将拼接过程放入了native层加快了拼接速度。

2.2.3 方法三: StringBuilder.append方法

实例代码如下,将两个字符串进行拼接

StringBuilder sb = new StringBuilder(); String s = sb.append("Hello").append("Word").toString();

StringBuilder类的基类是AbstractStringBuilder,并且append也是使用的AbstractStringBuilder中的,下面我们来看AbstractStringBuilder。其中重要的几点:

存储实现是字符数组字符数组中不一定所有位置都被占用了“数组扩容”,构造新String

下面是AbstractStringBuilder源码,只取相关部分

-------省略代码------- /** * 字符数组作为存储容器 */ char[] value; /** * 数组中被使用的数量 */ int count; -------省略代码------- //拼接 public AbstractStringBuilder append(String str) { if (str == null) return appendNull(); int len = str.length(); ensureCapacityInternal(count + len); str.getChars(0, len, value, count); count += len; return this; } //确认是否要扩容 private void ensureCapacityInternal(int minimumCapacity) { // overflow-conscious code if (minimumCapacity - value.length > 0) { value = Arrays.copyOf(value, newCapacity(minimumCapacity)); } } //扩容操作 private int newCapacity(int minCapacity) { // overflow-conscious code int newCapacity = (value.length


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3