StringBuilder源码解析
来源:互联网 发布:网络暴力数据分析 编辑:程序博客网 时间:2024/06/06 00:54
1.StringBuilder是线程不安全的,里面的char[]是可变的,增删改操作都是依赖System.arraycopy 函数来实现的。StringBuilder会默认构造16个长度,当后面修改到超过时会自动扩容到(char[].length+ 1) * 2,这就是比String效率高的原因,不用像String一样容量不够就重新构造对象,StringBuilder会自动扩容。
2.自定义StringBuilder代码:
// 一些具体功能实现,两个实现类 StringBuilder和StringBufferabstract class AbstractStringBuilder { char value[]; // 并不等于value.length 当前 有效字符串的长度 int count; AbstractStringBuilder(int capacity) { value = new char[capacity]; } public AbstractStringBuilder append(String str) { if (str == null) str = "null"; int len = str.length(); if (len == 0) return this; int newCount = count + len;// 两个字符串之和 if (newCount > value.length) // char[] 空间不够了 expandCapacity(newCount); // 把 str 用 System.arraycopy 复制到value中 str.getChars(0, len, value, count); count = newCount; return this; } void expandCapacity(int minimumCapacity) { // 扩大 (value.length + 1) * 2 int newCapacity = (value.length + 1) * 2; if (newCapacity < 0) { newCapacity = Integer.MAX_VALUE; } else if (minimumCapacity > newCapacity) { newCapacity = minimumCapacity; } // 用System.arraycopy 来复制 value并 扩大newCapacity长度 value = Arrays.copyOf(value, newCapacity); } public AbstractStringBuilder delete(int start, int end) { int len = end - start;// 要删除字符串的长度 if (len > 0) { /** * 把要删除的字符串之后的的字符串 ,前移到删除的位置, 就表示 删除了字符串, */ System.arraycopy(value, start + len, value, start, count - end); count -= len; // 有效长度 减去删除的长度 } return this; } public AbstractStringBuilder insert(int offset, String str) { int len = str.length(); int newCount = count + len; if (newCount > value.length)// 容量不够 ,扩容 expandCapacity(newCount); // 把 insert位置的len个长度 空出来 System.arraycopy(value, offset, value, offset + len, count - offset); // 把str拷贝到 value中 str.getChars(value, offset); count = newCount; return this; }}//StringBuilder类class MyStringBuilder extends AbstractStringBuilder { public MyStringBuilder() { super(16);// 默认构造 16 个长度的char数组 } // 添加字符串,父类实现 public MyStringBuilder append(String str) { super.append(str); return this; } // 删除 public MyStringBuilder delete(int start, int end) { super.delete(start, end); return this; } // 插入 public MyStringBuilder insert(int offset, String str) { super.insert(offset, str); return this; } // 重新构造一个String public String toString() { // Create a copy, don't share the array return new String(value, 0, count); }}
分析了几个重要方法,都是System.arraycopy来操作char[] 实现的。
老生常谈:深圳有爱好音乐的会打鼓(吉他,键盘,贝斯等)的程序员和其它职业可以一起交流加入我们乐队一起嗨。我的QQ:657455400
0 0
- StringBuilder源码解析
- StringBuilder源码解析
- String、StringBuilder、 StringBuffer 深入分析 源码解析
- JDK源码解析之StringBuilder和StringBuffer
- String、StringBuilder、 StringBuffer 深入分析 源码解析
- 源码角度解析:StringBuffer、StringBuilder、String
- Java String、StringBuffer、StringBuilder源码解析
- JDK7中StringBuffer/StringBuilder源码解析
- String系列——StringBuilder & StringBuffer关键源码解析
- 【JDK】:java.lang.String、StringBuilder、StringBuffer 源码解析
- String,StringBuffer和StringBuilder源码解析[基于JDK6]
- String,StringBuffer,StringBuilder性能比较,线程安全测试,源码解析。
- 从源码解析Java中String、StringBuilder、StringBuffer的区别
- StringBuffer和StringBuilder源码解析(一)--构造方法
- StringBuffer和StringBuilder源码解析(三)-- indexOf()方法
- JDK源码解析基础篇-String、StringBuilder、StringBuffer
- StringBuilder源码分析
- StringBuilder源码分析
- mongodb,ngrok,nginx在 Linux上的相关命令和Linux相关线程命令
- 笔记2
- BaseExpandableListAdapter 始终只有一条数据 点击也没用
- OpenVAS破绽扫描根底教程之OpenVAS概述及安装及配置OpenVAS服务
- 用java编写画板
- StringBuilder源码解析
- 请问sqlite如何根据整形的时间来查询?
- 为什么无法获取谷歌的搜索结果页面???
- 分布式消息队列RocketMQ&Kafka -- 消息的“顺序消费”-- 一个看似简单的复杂问题
- 走进Python世界(3)----数据类型与变量
- matplotlib(一)——pyplot使用简介
- 8.《深入理解Java虚拟机》内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别
- EDA基础专用名词
- postgresql 9.5 (主备库)流复制简单配置