StringBuild的使用:

1、创建:

StringBuilder sb=new StringBuilder();

StringBuilder sb=new StringBuilder(200);
sb.append("Hello");
sb.append(" World!");
System.out.println(sb.toString());

// 输出结果:Hello World!

这个是StringBuild最常用的用法,把需要拼接的字符串拼接使用append(String str)放入StringBuild对象中,然后就可以进行拼接。最后使用toString()方法进行转换就可以了。

2、

在java中,字符创是不可变的,每一次的字符串都是新的值,因此,在需要对字符串进行拼接操作的时候,我们是使用StringBuild,那么,为什么StringBuild可以呢?

看源码:

因此,StringBuild是继承自AbstractStringBuilder的。

  1. abstract class AbstractStringBuilder implements Appendable, CharSequence {
  2. /**
  3. * The value is used for character storage.
  4. */
  5. char[] value;
  6.  
  7. /**
  8. * The count is the number of characters used.
  9. */
  10. int count;
  11.  
  12. 。。。
  13. }

  可以看出,AbstractStringBuilder里面有两个变量value和count,这两个是关键,为什么是关键我们接着往下看:

看StringBuild我们最常用的append()方法:

  1. @Override
  2. public StringBuilder append(Object obj) {
  3. return append(String.valueOf(obj));
  4. }
  5.  
  6. @Override
  7. public StringBuilder append(String str) {
  8. super.append(str);
  9. return this;
  10. }

  最后调用到基类,也就是AbstractStringBuilder 的方法里去了,,那么我们再看AbstractStringBuilder 中的append()方法。

  1. public AbstractStringBuilder append(String str) {
  2. if (str == null)
  3. return appendNull();
        
  4. int len = str.length();
  5. ensureCapacityInternal(count + len);
  6. str.getChars(0, len, value, count);
  7. count += len;
  8. return this;
  9. }

先看前两行,判断是不是空的,如果是空的就执行appendNull()操作,这个操作是什么呢?代码如下:

  1. private AbstractStringBuilder appendNull() {
  2. int c = count;
  3. ensureCapacityInternal(c + 4);
  4. final char[] value = this.value;
  5. value[c++] = 'n';
  6. value[c++] = 'u';
  7. value[c++] = 'l';
  8. value[c++] = 'l';
  9. count = c;
  10. return this;
  11. }

  可见,操作是把长度count也增加4,把value增加null的四个字符,然后返回this,也就是说把null放入了AbstractStringBuilder的value中,value是一个char[]数组。而count指的正是count的值。

而看append()方法的后半段,则是先扩宽value数组的长度,然后调用String的getChars方法把传入的字符串放入value数组中,之后再增加count的长度。

因此,再toString()

之前,StringBuild的append操作实际上是把str变成了char数组存入了变量value中。那么toString()操作呢?

  1. @Override
  2. public String toString() {
  3. // Create a copy, don't share the array
  4. return new String(value, 0, count);
  5. }

  可见,是调用了String的构造方法,把chae数组value变成了String类型返回。这个就是StringBuild的实质。

StringBuild使用与原理的更多相关文章

  1. 奇异值分解(SVD)原理与在降维中的应用

    奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域.是 ...

  2. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  3. 线性判别分析LDA原理总结

    在主成分分析(PCA)原理总结中,我们对降维算法PCA做了总结.这里我们就对另外一种经典的降维方法线性判别分析(Linear Discriminant Analysis, 以下简称LDA)做一个总结. ...

  4. [原] KVM 虚拟化原理探究(1)— overview

    KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...

  5. H5单页面手势滑屏切换原理

    H5单页面手势滑屏切换是采用HTML5 触摸事件(Touch) 和 CSS3动画(Transform,Transition)来实现的,效果图如下所示,本文简单说一下其实现原理和主要思路. 1.实现原理 ...

  6. .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理

    .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理 0x00 问题的产生 管道是.NET Core中非常关键的一个概念,很多重要的组件都以中间件的形式存在,包括权限管理.会话管理 ...

  7. python自动化测试(2)-自动化基本技术原理

    python自动化测试(2) 自动化基本技术原理 1   概述 在之前的文章里面提到过:做自动化的首要本领就是要会 透过现象看本质 ,落实到实际的IT工作中就是 透过界面看数据. 掌握上面的这样的本领 ...

  8. CRC、反码求和校验 原理分析

    3月份开始从客户端转后台,算是幸运的进入全栈工程师的修炼阶段.这段时间一边是老项目的客户端加服务器两边的维护和交接,一边是新项目加加加班赶工,期间最长经历了连续工作三天只睡了四五个小时的煎熬,人生也算 ...

  9. 菜鸟学Struts2——Struts工作原理

    在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...

随机推荐

  1. go 闭包程序解读

    package main import "fmt" // 下面这函数就是闭包函数(就是返回一个匿名函数的地址的函数,其中要1.定义一个需要保护的局部变量i 2.一个匿名的函数) , ...

  2. Kubernetes之服务发现及负载Services

    Service 概述 kubernetes 中的pod是有生生灭灭的,时刻都有可能被新的pod所代替,而不可复活(pod的生命周期).一旦一个pod生命终止,通过ReplicaSets动态创建和销毁p ...

  3. Vim使用技巧:将Tab转换为4个空格

    一 Tab转成4个空格 为了防止因为在不同系统中Tab键的宽度不一致而导致代码缩进显示混乱的情况,有必要将Tab键转换成空格,推荐的空格数为4.将下面的代码写入你的.vimrc文件中即可实现在Vim编 ...

  4. 阿里巴巴图标库iconfont上传svg后,显示不了图片

    AI里面选中图形,点对象-路径-轮廓化描边

  5. ADO五大对象

     ADO.NET五大对象, 1. Connection:与数据源建立连接. 2. Command:对数据源执行SQL命令并返回结果. 3. DataReader:读取数据源的数据,只允许对将数据源以只 ...

  6. 🍓vue & react 一些重要但没必要死记硬背的东西

  7. mycat 测试主从读写分离

    下载解压及创建用户组和目录属性 下载地址:1.https://github.com/MyCATApache/Mycat-download.2.http://dl.mycat.io/ wget http ...

  8. 【原创】大叔问题定位分享(22)hive同时执行多个insert overwrite table只有1个可以执行

    hive 2.1 一 问题 最近有一个场景,要向一个表的多个分区写数据,为了缩短执行时间,采用并发的方式,多个sql同时执行,分别写不同的分区,同时开启动态分区: set hive.exec.dyna ...

  9. VS中展开和折叠代码,还有其他快捷操作

    [转]VS中展开和折叠代码   VS2005代码编辑器的展开和折叠代码确实很方便和实用.以下是展开代码和折叠代码所用到的快捷键,很常用: Ctrl + M + O: 折叠所有方法 Ctrl + M + ...

  10. greenplum加密

    --如下为greenplum5.0数据库加解密--加密函数select encrypt('123456','aa','aes');--加解密函数select convert_from(decrypt( ...