stringbuilder底层(stringbuffer stringbuilder底层)

http://www.itjxue.com  2023-02-23 07:45  来源:未知  点击次数: 

StringBuffer与StringBuilder的底层实现

1.两者内部都是通过维护char[] 来装载数据 。

2.线程同步问题:对于applend()方法,StringBuilder 非线程安全,StringBuffer线程安全。

public StringBuilder append(CharSequence s, int start, int end) {

? ? ? ? super.append(s, start, end);

? ? ? ? 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);

? ? ? ? count += len;

? ? ? ? return this;

? ? }

String,StringBuffer,StringBuilder内存分析

底层实际上是将循环体内的 string += CONSTANT_STRING; 语句转成了:

string = (new StringBuilder(String.valueOf(string))).append("min-snail").toString();

所以在二十万次的串联字符串中, 每一次都先去创建 StringBuilder 对象, 然后再调 append() 方法来完成 String 类的 "+" 操作。

这里的大部分时间都花在了对象的创建上, 而且每个创建出来的对象的生命都不能长久, 朝生夕灭, 因为这些对象创建出来之后没有引用变量来引用它们,

那么它们在使用完成时候就处于一种不可到达状态, java 虚拟机的垃圾回收器(GC)就会不定期的来回收这些垃圾对象。因此会看到上图堆内存中的曲线起伏变化很大。

但如果是遇到如下情况:

java 对 concat1 的处理速度也是快的惊人。耗时基本上都是 0 毫秒。这是因为 concat1 在编译期就可以被确定是一个字符常量。

当编译完成之后 concat1 的值其实就是 "lianjiaok", 因此, 在运行期间自然就不需要花费太多的时间来处理 concat1 了。如果是站在这个角度来看, 使用StringBuilder 完全不占优势, 在这种情况下, 如果是使用 StringBuilder 反而会使得程序运行需要耗费更多的时间。

但是 concat2 不一样, 由于 concat2 在编译期间不能够被确定, 因此, 在运行期间 JVM 会按老一套的做法, 将其转换成使用 StringBuilder 来实现。

从表格数据可以看出, StringBuilder 与 StringBuffer 在耗时上并不相差多少, 只是 StringBuilder 稍微快一些, 但是 StringBuilder 是冒着多线程不安全的潜在风险。这也是 StringBuilder 为赚取表格数据中的 1.7 毫秒( 若按表格的数据来算, 性能已经提升 20% 多 )所需要付出的代价。

综合来说:

StringBuilder 是 java 为 StringBuffer 提供的一个等价类, 但不保证同步。在不涉及多线程的操作情况下可以简易的替换 StringBuffer 来提升系统性能; StringBuffer 在性能上稍略StringBuilder, 但可以不用考虑线程安全问题; String 的 "+" 符号操作起来简单方便,String 的使用也很简单便捷, java 底层会转换成 StringBuilder 来实现, 特别如果是要在循环体内使用, 建议选择其余两个。

明显可以看出使用了指定大小缓冲区的构造器更具优势

java中的StringBuilder有什么用?

StringBuilder叫字符串缓存区对象,使用时可以不断添加字符、字符串等已有内容。

需要使用时调用toString()获得对象里的所有字符串。

作用:

简化字符串常量池的个数,节省内存。

StringBuilder相当于一个池子,可以存放很多已有的字符串,使用时可以以此获得很长的字符串,从而优化程序。

JDK底层使用StringBuilder实现字符串拼接。

C#中StringBuilder的底层原理是什么?

StringBuilder stringBuilder = new StringBuilder(30,300);

StringBuilder 类在初始化的时候,提供许多构造函数用来初始化当前实例的初始大小和可存储的最大字符数以及用来初始化当前实例的字符串。

实际上,当我们创建 StringBuilder 对象的时候,.NET 运行库会为当前的对象在内存中分配一块缓存区域,用以对字符串操作的预留空间。

在使用 StringBuilder 类的时候,最好将容量设置为字符串可能的最大长度,确保 StringBuilder 不需要重复分配内存。

如果字符的容量超过设置的最大容量,.NET 运行库将自动分配内存并翻倍。

对于我们 .NET 程序员而言,StringBuilder 与 String 的不同之处就在于,StringBuilder 可以显示的设置分配内存的大小

(责任编辑:IT教学网)

更多

相关MYSQL文章

推荐MYSQL文章