Android中字符串拼接那些事 |
您所在的位置:网站首页 › xml中字符串拼接 › Android中字符串拼接那些事 |
一.概述
字符串是个什么?
字符串是由字符组成的,而字符由字节根据编码规则而来。这里我们的问题停留在字符以及字符串上,不涉及字符和字节的转换,想了解字符和字节转换以及编码规则请看字符编码(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 |