[java初探外篇]__关于StringBuilder类与String类的区别
- 前言
我们前面学习到String类的相关知识,知道了它是一个字符串类,并且了解到其中的一些方法,但是当时并没有太过注意到String类的特点,今天就StringBuilder类的学习来比较一下两者的区别和作用.
- String类
String类实例化的对象,其长度是固定不变的,其内容也是不可改变的.
那么,为什么,在我们学习String类的时候,我们了解到String类提供了很多方法用来对String对象进行操作呢,还包括到字符串的连接,和字符串的替换.这明显和上面所描述的String类的特性不同嘛.
在通过了解之后,我知道了,上面的那些操作String类的方法中凡是更String类的长度和内容相关的方法,其实返回的都不是同一个字符串.而是一个新定义的字符串,通过方法体中的方法获取到结果,再赋值新建的字符串然后返回.而+号连接字符串的操作也不是将内容直接添加到原字符串内.而是储存在一个新的String的对象内,再做并列输出的效果.
我们可以观察一下String类提供的replace方法(用来替换字符串):
public String replace(CharSequence target, CharSequence replacement) {
String tgtStr = target.toString();
String replStr = replacement.toString();
int j = indexOf(tgtStr);
if (j < 0) {
return this;
}
int tgtLen = tgtStr.length();
int tgtLen1 = Math.max(tgtLen, 1);
int thisLen = length();
int newLenHint = thisLen - tgtLen + replStr.length();
if (newLenHint < 0) {
throw new OutOfMemoryError();
}
StringBuilder sb = new StringBuilder(newLenHint);
int i = 0;
do {
sb.append(this, i, j).append(replStr);
i = j + tgtLen;
} while (j < thisLen && (j = indexOf(tgtStr, j + tgtLen1)) > 0);
return sb.append(this, i, thisLen).toString();
}
可能,有些代码我们还看不太懂,但可以很明显的查看到,replace方法返回的是一个new的StringBuilder对象sb.所以即使replace方法是String类中的方法,其本质还是通过StringBuilder对象来实现的
- StringBuilder(字符串生成器)类
StringBuilder类实例化的对象,是一个长度可变的字符序列.通过它,能够大大提高频繁对字符串添加,修改等操作的效率,因为其长度是可变的,去掉了频繁的newString对象,创建内存等无意义的操作.
我们可以通过StringBuilder类中的提供的方法来解决字符串问题,其效率会高上很多.
StringBuilder类实例化的对象默认长度为16个字符,当附加内容超出是,它会自动增加长度以用来容纳追加内容.
append(content)方法
该方法用于向字符串生成器中追加内容.其参数可以是任何类型的数据或对象.
StringBuilder builder = new StringBuilder();
// SringBuildr类中的append方法,追加内容,相当于在其末尾添加.
System.out.println(builder.append("abcdef"));
- insert(int offset arg)方法,
该方法用于向StringBuilder对象中指定的位置添加指定内容.
参数offst为插入位置(其大小必须大于等于0,小于等于对象的长度)
参数arg为插入内容,可以是任何类型的数据或对象.
//StringBuilder类中的instert方法(插入内容)
System.out.println(builder.insert(2," this is instert String "));
- delete(int start,int end)方法
用来移除对象中的字符,参数为开始位置,结束位置.会检索移除他们之间的所有字符.
StringBuilder builder = new StringBuilder();
builder.append("abcdef");
System.out.println(builder.delete(1,5));
System.out.println(builder.length());

可以看出,delete方法,不仅是移除其中的字符,而且是会释放掉其空间的,删除掉长度的,毕竟StringBuilder类对象是一个长度可变的字符序列.
这里还需要注意到的一点就是,StringBuild类对象的赋值,并不能通过=来得到,而是需要通过append方法来向对象里面追加内容的方法赋值的
- 源码
package java01.day_4_12;
/**
* @outhor xiaoshe
* @date 2019/4/12 - @time 19:08
*可变的String序列.
*在我们使用String创建字符串对象后,其长度就是已经固定的了.
* 虽然通过+符号可以达到附加字符串的目的,但通过+号其实还是新建了一个String实例对象.
* 相当于是两个String对象的并列输出.
*
* java提供的StringBuilder类,其实例化的对象是一个动态可变的字符串.
*/
public class sty_StringBulder {
public static void main(String[] args) {
sty_StringBulder stringBulder = new sty_StringBulder();
stringBulder.aString();
stringBulder.aStringBuilder();
}
private void aString(){
String astr = "小舍先生";
System.out.println(astr.replace("先生","女士"));
}
private void aStringBuilder(){
StringBuilder builder = new StringBuilder();
// SringBuildr类中的append方法,追加内容,相当于在其末尾添加.
System.out.println(builder.append("abcdef"));
//StringBuilder类中的instert方法(插入内容)
System.out.println(builder.insert(2," this is instert String "));
System.out.println(builder.length());
//StringBuilder类中的delete方法
System.out.println(builder.delete(1,5));
System.out.println(builder.length());
}
}
- 结果

更新时间:
20194-12
20:29
[java初探外篇]__关于StringBuilder类与String类的区别的更多相关文章
- [Java初探外篇]__关于正则表达式
正则表达式通常用于判断语句之中,用来检测一段字符串是否满足某一个格式.在日常生活中被广泛的用于各种用户输入信息的检测上. 而正则表达式实际上是一些具有特殊意义的字符序列.通过这些特殊字符构成的特殊序列 ...
- [Java初探外篇]__关于时间复杂度与空间复杂度
前言 我们在前面的排序算法的学习中了解到了,排序算法的分类,效率的比较所使用到的判断标准,就包括时间复杂度和空间复杂度,当时因为这两个定义还是比较难以理解的,所以决定单独开一篇文章,记录一下学习的过程 ...
- 【java初探外篇01】——关于Java修饰符
本文记录在学习Java语言过程中,对碰到的修饰符的一些疑问,在这里具体的拿出来详细学习和记录一下,以作后续参考和学习. Java修饰符 Java语言提供了很多修饰符,但主要分两类: 访问修饰符 非访问 ...
- 【Java初探外篇02】——关于静态方法与实例方法
在Java的学习中,我们知道,方法的使用是不可或缺的重要部分,在我们编写第一个Java程序hello world的时候,我们就要开始使用主方法main():它就是一个静态方法(static metho ...
- [java初探总结篇]__java初探总结
前言 终于,java初探系列的学习,要告一阶段了,java初探系列在我的计划中是从头学java中的第一个阶段,知识主要涉及java的基础知识,所以在笔记上实在花了不少的功夫.虽然是在第一阶段上面花费了 ...
- Java Object类 和 String类 常见问答 6k字+总结
写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...
- C#中 StringBuilder类 与 String类的区别---(转)
在找工作的时候,去了些公司,避免不了要面试和笔试.不过一般最起初的是笔试.我印象中有这样有一道题目:StringBuilder类与 String类的区别?那时候我不太清楚这两个类的区别,今天在看代 ...
- Java的常用类——Object类、String类
Java的JDK中提供给我们很多封装好的类就是Java API,可以直接调用. Java 的API(API: Application(应用) Programming(程序) Interface(接口) ...
- Hadoop: Text类和String类的比较
一般认为Text类和String类是等价的,但二者之间其实存在着不小差别: 以<Hadoop权威指南>中的案例为例,给定字符串 String s = "\u0041\u00DF ...
随机推荐
- python的基本用法(一)
1.什么变量,什么是数据类型? 变量就是用来存放东西的, 数据类型:字符串str,整数int,浮点数(小数)float type()函数用来检验数据格式的类型 2.什么是for循环,什么是while循 ...
- kalman滤波(二)---扩展kalman滤波[EKF]的推导
一.状态估计的解释 我们知道每个方程都受噪声的影响,这里把位姿x和路标y看成服从某种概率分布的随机变量.因此我们关心的问题就变成了:当我们已知某些运动数据u和观测数据z时,如何确定状态量x,y的分布? ...
- Java最小化镜像制作
下载Oracle官网的JRE包,最终下载的包如下: jre-8u181-linux-x64.tar.gz 解压JRE包并删除不必要的文件 #解压 tar xf jre-8u181-linux-x64. ...
- ScrollView嵌套Linearlayout显示不全的解决办法
以为ScrollView只能嵌套一个元素,所以把几个控件都包裹在了一个LinearLayout中了.但是发现底部显示不全,滑动不到最底下. 代码: <ScrollView android:id= ...
- To handling editor letter
一般崔稿信写法: Dear Editor: Sorry for disturbing you. We’re not sure if it is the right time to contact yo ...
- 2019.02.14 codechef Chef at the Food Fair(线段树+泰勒展开)
传送门 题意:现在有nnn个位置,每个位置上有一个值aia_iai. 要求支持如下两种操作: 区间乘vvv 求区间的(1−ai)(1-a_i)(1−ai)之积 思路: 考虑转换式子: Ans=∏i ...
- 走进JDK(八)------AbstractSet
说完了list,再说说colletion另外一个重要的子集set,set里不允许有重复数据,但是不是无序的.先看下set的整个架构吧: 一.类定义 public abstract class Abst ...
- java内存模型和垃圾回收(收藏)
java内存模型: https://www.cnblogs.com/handsomeye/p/5442879.html java垃圾回收 http://www.cnblogs.com/handsome ...
- TensorFlow --playground游乐场
TensorFlow游乐场官网http://playground.tensorflow.org(国内需要梯子才能访问) 游乐场的神经网络结构有三层,第一层为输入层,输入的是特征向量(描述问题特征的向量 ...
- Jersey RESTful WebService框架学习(八)文件下载防乱码
最近在做下载时候 不同浏览器下载的文件一直出现乱码,不知道怎么设置文件的编码,百度许久,找到一个解决办法如下 /** * 文件下载 * @param request * @return */ @GE ...