Java基础——数组应用之StringBuilder类和StringBuffer类
接上文:Java基础——数组应用之字符串String类
一、StringBuffer类
StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。
所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。
在StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能是完全一样的。
但是有一个最显著的区别在于,对于StringBuffer对象的每次修改都会改变对象自身,这点是和String类最大的区别。
另外由于StringBuffer是线程安全的,所以在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。
1、StringBuffer对象的初始化
StringBuffer对象的初始化不像String类的初始化一样,Java提供的有特殊的语法,而通常情况下一般使用构造方法进行初始化。
例如:
StringBuffer s = new StringBuffer();
这样初始化出的StringBuffer对象是一个空的对象。
如果需要创建带有内容的StringBuffer对象,则可以使用:
StringBuffer s = new StringBuffer(“abc”);
这样初始化出的StringBuffer对象的内容就是字符串”abc”。
需要注意的是,StringBuffer和String属于不同的类型,也不能直接进行强制类型转换,下面的代码都是错误的:
StringBuffer s = “abc”; //赋值类型不匹配
StringBuffer s = (StringBuffer)”abc”; //不存在继承关系,无法进行强转
StringBuffer对象和String对象之间的互转的代码如下:
String s = “abc”;
StringBuffer sb1 = new StringBuffer(“123”);
StringBuffer sb2 = new StringBuffer(s); //String转换为StringBuffer
String s1 = sb1.toString(); //StringBuffer转换为String
2、StringBuffer的常用方法
StringBuffer类中的方法主要偏重于对于字符串的变化,例如追加、插入和删除等,这个也是StringBuffer和String类的主要区别。
a、append方法
public StringBuffer append(boolean b)
该方法的作用是追加内容到当前StringBuffer对象的末尾,类似于字符串的连接。调用该方法以后,StringBuffer对象的内容也发生改变,例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.append(true);
则对象sb的值将变成”abctrue”。
使用该方法进行字符串的连接,将比String更加节约内容,例如应用于数据库SQL语句的连接,例如:
StringBuffer sb = new StringBuffer();
String user = “test”;
String pwd = “123”;
sb.append(“select * from userInfo where username=“)
.append(user)
.append(“ and pwd=”)
.append(pwd);
这样对象sb的值就是字符串“select * from userInfo where username=test and pwd=123”。
b、deleteCharAt方法
public StringBuffer deleteCharAt(int index)
该方法的作用是删除指定位置的字符,然后将剩余的内容形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“Test”);
sb. deleteCharAt(1);
该代码的作用删除字符串对象sb中索引值为1的字符,也就是删除第二个字符,剩余的内容组成一个新的字符串。所以对象sb的值变为”Tst”。
还存在一个功能类似的delete方法:
public StringBuffer delete(int start,int end)
该方法的作用是删除指定区间以内的所有字符,包含start,不包含end索引值的区间。例如:
StringBuffer sb = new StringBuffer(“TestString”);
sb. delete (1,4);
该代码的作用是删除索引值1(包括)到索引值4(不包括)之间的所有字符,剩余的字符形成新的字符串。则对象sb的值是”TString”。
c、insert方法
public StringBuffer insert(int offset, boolean b)
该方法的作用是在StringBuffer对象中插入内容,然后形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“TestString”);
sb.insert(4,false);
该示例代码的作用是在对象sb的索引值4的位置插入false值,形成新的字符串,则执行以后对象sb的值是”TestfalseString”。
d、reverse方法
public StringBuffer reverse()
该方法的作用是将StringBuffer对象中的内容反转,然后形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.reverse();
经过反转以后,对象sb中的内容将变为”cba”。
e、setCharAt方法
public void setCharAt(int index, char ch)
该方法的作用是修改对象中索引值为index位置的字符为新的字符ch。例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.setCharAt(1,’D’);
则对象sb的值将变成”aDc”。
f、trimToSize方法
public void trimToSize()
该方法的作用是将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费。
总之,在实际使用时,String和StringBuffer各有优势和不足,可以根据具体的使用环境,选择对应的类型进行使用。
StringBuffer概述
StringBuffer是 String缓冲区,它具有如下特点:
1、它是一个容器。可以存储任意类型的元素(数据)。
2、它是多线程安全的。
3、可变长度的。
4、可以对其中存入的内容和长度进行修改。
5、容器通常都会具备一些基本的方法,添加、删除、修改、获取。curd =>create update read delete
6、字符串缓冲区最终还是要转换成字符串数据给别人使用。
StringBuffer方法
增加:
StringBuffer append(value);
StringBuffer insert(index , value);
append和insert方法的区别:
|--append方法只能在尾部追加。
|--insert方法可以在任意位置添加。
sb.append(“a”)..append(9).append(‘a’) 输出结果为:a9a
删除:
StringBuffer delete(start,end);//当end的值大于字符串最大角标,则end等于最大角标
StringBuffer deleteCharAt(index);//删除指定字符
修改:
StringBuffer replace(start,end,str)//替换指定长度的字符串
void setCharAt(index,shar) //替换指定位置的字符
获取:
indexOf//获取字符所在位置
length();//获取字符串长度
charAt();//获取指定角标的字符
substring(start);//获取从指定位置到结尾的字符串
substring(start,end);//获取从start—end-1角标的字符串
StringBuffer setLength(0);清空缓冲区 setLength(index)设置缓冲区的长度。
sb.StringBuffer delete(0,sb.length()) 清空缓冲区
二、StringBuilder类
升级无外乎三件事:
1、提高效率
2、简化代码
3、提高安全
JDK1.5以后,出现了StringBuilder,就是为了提高效率
StringBuilder使用于单线程,可以提高效率。因为它不加锁,不具备多线程的安全性
StringBuilder里面有锁,单线程使用的时候每次都需要判断锁,效率不高。
三、String、StringBuffer、StringBuilder的区别
1. 可变与不可变
String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。
private final char value[];
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。
char[] value;
2. 是否多线程安全
String中的对象是不可变的,也就可以理解为常量,显然线程安全。
AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。看如下源码:
public synchronized StringBuffer reverse() {super.reverse();return this; }public int indexOf(String str) {return indexOf(str, 0); //存在 public synchronized int indexOf(String str, int fromIndex) 方法 }
StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
3. StringBuilder与StringBuffer共同点
StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)。
抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。
StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(...)。只是StringBuffer会在方法上加synchronized关键字,进行同步。
最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。
相关链接:
黑马程序员_java基础(StringBuffer与StringBuilder)
java中String、StringBuffer、StringBuilder的区别
整理下java中stringBuilder和stringBuffer两个类的区别
探秘Java中的String、StringBuilder以及StringBuffer
Java中关于String类型的10个问题
深入理解Java:String
Java中String类的方法及说明
Java基础——数组应用之StringBuilder类和StringBuffer类相关推荐
- php byte stringbuffer,重拾java基础(十三):String姐妹StringBuffer、StringBuilder总结
重拾java基础(十三):String姐妹StringBuffer.StringBuilder总结 一.StringBuffer类概述buffer:缓冲 2. 字符串缓冲区,跟String非常相似,都 ...
- Java基础之String,StringBuilder,StringBuffer三者的区别
Java基础之String,StringBuilder,StringBuffer三者的区别 目录 运行速度方面 线程安全方面 小结 1. 运行速度方面 运行速度,在这方面运行速度快慢为:StringB ...
- 【JAVA SE】第十章 String类、StringBuffer类和StringBuilder类
第十章 String类.StringBuffer类和StringBuilder类 文章目录 第十章 String类.StringBuffer类和StringBuilder类 一.String类 1.创 ...
- Java基础数组编写酒店管理系统
文章目录 Java基础数组编写酒店管理系统 需求说明: 实现代码: ①酒店类(Hotel.java) ②房间类(Room.java) ③酒店管理测试类(HotelMgtSystem.java) 测试结 ...
- Java基础---数组练习(最大值、最小值的索引)
Java基础–数组练习 1.将一维数组的遍历,封装成方法public static void arrayBianli(int[] arr) {for(int i = 0;i<arr.length ...
- 一大波Java来袭(四)String类、StringBuilder类、StringBuffer类对照
本文主要介绍String类.StringBuffer类.StringBuilder类的差别 : 一.概述 (一)String 字符串常量.可是它具有不可变性,就是一旦创建,对它进行的不论什么改动操作 ...
- Java基础之面向对象的概念 继承---组合----枚举类
Java基础之面向对象的概念 继承---组合----枚举类 本章作为面向对象概念的最后一篇,但是作为一名java程序员在面向对象的这条路上还很长. 一.继承与组合简介 继承是实现类重用的重要手段,但是 ...
- Java基础篇——字符串处理(String,StringBuffer,StringBuild)
提前说明本次的文章很长但是很有用,有耐心看完的必定不是凡人,必定会有很大的收获.本人在总结的过程中也收获了很多的知识,希望我们可以一起学习.写下这篇文章完全是抱着可以帮助到他人的态度. 虽然要写出很高 ...
- Java常用类库(Object类、String类、StringBuffer类、包装类、Math类、System类)详解
常用类库 java.lang java.lang包下放置了Java开发中常用的类和接口,所以为简化该包下类的使用,java.lang包下的类在使用时不需要导入这些类 java.lang包下常用类有: ...
最新文章
- java 实现hashmap_Java集合(十)实现Map接口的HashMap
- c++ 重载 重写_Java | 深入理解方法调用的本质(含重载与重写区别)
- Java 字节和字符流的读写+Buffered
- Linux IO 测试工具 fio命令
- 缓存雪崩,缓存穿透解决方案
- dw向右滚动字幕HTML,DW滚动文字代码肿么添加?
- 离线地图瓦片下载工具
- 小程序 轮播图之自动适应宽高度
- 全国计算机三级网络技术题库南开,计算机三级网络技术上机部分(南开100题题库).doc...
- 计算机审计实验一计划阶段,审计实验1.ppt
- 黑马程序员-学习日志-文件的合并
- 关于Jenkins下载代码失败,“Error cloning remote repo ‘origin‘“
- 关于BFS和dijkstra(2019.04.20)
- [转]Maxima笔记
- Unity3D坦克大战游戏开发——学习笔记(中)
- Altium_Designer中英文技术词汇对照
- Python爬虫——下载音乐
- python手机编程输入法_用Python写一个拼音输入法
- html3D效果可以在手机打开吗,HTML手机怎么打开
- 使用WinSCP连接阿里云轻量服务器
热门文章
- 全局变量及其含义php,php Server:php超全局变量Server的含义与用法示例
- 7-71 爬动的蠕虫 (15 分)
- 女生学师范还是计算机,本人专业是计算机科学与技术师范类,女生,不知道是考研还是工作什么的,今年开学大三,希望大家提点意见...
- JAVA输出1 10与5相乘的结果_完美起航-用java数组展示计算机的多位数相乘
- HDU 6581 Vacation
- # 20180908 2018-2019-2 《密码与安全新技术专题》第9周作业
- C#窗体在任务栏对窗体放大或缩小
- [Java面经] 关于面试的二三事.
- Andorid学习笔记(ADT)-LogCat日志调试工具
- bzoj1334 [Baltic2008]Elect