String,StringBuilder,StringBuffer

String,StringBuffer,StringBuilder

String类

概念:String是不可变类,即一旦一个String对象被创建,包含在这个对象中的字符序列是不可改变的,直至该对象被销毁,并且String类是final类,不能有子类。

常用方法:

方法名功能
concat(String str)在末尾追加,并返回新的字符串
substring(int beginIndex)从开始下标处截取到字符串末尾,并返回新的字符串
substring(int beginIndex,int endIndex)从开始下标处(包含)截取到结束下标处(排他),并返回新的字符串
toLowerCase()转小写,并返回新的字符串
toUpperCase()转大写,并返回新的字符串
trim()去除首尾空格,并返回新的字符串
replace(char oldChar, char newChar)替换字符,并返回新的字符串
replaceAll(String old, String news)替换字符串,并返回新的字符串
replaceFirst(String old, String news)替换第一次出现的字符串,并返回新的字符串
equals(String str)判断两个字符串是否相同
equalsIgnoreCase(String str)判断两个字符串是否相同(不区分大小写)
startsWith(String str)判断字符串是否以某个字符串开头
endsWith(String str)判断字符串是否以某个字符串结尾
indexOf(String str)查询出子字符串在字符串中第一次出现的下标
lastIndexOf(String str)查询出子字符串在字符串中最后一次出现的下标
charAt(int index)获取指定下标上的字符

代码实现:

public class Test01 {public static void main(String[] args) {String str = "123abc";str = str.concat("DEF123");System.out.println(str);//123abcDEF123str = str.substring(2);System.out.println(str);//3abcDEF123str = str.substring(1, 7);System.out.println(str);//abcDEFstr = str.toLowerCase();System.out.println(str);//abcdefstr = str.toUpperCase();System.out.println(str);//ABCDEFstr = "   123   abc   DEF   123         ";str = str.trim();System.out.println(str);//123   abc   DEF   123str = str.replace('2', '6');System.out.println(str);//163   abc   DEF   163str = str.replaceAll("163", "666888");System.out.println(str);//666888   abc   DEF   666888str = str.replaceFirst("666", "7777");System.out.println(str);//7777888   abc   DEF   666888str = str.replaceAll(" ", "");System.out.println(str);//7777888abcDEF666888System.out.println("判断两个字符串是否相同(区分大小写):" + str.equals("7777888abcDEF666888"));//trueSystem.out.println("判断两个字符串是否相同(不区分大小写):" + str.equalsIgnoreCase("7777888ABCDEF666888"));//trueSystem.out.println("判断字符串是否以某个字符串开头:" + str.startsWith("777"));//trueSystem.out.println("判断字符串是否以某个字符串结尾:" + str.endsWith("666888"));//trueSystem.out.println("查询出子字符串在字符串中第一次出现的下标:" + str.indexOf("88"));//4System.out.println("查询出子字符串在字符串中最后一次出现的下标:" + str.lastIndexOf("88"));//17System.out.println("获取指定下标上的字符:" + str.charAt(7));//aSystem.out.println(str);//7777888abcDEF666888}
}

其他类型转String类型

方法一:valueOf()方法
System.out.println(String.valueOf(100));//int -> String
System.out.println(String.valueOf(123.123));//double -> String
System.out.println(String.valueOf('a'));//char -> String
System.out.println(String.valueOf(true));//boolean -> String
System.out.println(String.valueOf(new char[]{'a','b','c'}));//char[] -> String
方法二:直接拼接一个空串
System.out.println(100 + "");
System.out.println(123.123 + "");
System.out.println('a' + "");
System.out.println(true + "");

String创建对象个数

//以下创建了几个对象?
String str1 = "abc";
String str2 = "abc";
System.out.println(str1);
System.out.println(str2);
答案:1个
原因:常量池里面的数据是唯一的
//下列代码会创建几个对象
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1);
System.out.println(str2);
答案:3个
原因:在类加载时,会把字面值常量(abc)加载到常量池,然后上述代码又new2个对象,因此一共是3个对象
//下列代码会创建几个对象
String a = "hello"+"abc";
答案:1个
原因:在编译时会优化,等价于String a = "helloabc";
//下列代码会创建几个对象
String a = "hello";
String b = "abc";
String c = a + b;
答案:3个
原因:1.先创建一个StringBuilder ab = StringBuilder()2.执行sb.append("hello");3.执行sb.append(“abc”);4.调用StringBuilder.java类的toString()方法,并且return new String()

图解:

在这里插入图片描述

String拼接创建对象

String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2);
结果:true
原因:常量池中的对象唯一
String str1 = "abc";
String str3 = "ab" + "c";
System.out.println(str1 == str3);
final String s1 = "ab";
final String s2 = "c";
String str4 = s1 + s2
System.out.println(str1 == str4)
结果:都为true
原因:两个常量在编译时会直接拼接
String str1 = "abc";
String s3 = "ab";
String s4 = "c";
String str5 = s3 + s4;
System.out.println(str1 == str5)
结果:false
原因:底层实现为:String str5 = (new StringBuilder(String.valueOf(s3))).append(s4).toString()

Stringbuilder类

概念:代表可变的字符序列,称为字符串缓冲区,预先申请一块内存,存放字符序列,如果字符序列满了,会重新改变缓存区的大小,以容纳更多的字符序列。

常用方法:

方法名功能
append(String str)末尾追加字符串
insert(int index,String str)将字符串插入到指定下标的位置
setCharAt(int index, Char char)替换指定下标上的字符
replace(int beginIndex,int endIndex,String str)替换开始下标处(包含)到结束下标处(排他)的字符串
deleteCharAt(int index)删除指定下标上的字符
delete(int beginIndex, int endIndex)删除开始下标处(包含)到结束下标处(排他)的字符串
reverse()反转字符串

代码实现:

public class Test01 {public static void main(String[] args) {StringBuilder sb = new StringBuilder();sb.append("123abc");sb.append("DEF123");System.out.println(sb);//123abcDEF123sb.insert(6, "XXYYZZ");System.out.println(sb);//123abcXXYYZZDEF123sb.setCharAt(6, 'x');System.out.println(sb);//123abcxXYYZZDEF123sb.replace(3, 6, "aabbcc");System.out.println(sb);//123aabbccxXYYZZDEF123sb.deleteCharAt(3);System.out.println(sb);//123abbccxXYYZZDEF123sb.delete(3, 17);System.out.println(sb);//123123sb.reverse();System.out.println(sb);//321321System.out.println(sb.toString());//321321}
}

深入了解StringBuilder

StringBuilder 的底层实现:

abstract class AbstractStringBuilder {//字符容器 - 34//['n','u','l','l','a','a','a','a','a','b','b','b','b','b','c','c','c','c','c'...]char[] value;//有效字符数int count;//24//capacity - 16AbstractStringBuilder(int capacity) {value = new char[capacity];}//str - "cccccccccc"public AbstractStringBuilder append(String str) {if (str == null)return appendNull();int len = str.length();//len - 10ensureCapacityInternal(count + len);//14 + 10//将str下标为0开始的数据添加到value数组count下标的位置,拷贝len长度str.getChars(0, len, value, count);count += len;return this;}private AbstractStringBuilder appendNull() {int c = count;//c - 0ensureCapacityInternal(c + 4);//扩容 -> 0+4final char[] value = this.value;value[c++] = 'n';//value[0] = 'n';value[c++] = 'u';//value[1] = 'u';value[c++] = 'l';//value[2] = 'l';value[c++] = 'l';//value[3] = 'l';count = c;return this;}//minimumCapacity - 24private void ensureCapacityInternal(int minimumCapacity) {// 有溢出意识的代码//if(24 - 16 > 0)if (minimumCapacity - value.length > 0) {//value = Arrays.copyOf(value,34);value = Arrays.copyOf(value,newCapacity(minimumCapacity));}}//面试题:StringBuilder的扩容机制为什么是原来的2倍+2//答:因为怕用户使用new StringBuilder(0)来创建对象,0<<1还是0,所以要加个2//minCapacity - 24private int newCapacity(int minCapacity) {//扩容机制:数组原来长度的2倍+2//int newCapacity = (16 << 1) + 2; --- 34int newCapacity = (value.length << 1) + 2;if (newCapacity - minCapacity < 0) {newCapacity = minCapacity;}return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)? hugeCapacity(minCapacity): newCapacity;}
}
 public final class StringBuffer extends AbstractStringBuilder{public StringBuffer() {super(16);}public StringBuffer(int capacity) {super(capacity);}public StringBuffer(String str) {super(str.length() + 16);append(str);}@Overridepublic synchronized StringBuffer append(String str) {//自动上锁toStringCache = null;super.append(str);return this;}//自动解锁}
//默认长度:10000
//StringBuffer sb = new StringBuffer(10000);//默认长度:"abc".length() + 16
//StringBuffer sb = new StringBuffer("abc");//默认长度:16
StringBuffer sb = new StringBuffer();
String str = null;
sb.append(str);
sb.append("aaaaa");
sb.append("bbbbb");
sb.append("cccccccccc");
System.out.println(sb.toString());

StringBuffer类

​ StringBuffer 类是可变字符串类,创建 StringBuffer 类的对象后可以随意修改字符串的内容。每个 StringBuffer 类的对象都能够存储指定容量的字符串,如果字符串的长度超过了 StringBuffer 类对象的容量,则该对象的容量会自动扩大。所拥有的方法和StringBuilder类相同。

String VS StringBuilder VS StringBuffer

  1. 值的可变性
    • String内部的value值是final修饰的,所以,它是不可变类;因此每次修改String的值,都会在常量池产生一个新的对象。
    • StringBuffer和StringBuilder是可变类,它们在字符串变更的时候,不会创建新的对象。
  2. 线程安全
    • String是不可变类,所以它是线程安全的。
    • StringBuilder不是线程安全的。
    • StringBuffer是线程安全的,因为它的每个操作方法都加了synchronized同步关键字。
  3. 使用选择
    • 如果要操作少量的数据用 String。
    • 多线程操作字符串缓冲区下操作大量数据 StringBuffer。
    • 单线程操作字符串缓冲区下操作大量数据 StringBuilder,因为不用上锁。
  4. 值的可变性
    • String内部的value值是final修饰的,所以,它是不可变类;因此每次修改String的值,都会在常量池产生一个新的对象。
    • StringBuffer和StringBuilder是可变类,它们在字符串变更的时候,不会创建新的对象。
  5. 线程安全
    • String是不可变类,所以它是线程安全的。
    • StringBuilder不是线程安全的。
    • StringBuffer是线程安全的,因为它的每个操作方法都加了synchronized同步关键字。
  6. 使用选择
    • 如果要操作少量的数据用 String。
    • 多线程操作字符串缓冲区下操作大量数据 StringBuffer。
    • 单线程操作字符串缓冲区下操作大量数据 StringBuilder,因为不用上锁。

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

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

相关文章

Debian安装Redis、RabbitMQ、Nacos

安装Redis&#xff1a; 启动Redis、开机自启动 sudo systemctl start redis-server #启动sudo systemctl enable redis-server #开机自启 Redis状态(是否在运行) sudo systemctl status redis-server #查看运行状态 redis-cli ping # 客户端尝试连接 安装RabbitMQ&#xff0c;…

【JavaEE 初阶(五)】文件操作和IO

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多文件操作 目录 1.前言2.认识文件3.文件操作3.1File 属性3.2构造方法3.3File类方法 4.文件内容操作4.1R…

「JavaEE」多线程案例1:单例模式阻塞队列

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;JavaEE &#x1f387;欢迎点赞收藏加关注哦&#xff01; 多线程案例分析 &#x1f349;单例模式&#x1f34c;饿汉模式&#x1f34c;懒汉模式&#x1f34c;指令重排序 &#x1f349;阻塞队列&a…

Matlab|考虑极端天气线路脆弱性的配电网分布式电源和储能优化配置模型

1主要内容 程序主要参考《考虑极端天气线路脆弱性的配电网分布式电源配置优化模型-马宇帆》&#xff0c;针对极端天气严重威胁配电网安全稳定运行的问题。基于微气象、微地形对配电网的线路脆弱性进行分析&#xff0c;然后进行分布式电源接入位置与极端天气的关联性分析&#…

易图讯三维电子沙盘-大数据处理服务

易图讯科技10名高级大数据工程师&#xff0c;高效、快速进行POI、DEM、高清卫星影像、地形地貌、路网、矢量地图等海量大数据处理服务。 免费专业提供POI、AOI、DEM、高清卫星影像、地形地貌、路网、矢量地图等海量大数据处理服务。 1年更新2次POI、高清卫星影像。

Electron学习笔记(四)

文章目录 相关笔记笔记说明 六、数据1、使用本地文件持久化数据(1) 用户数据目录(2) 读写本地文件(3) 第三方库 2、读写受限访问的 Cookie3、清空浏览器缓存 相关笔记 Electron学习笔记&#xff08;一&#xff09;Electron学习笔记&#xff08;二&#xff09;Electron学习笔记…

数据结构-二叉树-红黑树

一、红黑树的概念 红黑树是一种二叉搜索树&#xff0c;但在每个节点上增加一个存储位表示节点的颜色&#xff0c;可以是Red或者BLACK&#xff0c;通过对任何一条从根到叶子的路径上各个节点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出两倍&#xff0c;…

springcloud整合网关(springcloud-gateway) 跨域处理

pom引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- 服务注册 --><dependency><groupId>com.alibaba.cloud</groupId&…

Python 将Excel转换为多种图片格式(PNG, JPG, BMP, SVG)

目录 安装Python Excel库 使用Python将Excel工作表转换为PNG&#xff0c;JPG或BMP图片 使用Python将Excel特定单元格区域转换为PNG&#xff0c;JPG或BMP图片 使用Python将Excel工作表转换为SVG图片 有时&#xff0c;你可能希望以图片形式分享Excel数据&#xff0c;以防止他…

vue3使用setup模式的store报错

** setup store模式 $reset方法报错 ** 顾名思义就是 使用store 使用的是setup 语法模式 不能执行$reset 方法 解决方式&#xff1a; // main.ts import { createPinia } from pinia const pinia createPinia() pinia.use(({ store }) > {const initialState JSON.pars…

美股市场恒生指数冲刺19000点关口 地产股大涨

查查配5月10日电(中新财经记者 谢艺观)5月10日,港股现强势行情,恒生指数盘中一度冲至18993.28点,距离19000点关口仅一步之遥。 美港通证券以其专业的服务和较低的管理费用在市场中受到不少关注。该平台提供了实盘交易、止盈止损、仓位控制等功能,旨在为投资者提供更为全面的投…

.net core WebApi 部署 IIS

安装 IIS 下载需要的 net 版本安装 前往 .net core WebApi 项目打包 Program.cs var builder WebApplication.CreateBuilder(args);// 输出 builder.Services.AddControllers().AddJsonOptions(options > {options.JsonSerializerOptions.PropertyNamingPolicy null;…

怎么做自己的网站

现如今&#xff0c;拥有自己的网站已经成为现代生活中的一种标志。无论是个人博客、在线商店还是企业官网&#xff0c;都可以通过拥有一个网站来展示自己的个性、产品或服务。在这篇文章中&#xff0c;我将分享如何创建和管理自己的网站。 首先&#xff0c;你需要选择一个合适的…

unreal engine5.3.2 Quixel bridge无法登陆

UE5系列文章目录 文章目录 UE5系列文章目录前言一、问题定位二、解决方法 前言 这几天unreal engine5.3.2 Quixel bridge无法登陆&#xff0c;输入epic 账号和密码&#xff0c;然后在输入epic发送的验证码&#xff0c;总是提示登录失败。就算是使用科学上网依然无法登录。而且…

解决 Content type ‘application/json;charset=UTF-8‘ not supported

文章目录 问题描述原因分析解决方案参考资料 问题描述 我项目前端采用vue-elementUi-admin框架进行开发&#xff0c;后端使用SpringBoot&#xff0c;但在前后端登录接口交互时&#xff0c;前端报了如下错误 完整报错信息如下 前端登录接口JS代码如下 export function login(…

出现Duplicate key

解决&#xff1a; 第一种情况&#xff1a; 添加一个字段prjId &#xff0c;和数据库表映射时&#xff0c;映射的字段存在映射关系了。 将第二个 TableField中的prj_num改成prj_id 即可。 第二种情况&#xff1a; 转成map的形式时&#xff1a;key重复了&#xff0c;不知道把值赋…

KAN神经网络简短介绍

KANs简介 Kolmogorov-Arnold Networks (KANs) 是一种创新的神经网络模型&#xff0c;它挑战了传统多层感知器(MLPs)的设计&#xff0c;通过将激活函数从节点转移到边上来提升模型的性能和可解释性。KAN的核心在于&#xff0c;其所有权重参数均被单变量的样条函数代替&#xff…

“数字化叙事的革命:人工智能驱动的创意工具的崛起”

近年来&#xff0c;人工智能 (AI) 改变了我们生活的许多方面&#xff0c;数字故事讲述的世界也不例外。随着人工智能驱动的创意工具的出现&#xff0c;广告商、内容创作者和专业人士现在配备了创新的解决方案来简化他们的工作流程&#xff0c;增强他们的创意输出&#xff0c;并…

vue中使用element的i18n语言转换(保姆式教程-保证能用)

话不多说&#xff0c;先看效果:预览地址: https://sandm00.github.io/i18n-switch/#/ 1、项目中需要使用的插件&#xff0c;vue2或vue3、element、vue-i18n、js-cookie、vuex我是在vue2中使用 npm i element-ui -S npm i js-cookie -S npm i vue-i18n8.28.2 //因为我项目使用…

TeXlive TeXstudio安装指南

TeXlive & TeXstudio安装指南 记上次安装Visual Studio Code (Vscode)配置LaTeX后&#xff0c;由于Overleaf页数太多&#xff0c;项目超过了免费计划的编译时限&#xff08;这两天突然出现这个问题&#xff09;。加上毕设和PPT都是在Overleaf上编译&#xff0c;这两天突然…