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.rhkb.cn/news/326000.html

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

相关文章

251 基于matlab的动态粒子群算法

基于matlab的动态粒子群算法。普通粒子群算法无法感知外界环境的变化&#xff0c;在外界环境发生改变时无法实时进行响应&#xff0c;因而缺乏动态环境寻优能力。在普通粒子群算法基本上通过增加敏感粒子得到一种动态粒子群算法&#xff0c;该算法通过实时计算敏感粒子的适应度…

【Linux】- Linux环境变量[8]

目录 环境变量 $符号 自行设置环境变量 环境变量 环境变量是操作系统&#xff08;Windows、Linux、Mac&#xff09;在运行的时候&#xff0c;记录的一些关键性信息&#xff0c;用以辅助系统运行。在Linux系统中执行&#xff1a;env命令即可查看当前系统中记录的环境变量。 …

论文笔记模版

1. 摘要 1.1 背景 1.2 挑战 1.3 提出新方法 1.4 贡献 2. 引言 2.1 背景&#xff08;引出问题&#xff09; ①介绍大背景&#xff1a; ② 应用场景&#xff1a; ③ 介绍主题&#xff1a; 2.2 引出挑战 一般用图表来展现出我们的挑战&#xff08;直观&#xff0c;解决什…

Weblogic < 10.3.6 ‘wls-wsat‘ XMLDecoder 反序列化漏洞(CVE-2017-10271)

1 漏洞概述 CVE-2017-10271 是一个存在于 Oracle WebLogic Server 10.3.6 以下版本中的 XMLDecoder 反序列化漏洞。此漏洞源于 WebLogic 的 WLS-WebServices 核心组件&#xff0c;该组件使用 XMLDecoder 来解析用户传入的 XML 数据。由于 XMLDecoder 在处理某些特定格式的 XML…

吴恩达 深度学习 神经网络 softmax adam 交叉验证

神经网络中的层&#xff1a;输入层&#xff08;layer 0&#xff09;、隐藏层、卷积层&#xff08;看情况用这个&#xff09;、输出层。&#xff08;参考文章&#xff09; 激活函数&#xff1a; 隐藏层一般用relu函数&#xff1b; 输出层根据需要&#xff0c;二分类用sigmoid&…

算法笔记——数位DP

一、前置知识 1.DP小知识 D P DP DP 是一种算法思想&#xff0c;用递推方程的方式解决问题。但是使用它要满足如下性质&#xff1a; 最优子结构&#xff1a; 子结构优秀&#xff0c;整个就优秀。无后效性&#xff1a;当前决策不会影响后面。 2.DP实现方法 众所周知&#xf…

【解决】Android APK文件安装时 已包含数字签名相同APP问题

引言 在开发Android程序过程中&#xff0c;编译好的APK文件&#xff0c;安装至Android手机时&#xff0c;有时会报 包含数字签名相同的APP 然后无法安装的问题&#xff0c;这可能是之前安装过同签名的APP&#xff0c;但是如果不知道哪个是&#xff0c;无法有效卸载&#xff0c;…

Linux——进程间通信

目录 一、进程通信的初步认识 1.1 进程间通信目的 1.2 进程间通信的种类 管道&#xff08;Pipes&#xff09; System V IPC POSIX IPC 三、管道 3.1 知识铺垫 3.2 匿名管道 3.2.1 基本概念 3.2.2 测试用例&#xff1a; 3.3 管道的行为 3.4 命名管道 3.4.1 基本概念…

生产设备数据管控要怎么做 可以实现精益生产和智能制造?

生产设备在制造过程中会产生多种类型的数据&#xff0c;这些数据对于优化生产流程、提高效率、降低成本和预防性维护等方面至关重要。需要对这些数据进行有效的采集和管理&#xff0c;以实现对生产设备数据管控。 一、生产设备数据类型包括&#xff1a; 设备运行状态数据&…

机器学习周报第三十八周 iTransformer

文章目录 week38 iTransformer摘要Abstract一、文献阅读1. 题目2. abstract3. 网络架构**转置Embedding&#xff1a;****LayerNorm&#xff08;层归一化&#xff09;****Feed-forward network&#xff08;前馈网络&#xff09;****Multivariate-Attention&#xff08;多变量注意…

【Linux 网络】网络编程套接字 -- 详解

⚪ 预备知识 1、理解源 IP 地址和目的 IP 地址 举例理解&#xff1a;&#xff08;唐僧西天取经&#xff09; 在 IP 数据包头部中 有两个 IP 地址&#xff0c; 分别叫做源 IP 地址 和目的 IP 地址。 如果我们的台式机或者笔记本没有 IP 地址就无法上网&#xff0c;而因为…

【UnityUI程序框架】The PureMVC Framework[一]底层源码中文详解

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

推导 模型矩阵的逆转置矩阵求运动物体的法向量

一个物体表面的法向量如何随着物体的坐标变换而改变&#xff0c;取决于变换的类型。使用逆转置矩阵&#xff0c;可以安全地解决该问题&#xff0c;而无须陷入过度复杂的计算中。 法向量变化规律 平移变换不会改变法向量&#xff0c;因为平移不会改变物体的方向。 旋转变换会改…

Python 全栈系列244 nginx upstream 负载均衡 踩坑日记

说明 最初是因为租用算力机(Python 全栈系列242 踩坑记录:租用算力机完成任务)&#xff0c;所以想着做一个负载均衡&#xff0c;然后多开一些服务&#xff0c;把配置写在nginx里面就好了。 一开始租用了一个3080起了一个服务&#xff0c;后来觉得速度不够快&#xff0c;再起了…

基于地平线J6E,「吃蟹者」易航智能重塑高速NOA

作者 |张祥威 编辑 |德新 一批基于地平线J6E的智驾方案将要到来&#xff0c;高速NOA领域很快会变天。 易航智能是这批智驾方案公司中的一家。 近日在北京车展&#xff0c;这家公司推出一套基于地平线J6 E的7V1R方案&#xff0c;可以实现城市记忆领航、高速NOA、记忆泊车、L2…

社交媒体数据恢复:密聊猫

一、概述 密聊猫是一款提供多种优质体验的手机社交聊天软件。通过这款软件&#xff0c;用户可以享受到多种不同的乐趣体验&#xff0c;如真人在线匹配、真实的交友体验等。同时&#xff0c;密聊猫也提供了数据恢复功能&#xff0c;帮助用户找回丢失的数据。 二、数据恢复步骤…

前端Vue架构

1 理解&#xff1a; 创建视图的函数&#xff08;render&#xff09;和数据之间的关联&#xff1b; 当数据发生变化的时候&#xff0c;希望render重新执行&#xff1b; 监听数据的读取和修改&#xff1b; defineProperty&#xff1a;监听范围比较窄&#xff0c;只能通过属性描…

博客互动革命:如何打造活跃读者社区并提升参与度

CSDN 的朋友你们好&#xff0c;我是未来&#xff0c;今天给大家带来专栏【程序员博主教程&#xff08;完全指南&#xff09;】的第 10 篇文章“与读者互动”。本文揭示了提升技术博客参与度的秘诀。从评论互动到社交媒体策略&#xff0c;本文将指导你如何建立强大的读者社区。掌…

blender 为世界环境添加纹理图像

1、打开世界环境配置项 2、点击颜色右侧的黄色小圆&#xff0c;选择环境纹理 3、打开一张天空图像 4、可以通过调整强度/力度&#xff0c;调整世界环境的亮度

传感网应用开发教程--AT指令访问新大陆云平台(ESP8266模块+物联网云+TCP)

实现目标 1、熟悉AT指令 2、熟悉新大陆云平台新建项目 3、具体目标&#xff1a;&#xff08;1&#xff09;注册新大陆云平台&#xff1b;&#xff08;2&#xff09;新建一个联网方案为WIFI的项目&#xff1b;&#xff08;3&#xff09;ESP8266模块&#xff0c;通过AT指令访问…