JAVA-StringBuilder和StringBuffer

一、认识String类

1.认识

String在Java中是字符串类型,但与其他类型不同。它是一个类,可以创建对象的类。与int、char等自待类型有些许不同。但它仍然是java提供的一种类型。

 类中有4个属性,这里主要认识一下value属性。它是实际存放字符串的引用。那么我们来看一下源码:

2.String的不可变性

可以看到value数组被final修饰,那么他里面的值是不可以变的。但是java又提供了非常多对String类操作的方法,对里面的value数组进行更改。但是实际上,他都是创建一个新的String类对其进行操作,并返回新的String类。

这样会有一个非常大的问题,有这样一个代码:

public static void main(String[] args) {String array = "a";for (int i = 0; i < 1000; i++) {//他在这里会不停的发生创建新的对象//并进行拼接//然后再返回新的对象array += i;}System.out.println(array);}

这会大大提升时间空间复杂度

那么以后在使用字符串并且,对字符串进行大量操作,或者不想创建新的String类的时候可以使用StringBuilder和StringBuffer

二、StringBuilder和StringBuffer

1.StringBuilder和Strinig的区别

这里使用StringBuilder进行对比

正常使用StirngBuilder进行拼接:

public static void main(String[] args) {StringBuilder s = new StringBuilder("a");for (int i = 0; i < 1000; i++) {s.append(i);//想当与String的+=}System.out.println(s.toString());
}

用StringBuilder模拟Stirng进行拼接:

    public static void main(String[] args) {StringBuilder s1 = new StringBuilder("a");for (int i = 0; i < 1000; i++) {StringBuilder tmp = new StringBuilder("");tmp = s1.append(i);}System.out.println(s1.toString());}

创建类本来就是一个复杂的过程,如果使用String他会创建1000次,那速度肯定是大大降低。

StringBuffer也是跟StringBuilder相同的操作,那StringBuilder和StringBuffer有哪些区别呢?这也是面试常考题

2.String、StringBuffer、StringBuilder的区别

  1. String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
  2. StringBuffer与StringBuilder大部分功能是相似的
  3. StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作

这个第3项给大家解释一下:想要真正了解这个东西需要多线程的理解,这里给大家简单解释一下。

一边看图一边看我解释:

厕所可以看作是一种资源吧

StringBuffer更像家里的厕所,是有锁的。你在上厕所(你在使用资源)别人是进不来的。

StirngBuilder更像是公共场所,没有锁想进来就进来,那肯定没有家里的厕所有安全感。

所以:StringBuffer是安全的,StringBuilder是不安全的。但目前我们写的程序都是单线程的

3.String、StringBuffer、StringBuilder的运行时间区别

使用System.currentTimeMillis()方法可以获取当前时间的一个毫秒数。

用 当前时间-指向前时间 = 时间差

public static void main(String[] args) {long start = System.currentTimeMillis();//获得当前时间毫秒数String s = "";for(int i = 0; i < 100000; ++i){s += i;}long end = System.currentTimeMillis();System.out.println("String" + (end - start));start = System.currentTimeMillis();StringBuffer sbf = new StringBuffer("");for(int i = 0; i < 100000; ++i){sbf.append(i);}end = System.currentTimeMillis();System.out.println("StringBuffer" + (end - start));start = System.currentTimeMillis();StringBuilder sbd = new StringBuilder();for(int i = 0; i < 100000; ++i){sbd.append(i);}end = System.currentTimeMillis();System.out.println("StringBuilder" + (end - start));}

 结果:

可以看到String与StirngBuilder和StringBuffer的区别是巨大的。但这里并没有体现出StirngBuilder和StringBuffer之间的差距,可能是现在做了优化。不过在不涉及多线程的时候推荐使用StirngBuilder要更快一点。

三、StringBuilder和StringBuffer的常用方法

想要了解String常用方法的可以看我这篇博客:String类和String类常用方法-CSDN博客

1. StringBuff append(String str) 拼接字符串

StringBuff append(String str)在尾部追加,相当于String的+=,可以追加:boolean、char、char[]、 double、float、int、long、Object、String、StringBuff的变量
public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("");int[] arr = new int[]{1,2,3,4,5};stringBuilder.append("a");stringBuilder.append(1);stringBuilder.append(1.5);stringBuilder.append('c');for (int a: arr) {stringBuilder.append(a);}System.out.println(stringBuilder.toString());//a11.5c12345
}

2.char charAt(int index) 获取index位置的字符

  public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("hello");System.out.println(stringBuilder.charAt(0));//hSystem.out.println(stringBuilder.charAt(-1));//异常System.out.println(stringBuilder.charAt(stringBuilder.length()));//异常}

3.int length() 获取字符串的长度

 public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("hello");System.out.println(stringBuilder.length());//5}

4.int capacity() 获取底层保存字符串空间总的大小

public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("hello");System.out.println(stringBuilder.capacity());//21
}

 

5.void ensureCapacity(int mininmumCapacity) 扩容

public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("hello");System.out.println(stringBuilder.capacity());//21stringBuilder.ensureCapacity(30);System.out.println(stringBuilder.capacity());//44 = 21 * 2 + 2
}

6.void setCharAt(int index, char ch) 将index位置的字符设置为ch

public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("hello");stringBuilder.setCharAt(2,'a');//注意要输入char类型System.out.println(stringBuilder);//healo
}

 

indexOf函数找不到相应的字符串返回-1

7.int indexOf(String str) 返回str第一次出现的位置

public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("aabbccaabb");System.out.println(stringBuilder.indexOf("bb"));//2
}

8.int indexOf(String str, int fromIndex) 从fromIndex位置开始查找str第一次出现的位置

public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("aabbccaabb");System.out.println(stringBuilder.indexOf("bb",4));//8
}

9.int lastIndexOf(String str) 返回最后一次出现str的位置

public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("aabbccaabb");System.out.println(stringBuilder.lastIndexOf("aa"));//6
}

原理是从后往前找

10.int lastIndexOf(String str, int fromIndex) 从fromIndex位置开始找str最后一次出现的位置

原理是从指定位置从后向前找
public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("aabbccaabbaa");System.out.println(stringBuilder.lastIndexOf("aa",5));//0System.out.println(stringBuilder.lastIndexOf("ac",5));//-1找不到
}

11.StringBuff insert(int offset, String str) 在offset位置插入:八种基类类型 & String类型 & Object类型数据

public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("aabbccaabbaa");//aaxxxbbccaabbaa//不会覆盖原有字符,原位置字符全部往后移System.out.println(stringBuilder.insert(2, "xxx"));//aaxxxbbccaabbaaxxx,证明可以当追加函数使用System.out.println(stringBuilder.insert(stringBuilder.length(), "xxx"));//报错//说明,要紧跟字符串末尾追加System.out.println(stringBuilder.insert(stringBuilder.length()+1, "xxx"));}

12.StringBuffer deleteCharAt(int index) 删除index位置字符

 public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("aabbccaa");System.out.println(stringBuilder.deleteCharAt(2));//aabccaa}

13.StringBuffer delete(int start, int end) 删除[start, end)区间内的字符

注意:左开右闭[ ,)

public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("aabbccaa");System.out.println(stringBuilder.delete(2, 4));//aaccaa
}

 

14.StringBuffer replace(int start, int end, String str) 将[start, end)位置的字符替换为str

 注意:左开右闭[ ,)

public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("aabbccaa");System.out.println(stringBuilder.replace(2, 4,"xx"));//aaxxccaaSystem.out.println(stringBuilder.replace(2, stringBuilder.length() + 1,"xx"));//aaxx
}

最后一种虽然可以指向成功但绝对不建议这么写

15.String substring(int start) 从start开始一直到末尾的字符以String的方式返回 

public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("aabbccaa");System.out.println(stringBuilder.substring(2));//bbccaaSystem.out.println(stringBuilder.substring(stringBuilder.length()));//什么都不打印System.out.println(stringBuilder.substring(stringBuilder.length() + 1));//报错
}

16.String substring(int start,int end) 将[start, end)范围内的字符以String的方式返回

public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("aabbccaa");//这里不报错是因为左开,右闭System.out.println(stringBuilder.substring(2, stringBuilder.length()));//bbccaa
}

17. StringBuffer reverse() 反转字符串

public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("aabbccaa");//这里不报错是因为左开,右闭System.out.println(stringBuilder.reverse());//aaccbbaa
}

18.String toString() 将所有字符按照String的方式返回

public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("aabbccaa");//StringBuilder 以 String 类型返回System.out.println(stringBuilder.toString());//aabbccaa
}

这里要着重讲一下,原本是StringBuilder类型,要转换为String类型,就可以用toString。

 注意:String和StringBuilder类不能直接转换。如果要想互相转换,可以采用如下原则:

  • String变为StringBuilder: 利用StringBuilder的构造方法或append()方法
  • StringBuilder变为String: 调用toString()方法。

 

四、面试题

1.

String str = new String("ab"); // 会创建多少个对象
1.会创建一个对象String str = new String("a") + new String("b"); // 会创建多少个对象
2.a创建一个对象 + b创建一个对象 + 将他们拼接起来需要一个对象 = 3个对象一共创建了4个对象

 2.String、StringBuffer、StringBuilder的区别

  • String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
  • StringBuffer与StringBuilder大部分功能是相似的 StringBuffer采用同步处理,属于线程安全操作;
  • 而StringBuilder未采用同步处理,属于线程不安全操 作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/432211.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024 IDEA软件 部署tomcat 十二步 运行web页面(html类似的)(中英文对照版本)新手小白易上手

目录 一、准备工作&#xff08;三必备&#xff09;&#xff1a; 1、自己的web项目 2、idea软件&#xff08;我是2023.1.2版本&#xff09; 3、tomcat X.X版本 二 、正式开始步骤&#xff0c;不废话&#xff01;&#xff01; 1、 点击菜单栏中 “File”&#xff08;文件&…

NASA数据集:ATLAS/ICESat-2 L3A 海洋地表高度 V006

ATLAS/ICESat-2 L3A Ocean Surface Height V006 目录 简介 摘要 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 简介 该数据集&#xff08;ATL12&#xff09;包含全球开阔洋&#xff08;包括无冰季节冰区和近海岸地区&#xff09;的沿轨海面高度。 还提供了高度…

C++ 9.25

手动实现栈、和队列 stack #include <iostream> using namespace std; class Stack { private: int* arr; // 存储栈元素的数组 int top; // 栈顶索引 int capacity; // 栈的容量 public: Stack(int size) { arr new int[size]; c…

FLStudio21Mac版flstudio v21.2.1.3430简体中文版下载(含Win/Mac)

给大家介绍了许多FL21版本&#xff0c;今天给大家介绍一款FL Studio21Mac版本&#xff0c;如果是Mac电脑的朋友请千万不要错过&#xff0c;当然我也不会忽略掉Win系统的FL&#xff0c;链接我会放在文章&#xff0c;供大家下载与分享&#xff0c;如果有其他问题&#xff0c;欢迎…

基于Python大数据的音乐推荐及数据分析可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

【吊打面试官系列-MySQL面试题】MySQL 数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL 数据库作发布系统的存储&#xff0c;一天五万条以上的增量&#xff0c;预计运维三年,怎么优化&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; MySQL 数据库作发布系统的存储&#xff0c;一天五万条以上的增量…

二模--解题--101-110

文章目录 10.沟通管理101、 [单选] 在项目执行阶段&#xff0c;项目经理意识到项目干系人一直延迟答复敏感性电子邮件。项目经理应该怎么做&#xff1f; 4.整合管理102、 [单选] 在编制项目章程用于批准时&#xff0c;项目经理发现有两名干系人对关键可交付成果的期望有冲突。若…

【读写分离?聊聊Mysql多数据源实现读写分离的几种方案】

文章目录 一.什么是MySQL 读写分离二.读写分离的几种实现方式(手动控制)1.基于Spring下的AbstractRoutingDataSource1.yml2.Controller3.Service实现4.Mapper层5.定义多数据源6.继承Spring的抽象路由数据源抽象类&#xff0c;重写相关逻辑7. 自定义注解WR&#xff0c;用于指定当…

Linux-TCP重传

问题描述&#xff1a; 应用系统进行切换&#xff0c;包含业务流量切换&#xff08;即TongWeb主备切换&#xff09;和MYSQL数据库主备切换。首先进行流量切换&#xff0c;然后进行数据库主备切换。切换后发现备机TongWeb上有两批次慢请求&#xff0c;第一批慢请求响应时间在133…

【探索智谱AI的CogVideoX:视频生成的新前沿】

2024年8月6日&#xff0c;智谱AI宣布其开源视频生成模型CogVideoX&#xff0c;激发了开发者的创造力和对新技术的期待。 一、CogVideoX模型概述 CogVideoX 是一款先进的视频生成工具&#xff0c;可基于最长 226 个 token 的提示生成视频&#xff0c;时长可达 6 秒&#xff0c;…

0基础学习PyTorch——时尚分类(Fashion MNIST)训练和推理

大纲 环境准备安装依赖下载训练集训练定义模型训练加载训练集定义损失函数和优化器训练模型保存模型完整文件 推理加载模型加载并预处理本地文件推理完整文件 代码地址参考资料 时尚分类是PyTorch官方文档中推荐的案例。本文将拆解这个案例&#xff0c;进行部署以及测试。 环境…

电路板上电子元件检测系统源码分享

电路板上电子元件检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comp…

SpringCloud源码:客户端分析(二)- 客户端源码分析

背景 我们继续分析EurekaClient的两个自动化配置类&#xff1a; 自动化配置类功能职责EurekaClientAutoConfiguration配置EurekaClient确保了Eureka客户端能够正确地&#xff1a;- 注册到Eureka服务端- 周期性地发送心跳信息来更新服务租约- 下线时通知Eureka服务端- 获取服务实…

TypeScript 设计模式之【建造者模式】

文章目录 **建造者模式**&#xff1a;打造你的梦想之屋建造者的秘密建造者有什么利与害&#xff1f;如何使用建造者搭建各种房子代码实现案例建造者模式的主要优点建造者模式的主要缺点建造者模式的适用场景总结 建造者模式&#xff1a;打造你的梦想之屋 假设你想要一栋完美的…

SpringBoot代码实战(MyBatis-Plus+Thymeleaf)

构建项目 修改pom.xml文件&#xff0c;添加其他依赖以及设置 <!--MyBatis-Plus依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.6</version><…

LiveGBS流媒体平台GB/T28181功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大

LiveGBS流媒体平台GB/T28181功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大 1、直播播放2、录像播放3、搭建GB28181视频直播平台 1、直播播放 国标设备-》查看通道-》播放 &#xff0c;左键单击可以拉取矩形框&#xff0c;放大选中的范围&#xff0c;释…

序列化流(对象操作输出流)反序列化流(对象操作输入流)

可以把Java中的对象写到本地文件中 序列化流&#xff08;对象操作输出流&#xff09; 构造方法 成员方法 使用对象输出流将对象保存到文件会出现NotSerializableException异常 解决方案&#xff1a;需要让Javabean类实现Serializable接口 Student package myio;import java.…

家政服务预约系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;客户管理&#xff0c;员工管理&#xff0c;家政服务管理&#xff0c;服务预约管理&#xff0c;员工风采管理&#xff0c;客户需求管理&#xff0c;接单信息管理 微信端账号功能包括&#xff1a;系统首…

MySQL_子查询

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

力扣最热一百题——寻找重复数(中等)

目录 题目链接&#xff1a;287. 寻找重复数 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示&#xff1a; 解法一&#xff1a;暴力搜寻 Java写法&#xff1a; 运行时间 解法二&#xff1a;排序搜寻 Java写法&#xff1a; 运行时间 C写法&#xff1a; 运…