java 中 Stringbuff append源代码浅析
public synchronized StringBuffer append(String str) {
super.append(str);
return this;
} // 同步方法
public AbstractStringBuilder append(String str) {
if (str == null) str = "null";
int len = str.length();
ensureCapacityInternal(count + len); // 是否扩容数组,如果扩容,返回将原数据拷入进去的数组
str.getChars(0, len, value, count); // 将str拷贝进数组
count += len;
return this;
}
private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
if (minimumCapacity - value.length > 0) // 原数组中数据内容长度+ 新需要拷贝的字符串长度超过原数组长度需要扩容
expandCapacity(minimumCapacity);
}
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 2 + 2; // 扩容按照原数组长度的2 * len + 2 的比例
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity; // 在需要append的字符串很长的情况下会出现
if (newCapacity < 0) { // oom
if (minimumCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity); // 将原数据拷贝进一个扩容后的数组返回
}
参考源代码,自己在工程代码中简单实现了功能.
byte[] bytes = new byte[16]; // StringBuff源代码默认初始化是16字节
String str = "hellowewewehellowewewe"; //
bytes = Arrays.copyOf(bytes, 100); // 简单扩容, 省略了判断
str.getBytes(0, str.length(), bytes, 0);
System.out.println(bytes);
for (int i = 0; i < 100; i++){
System.out.println(bytes[i]);
}
顺便提下String
String str = "test";
str = str + "abc"; 使用的是StringBuilder对象添加,
早上大概花了半个小时, 简单看了下,下回有时间再仔细研究
java 中 Stringbuff append源代码浅析的更多相关文章
- java中super()和this()浅析
<span style="font-size:18px;">本质:这两个都是调用构造方法的方法.</span> 在java中,super()是在当前类的构造 ...
- Java中字符串内存位置浅析
前言 之前写过一篇关于JVM内存区域划分的文章,但是昨天接到蚂蚁金服的面试,问到JVM相关的内容,解释一下JVM的内存区域划分,这部分答得还不错,但是后来又问了Java里面String存放的位置,之前 ...
- +Java中的native关键字浅析(Java+Native+Interface)++
JNI是Java Native Interface的 缩写.从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的 ...
- Java中的final关键字--浅析
final基本用法: 修饰类,类不能被继承 修饰方法,方法不能被重写 修饰变量,变量变常量,不可修该 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改:如果是引用类 ...
- 深入理解Java中的HashMap的实现原理
HashMap继承自抽象类AbstractMap,抽象类AbstractMap实现了Map接口.关系图例如以下所看到的: Java中的Map<key, value>接口同意我们将一个对象作 ...
- 浅析Java中的final关键字
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- 浅析Java中的访问权限控制
浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...
- [转载]浅析Java中的final关键字
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- java之Map源代码浅析
Map是键值对.也是经常使用的数据结构. Map接口定义了map的基本行为.包含最核心的get和put操作,此接口的定义的方法见下图: JDK中有不同的的map实现,分别适用于不同的应用场景.如线程安 ...
随机推荐
- gp与 pg 查询进程
select now()-query_start as cost_time,* from pg_stat_activity where current_query not in ( '<IDLE ...
- psd 转换 html
http://www.docin.com/search.do?searchcat=2&nkey=psd+to+html
- tcp滑动窗口与拥塞控制
TCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现.一.滑动窗口协议 所谓滑动窗口协议,自己理解有两点:1. “窗口 ...
- 成都Uber优步司机奖励政策(3月16日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- NB-IOT连接移动onenet平台流程
1. 先创建账号,然后创建产品 2. 创建设备,用AT+CGSN和AT+CIMI查询NB-IOT的IMEI和IMSI填写上去. 3. 创建好的设备.
- NSNull Crash处理 (NullSafe 的原理)
问题场景 后端返回的数据中总会出现一些NSNull类型,当我们一处理程序就会崩溃,因此想到把返回的数据中的NSNull类型全部转换成@""空字符串 (1)原始的json串:后端返回 ...
- 微信小程序学习笔记(四)
云函数条件查询 exports.main = async (event, context) => { try { return await db.collection('sweething'). ...
- 基于阿里云服务器Linux系统安装配置Redis
一.Redis简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(有 ...
- 学好三角学(函数) — SWIFT和JAVASCRIPT游戏开发的必备技能 iFIERO.com
不论是使用哪种平台进行开发,三角学在游戏当中都被广泛的使用,因此,小编iFERO认为,三角学是必须得掌握的技能之一. 游戏图片由 摘自 Razeware LLC 先以Javascript为例 一.角度 ...
- 关于html2canvas清晰度
最近有个小项目 需要生成海报让用户去分享~~~vue做的,海报通过html2canvas 生成. 遇到的最大问题是生成图片的清晰度~~网上找了好多方法. 放大倍数!~网上找的~~ var cntEle ...