Java核心-核心类与API(2)

话接上回,继续核心类与API的学习,这次介绍StringBuffer/StringBuilder/StringJoiner类。StringBuffer和StringBuilder是我们学习的重点,建议对比学习,做好区分。
在这里插入图片描述

一、StringBuffer类

1、概述

1)问题
由于 String 类是final 类型的,所以使用 String 定义的字符串是一个常量,一旦创建,其内容和长度是不可改变的。如果需要对一个字符串进行修改,只能创建新的字符串。
2)解决
使用 StringBuffer 类(也称字符串缓冲区)来操作字符串。

StringBuffer 类和 String 类最大的区别在于它的内容和长度都是可以改变的。StringBuffer 类似一个字符容器,当在其中添加或删除字符时,所操作的都是这个字符容器,因此并不会产生新的 StringBuffer 对象。

2、创建StringBuffer类对象

2.1 三种方式

1)StringBuffer() 构造一个空的字符串缓冲区,并初始化为 16 个字符的容量。
2)StringBuffer(int length) 创建一个空的字符串缓冲区,并初始化为指定长度 length 的容量。
3)StringBuffer(String str) 创建一个字符串缓冲区,并将其内容初始化为指定的字符串内容 str,字符串缓冲区的初始容量为 16 加上字符串 str 的长度。

2.2 案例

看文字不好理解的话就看如下案例

// 定义一个空的字符串缓冲区,含有16个字符的容量
StringBuffer str1 = new StringBuffer();
// 定义一个含有10个字符容量的字符串缓冲区
StringBuffer str2 = new StringBuffer(10);
// 定义一个含有(16+4)的字符串缓冲区,"青春无悔"为4个字符
StringBuffer str3 = new StringBuffer("青春无悔");
/*
*输出字符串的容量大小
*capacity()方法返回字符串的容量大小
*/
System.out.println(str1.capacity());    // 输出 16
System.out.println(str2.capacity());    // 输出 10
System.out.println(str3.capacity());    // 输出 20

注:当不指定容量(capacity)时默认构造一个容量为16的对象。

3、String与StringBuffer对象的转换

直接看案例

public class StringBufferDemo1 {
    public static void main(String[] args){
        String s = "abc";  //String转StringBuffer
        StringBuffer s1= new StringBuffer(s);
        System.out.println(s1);  //abc

        StringBuffer str=new StringBuffer("javaee");
        String str1=str.toString();  //StringBuffer转String(toString方法)
        System.out.println(str1);  //javaee
    }
}

4、StringBuffer类常用方法

常用的有append、delete、insert、replace、reverse、toString、setCharAt(修改指定位置index处的字符)等方法,其他方法和String类似,可自行对照来看。直接看懂以下案例即可

public class StringBufferDemo1 {
    public static void main(String[] args) {
        StringBuffer s = new StringBuffer("Happy New Year!");
        s.append(" 你好 2023!");
        System.out.println(s);  //Happy New Year! 你好 2023!
        s.insert(6, "happy ");
        System.out.println(s);  //Happy happy New Year! 你好 2023!
        s.replace(6, 11, "new");  //左闭右开,下标0开始
        System.out.println(s);  //Happy new New Year! 你好 2023!
        s.delete(5, 9);
        System.out.println(s);  //Happy New Year! 你好 2023!
        s.reverse();  //翻转
        System.out.println(s);  //!3202 好你 !raeY weN yppaH
        s.setCharAt(1, '2');
        System.out.println(s);  //!2202 好你 !raeY weN yppaH
        String str=s.toString();  //StringBuffer转String(toString方法)
        System.out.println(str);  //!2202 好你 !raeY weN yppaH
        System.out.println(s.length());  //24,返回长度,和String一样
    }
}

二、StringBuilder类

1、概述

StringBuilder 类是 JDK 1.5 新增的类,它也代表可变字符串对象。实际上,StringBuilder 和 StringBuffer 功能基本相似,方法也差不多。不同的是,StringBuffer 是线程安全的,而 StringBuilder 则没有实现线程安全功能,所以性能略高

通常情况下,如需创建一个内容可变的字符串对象,应优先考虑使用 StringBuilder 类。

2、创建StringBuilder类对象

2.1 三种方式

1)StringBuilder 构造一个空的字符串缓冲区,并初始化为 16 个字符的容量。
2)StringBuilder(int length) 创建一个空的字符串缓冲区,并初始化为指定长度 length 的容量。
3)StringBuilder(String str) 创建一个字符串缓冲区,并将其内容初始化为指定的字符串内容 str,字符串缓冲区的初始容量为 16 加上字符串 str 的长度。

2.2 案例

理解如下案例即可

public class StringBuilderTest {
    public static void main(String[] args){
        // 定义一个空的字符串缓冲区,含有16个字符的容量
        StringBuilder str1 = new StringBuilder();
        // 定义一个含有10个字符容量的字符串缓冲区
        StringBuilder str2 = new StringBuilder(10);
        // 定义一个含有(16+4)的字符串缓冲区,"青春无悔"为4个字符
        StringBuilder str3 = new StringBuilder("青春无悔");
        /*
         *输出字符串的容量大小
         *capacity()方法返回字符串的容量大小
         */
        System.out.println(str1.capacity());    // 输出 16
        System.out.println(str2.capacity());    // 输出 10
        System.out.println(str3.capacity());    // 输出 20
    }
}

3、String和StringBuilder的相互转换

直接看案例

public class StringBuilderTest {
    public static void main(String[] args){
        String s = "abc";  //String转StringBuilder
        StringBuilder s1= new StringBuilder(s);
        System.out.println(s1);  //abc

        StringBuilder str=new StringBuilder("javaee");
        String str1=str.toString();  //StringBuffer转String(toString方法)
        System.out.println(str1);  //javaee
        System.out.println(s1.getClass());  //class java.lang.StringBuilder
        System.out.println(str1.getClass());  //class java.lang.String
    }
}

注:可用getClass()方法判断变量类型。

4、StringBuilder类常用方法

常用的有append、delete、insert、replace、reverse、toString、setCharAt(修改指定位置index处的字符)等方法,其他方法和String类似,可自行对照来看。直接看懂以下案例即可

public class StringBuilderDemo1 {
    public static void main(String[] args){
        StringBuilder s=new StringBuilder("zhang san 2023");
        s.append(" hello");  //zhang san 2023 hello
        System.out.println(s);
        s.insert(6,"xiao ");
        System.out.println(s);  //zhang xiao san 2023 hello
        s.replace(6,10,"da");
        System.out.println(s);  //zhang da san 2023 hello
        s.delete(6,9);
        System.out.println(s);  //zhang san 2023 hello
        s.reverse();
        System.out.println(s);  //olleh 3202 nas gnahz
        s.setCharAt(4,'H');
        System.out.println(s);  //olleH 3202 nas gnahz
        String str=s.toString();  //StringBuilder 转 String
        System.out.println(str);  //olleH 3202 nas gnahz
        System.out.println(s.getClass());  //判断变量s的类型,class java.lang.StringBuilder
        System.out.println(str.getClass());  //判断变量str的类型,class java.lang.String
        System.out.println(s.length());  //20
    }
}

通过以上可以看出,StringBuilder和StringBuffer功能很相似,在对象创建和常用方法上基本都相同,所以在学习和记忆时侧重记住二者不同的地方即可。

5、String/StringBuffer/StringBuilder小结

总结一下三者之间的一些联系与区别。

5.1 背景及功能重述

1)String

String 是 Java 中基础且重要的类,被声明为 final class,是不可变字符串。因为它的不可变性,所以拼接字符串时候会产生很多无用的中间对象,如果频繁的进行这样的操作对性能有所影响。

2)StringBuffer

StringBuffer 就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类。它提供了 append 和 add 方法,可以将字符串添加到已有序列的末尾或指定位置,它的本质是一个线程安全的可修改的字符序列。

3)StringBuilder

很多情况下字符串拼接操作不需要线程安全。StringBuilder 是 JDK1.5 发布的,它和 StringBuffer 本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销

5.2 线程安全

StringBuffer:线程安全

StringBuilder:线程不安全

5.3 速度

一般情况下,速度从快到慢为 StringBuilder > StringBuffer > String

从效率和性能角度出发,如果不考虑线程安全的话,优先推荐使用StringBuilder

5.4 使用环境

操作少量的数据使用 String。

单线程操作大量数据使用 StringBuilder。

多线程操作大量数据使用 StringBuffer。

三、StringJoiner类

1、概述

StringJoiner是Java8新出的一个类,作用是在构造字符串时可以自动添加前缀、后缀及分隔符,无需实现添加字符的逻辑。StringJoiner是通过StringBuilder进行封装实现的,性能和StringBuilder差不多,也是非线程安全的。

方法选择:简单的字符串拼接,直接使用”+”。for循环中进行字符串拼接,考虑StringBuilder和StringBuffer。通过一个List进行字符串拼接,考虑StringJoiner。方法不固定,根据情况自由选择。

2、StringJoiner构造方法

1)两种如下

StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix)  //分隔符,前缀,后缀
StringJoiner(CharSequence delimiter)    //只有分隔符

2)案例

//前后缀拼接
import java.util.StringJoiner;  //必须先导包才能用
public class StringJoinerDemo {
    public static void main(String[] args) {
        String[] names={"zhangsan","lishi","wangwu"};
        StringJoiner sj=new StringJoiner(", ");  //只有分隔符的构造方法
        StringJoiner sj1=new StringJoiner(", ","[","]");  //含分隔符,前缀,后缀的构造方法

        StringJoiner sj2 = new StringJoiner("\", \"", "[\"", "\"]"); //转义,显示""
        for(String name:names){
            sj.add(name);
            sj1.add(name);
            sj2.add(name);
        }
        System.out.println(sj);  //    zhangsan, lishi, wangwu
        System.out.println(sj1); //    [zhangsan, lishi, wangwu]
        System.out.println(sj2); //    ["zhangsan", "lishi", "wangwu"]
    }
}
//字符串拼接
import java.util.StringJoiner;
public class StringJoinerDemo1 {
    public static void main(String[] args){
        StringJoiner sj=new StringJoiner(" ","[","]");
        sj.add("Hello");
        sj.add("Java");
        sj.add("SE");
        System.out.println(sj);  //  [Hello Java SE]
    }
}

在不需要指定“开头”和“结尾”的时候,用String.join()更方便,如下

public class StringJoinerDemo1 {
    public static void main(String[] args){
        String[] names = {"Bob", "Alice", "Grace"};
        String join = String.join(". ", names);
        System.out.println(join); // Bob. Alice. Grace
        String str = String.join(", ", "hello", "world", "测试", "继续加", "无限加");
        System.out.println(str); // hello, world, 测试, 继续加, 无限加
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Django学习记录04——靓号管理整合

1.靓号表 1.1 表结构 1.2 靓号表的构造 class PrettyNum(models.Model): 靓号表 mobile models.CharField(verbose_name"手机号", max_length11)# default 默认值# null true,blank true 允许为空price models.IntegerField(verbose_name"价…

websocket了解下

websocket请求长啥样 GET /chat HTTP/1.1 Host: example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ Sec-WebSocket-Version: 13 啥是websocket websocket是http的一种,服务器可以主动向客户端推送信息,…

18个惊艳的可视化大屏(第七辑):场馆与园区方向

本期分享智慧场馆和智慧园区方向的可视化大屏,各位老铁上车,坐稳了,上图啦。

计算机组成原理(12)----多处理系统

目录 1.SISD(单指令流单数据流) (1)特性 (2)硬件组成 2.SIMD(单指令流多数据流) (1)特性 (2)硬件组成 3.MISD(多指…

数字孪生低代码平台盘点(一):厂家介绍

特别说明:本文根据网上资料搜集整理而成,排名不分先后,配图是为了更好地阅读体验,并非表明该图为该平台所生产。如有错误之处,请在评论区提出。 一、优锘ChartBuilder 优锘ChartBuilder是一款基于Web的数据可视化工具…

【Docker】初学者 Docker 基础操作指南:从拉取镜像到运行、停止、删除容器

在现代软件开发和部署中,容器化技术已经成为一种常见的方式,它能够提供一种轻量级、可移植和可扩展的应用程序打包和部署解决方案。Docker 是目前最流行的容器化平台之一,它提供了一整套工具和技术,使得容器的创建、运行和管理变得…

Github 2024-02-24 开源项目日报Top10

根据Github Trendings的统计,今日(2024-02-24统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5TypeScript项目2C项目1Rust项目1JavaScript项目1HTML项目1Jupyter Notebook项目1 Python - 100天…

华为配置WLAN AC和AP之间VPN穿越示例

配置WLAN AC和AP之间VPN穿越示例 组网图形 图1 配置WLAN AC和AP之间VPN穿越示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 企业用户接入WLAN网络,以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时,不影响…

算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习四(leetcode真题剖析)

算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习四 01.解数独02.单词搜索03.黄金矿工04.不同路径 III 01.解数独 题目链接:https://leetcode.cn/problems/sudoku-solver/ 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&am…

Kubernetes Prometheus 系列|Prometheus介绍和使用|Prometheus+Grafana集成

目录 第1章Prometheus 入门1.1 Prometheus 的特点1.1.1 易于管理1.1.2 监控服务的内部运行状态1.1.3 强大的数据模型1.1.4 强大的查询语言 PromQL1.1.5 高效1.1.6 可扩展1.1.7 易于集成1.1.8 可视化1.1.9 开放性 1.2 Prometheus 的架构1.2.1 Prometheus 生态圈组件1.2.2 架构理…

LangChain原理学习笔记

最新越发觉得AI的发展,对未来是一场革命,LangChain已经在工程设计上有了最佳实践,类似于AI时代的编程模型或编程框架,有点Spring框架的意思。之前在LangChain上也有些最佳实践,所以在这里分享记录下。 LangChain解决什…

有趣且重要的JS知识合集(19)前端实现图片的本地上传/截取/导出

input[file]太丑了,又不想去改button样式,那就自己实现一个上传按钮的div,然后点击此按钮时,去触发file上传的事件, 以下就是 原生js实现图片前端上传 并且按照最佳宽高比例展示图片,然后可以自定义截取图片&#xff0…

Unity中URP实现水效果(水的深度)

文章目录 前言一、搭建预备场景1、新建一个面片,使其倾斜一个角度,来模拟水底和岸边的效果2、随便创建几个物体,作为与水面接触的物体3、再新建一个面片,作为水面 二、开始编写水体的Shader效果1、新建一个URP基础Shader2、把水体…

redis GEO 类型原理及命令详解

目录 前言 一、GeoHash 的编码方法 二、Redis 操作GEO类型 前言 我们有一个需求是用户搜索附近的店铺,就是所谓的位置信息服务(Location-Based Service,LBS)的应用。这样的相关服务我们每天都在接触,用滴滴打车&am…

2.23通过platform总线驱动框架编写LED灯的驱动,编写应用程序测试

驱动代码 #include <linux/init.h> #include <linux/module.h> #include <linux/of_gpio.h> #include <linux/gpio.h> #include <linux/platform_device.h> #include <linux/mod_devicetable.h>#define LED_ON _IOW(l, 1, int) #define L…

nginx的功能以及运用(编译、平滑升级、提高服务器设置、location alias 等)

nginx与apache的对比 nginx优点 nginx中INPUT OUTPUT模型 零拷贝技术 原理&#xff1a;减少内核空间和用户空间的拷贝次数&#xff0c;增加INPUT OUTPUT的效率 网络I/O 模型 同步&#xff0c;异步 &#xff1a; 消息反馈机制 阻塞和非阻塞 阻塞型I/O模型&#xff1a;不利于…

第3.3章:StarRocks数据导入——Stream Load

一、概述 Stream Load是StarRocks最为核心的导入方式&#xff0c;用户通过发送HTTP请求将本地文件或数据流导入至StarRocks中&#xff0c;其本身不依赖其他组件。 Stream Load支持csv和json两种数据文件格式&#xff0c;适用于数据文件数量较少且单个文件的大小不超过10GB 的场…

[yolov9]使用python部署yolov9的onnx模型

【框架地址】 https://github.com/WongKinYiu/yolov9 【yolov9简介】 在目标检测领域&#xff0c;YOLOv9 实现了一代更比一代强&#xff0c;利用新架构和方法让传统卷积在参数利用率方面胜过了深度卷积。 继 2023 年 1 月 正式发布一年多以后&#xff0c;YOLOv9 终于来了&a…

基于Java SSM框架实现高校失物招领管理平台系统项目【项目源码】

基于java的SSM框架实现高校失物招领管理平台系统演示 B/S结构 在B/S的结构中&#xff0c;学生可以在任何可以上网的地方访问和使用系统网站的功能&#xff0c;没有地域和时间等方面的限制&#xff0c;B/S结构是把程序完整放置到计算机网络的服务器上&#xff0c;通过计算机互联…

module ‘json‘ has no attribute ‘dumps‘

如果在使用Python的json模块时遇到AttributeError: module json has no attribute dumps错误&#xff0c;通常是因为在Python环境中json模块不支持dumps方法。这种情况可能是因为Python的json模块被重命名或修改过导致的。 解决方法可以尝试以下几种&#xff1a; 1.检查Pytho…