分析可变形字符串序列StringBuilder 以及 StringBuffer之默认大小与扩容

默认值初始化:

1.  首先明确 StringBuffer类与 StringBuilder类均继承了抽象类 AbstractStringBuilder类

无参构造方法

2. 源码中StringBuffer类和StringBuilder类初始化均调用父类的构造方法:

父类初始化:

子类默认传入值16 给父类初始化字符数组

有参构造方法:

扩容算法:

使用append()方法在字符串后面追加东西的时候,如果长度超过了该字符串存储空间大小了就需要进行扩容:构建新的存储空间更大的字符串,将久的复制过去;

再进行字符串append添加的时候,会先计算添加后字符串大小,传入一个方法:ensureCapacityInternal 这个方法进行是否扩容的判断,需要扩容就调用expandCapacity方法进行扩容:

尝试将新容量扩为大小变成2倍+2   if 判断一下 容量如果不够,直接扩充到需要的容量大小;

随便说说:

集合中也有类似情况,ArrayList 和LinkedList也有默认值10 ,也有扩容算法采用的是右偏移1 + 原有长度  ==也就是变为1.5倍大小 ,如果不够用的话,就直接扩充到需要的大小;

String 类有一个 trim()方法 和 StringBuffer 与 StringBuilder类有一个trimToSize()方法需要节约内存的时候可以使用

时间: 2024-11-05 22:43:11

分析可变形字符串序列StringBuilder 以及 StringBuffer之默认大小与扩容的相关文章

Java不可变序列String和可变序列StringBuilder、StringBuffer

String String变量是不可变的,源码里面用了final修饰. private final char value[]; String str = "Hello"; System.out.println(Integer.toHexString(str.hashCode())); str = "World"; //字符串一旦变化就会重写生成一个对象 System.out.println(Integer.toHexString(str.hashCode()));

实例的对比String、StringBuilder字符串的连接效率及StringBuilder和StringBuffer线程安全的比较

一.字符串连接的效率问题 使用String连接字符串时为什么慢? 小知识点 java中对数组进行初始化后,该数组所占的内存空间.数组长度都是不可变的. 创建一个字符串,为字符串对象分配内存空间,会耗费掉一定的时间(CPU)与空间(内存)代价,作为最基础的数据类型,大量频繁的创建字符串,极大程度地影响程序的性能. 过多无用的中间对象 每次连接字符串时都会创建一个新的String对象,随着拼接次数的增多,这个对象会越来越大. 如,进行100次拼接需要创建100个String对象才能够达到目的. St

6、字符串生成器 String-Builder

package com.xxx.xxx; public class demo7 { /** * 字符串生成器 * J2SE 可变的字符串序列 String-Builder类 * @param args */ public static void main(String[] args) { String str = ""; //创建空字符串 //定义对字符串执行操作的起始时间 long startTime = System.currentTimeMillis(); for(int i =

Java StringBuilder 和 StringBuffer 源码分析

简介 StringBuilder与StringBuffer是两个常用的操作字符串的类.大家都知道,StringBuilder是线程不安全的,而StringBuffer是线程安全的.前者是JDK1.5加入的,后者在JDK1.0就有了.下面分析一下它们的内部实现. 继承关系 public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence public

CharSequence,String ,Stringbuilder和StringBuffer源码分析

1.从类的定义看CharSequence.StringBuffer.StringBuilder.String的关系 下面先贴上这四者的定义(来自JDK1.6) CharSequence是一个定义字符串操作的接口,StringBuffer.StringBuilder.String中都实现了这个接口. //CharSequence定义 public interface CharSequence //StringBuffer定义 public final class StringBuffer exte

四:Java之字符串操作String、StringBuffer和StringBuilder

string是我们经经常使用到的一个类型,事实上有时候认为敲代码就是在重复的操作字符串,这是C的特点,在java中.jdk非常好的封装了关于字符串的操作.三个类String .StringBuffer . StringBuilder .这三个类基本上满足了我们在不同情景下使用字符串的需求. 一.String JDK的解释是 "Strings are constant; their valuescannot be changed after they are created"也就是说St

Java字符串的String、StringBuilder、StringBuffer三者特性详解

一.不可变String类型 字符串是计算机程序设计中的,最常见行为,Java的字符串操作最主要的类是String,并且String对象是不可变的(Immutable),即对象一旦创建在内存中,那么它的内容就不再改变.虽然String类中提供很多方法看起来像是可以修改String对象,比如trim().subString()等等,但是实际上它们并没有改变原来的字符串对象,这些方法传递的只是引用的一个拷贝,所以重新创建了一个String类型的对象,并且有了新的引用. 例如下面一段代码可以说明Stri

从String类型字符串的比较到StringBuffer和StringBuilder

1. String类型 String类源码 为了从本质上理解String类型的特性所在,我们从String类型的源码看起,在源码中String类的注释中存在以下: /**Strings are constant; their values cannot be changed after they * are created. String buffers support mutable strings. * Because String objects are immutable they ca

StringBuilder与StringBuffer的区别(转) &精简版StringBuilder,提速字符串拼接

以下这部分转子连接 http://www.cnblogs.com/Fskjb/archive/2010/04/19/1715176.html 相信大家看到过很多比较String和StringBuffer区别的文章,也明白这两者的区别,然而自从Java 5.0发布以后,我们的比较列表上将多出一个对象了,这就是StringBuilder类.String类是不可变类,任何对String的改变都会引发新的String对象的生成:而StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生