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

news2024/11/16 17:31:30

话接上回,继续核心类与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, 测试, 继续加, 无限加
    }
}

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

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

相关文章

每日OJ题_牛客OR59_字符串中找出连续最长的数字串

目录 牛客OR59 字符串中找出连续最长的数字串 解析代码 牛客OR59 字符串中找出连续最长的数字串 字符串中找出连续最长的数字串_牛客题霸_牛客网 解析代码 #include <iostream> #include <cctype> using namespace std; int main() {string str, tmp "&q…

Stable Diffusion 3 震撼发布,采用Sora同源技术,文字终于不乱码了

Stable Diffusion 3 和 Sora 一样采用了 diffusion transformer 架构。 继 OpenAI 的 Sora 连续一周霸屏后&#xff0c;昨晚&#xff0c;生成式 AI 顶级技术公司 Stability AI 也放了一个大招 ——Stable Diffusion 3。该公司表示&#xff0c;这是他们最强大的文生图模型。 与…

Uniapp-小程序简单的时间选择组件-年月日时分

文章目录 前言一、组件效果二、组件代码使用 总结 前言 uniapp小程序开发系列。本文实现一个简单时间选择控件。uniapp用个心仪时间控件真的麻烦。官方给得要么年月日&#xff0c;要么时分。产品只要年月日时分。这该怎么玩。旧项目没有引入ui框架&#xff0c;我也不想去引入&…

调查居民幸福指数的社会实践报告

引言 在快速发展的现代社会中&#xff0c;居民的幸福感成为了衡量一个社区、一个城市乃至一个国家综合实力的重要指标之一。幸福指数不仅反映了居民的生活质量和满意度&#xff0c;也是政府制定和调整政策&#xff0c;提升民众生活水平的重要依据。因此&#xff0c;本次社会实践…

【Python_Zebra斑马打印机编程学习笔记(二)】基于BarTender将btw文件转换为zpl文件

基于BarTender将btw文件转换为zpl文件 基于BarTender将btw文件转换为zpl文件前言一、BarTender1、BarTender 介绍2、BarTender 安装 二、导出 ZPL 文件1、导出 ZPL 文件步骤2、Zebra 打印机驱动安装 基于BarTender将btw文件转换为zpl文件 前言 本文介绍如何基于 BarTender 软…

C语言特殊函数

静态函数 背景知识&#xff1a;普通函数都是跨文件可见的&#xff0c;即在文件 a.c 中定义的函数可以在 b.c 中使用。 静态函数&#xff1a;只能在定义的文件内可见的函数&#xff0c;称为静态函数。 语法 staitc void f(void) // 在函数头前面增加关键字 static &#xff…

J7 - 对于ResNeXt-50算法的思考

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 J6周有一段代码如下 思考过程 首先看到这个问题的描述&#xff0c;想到的是可能使用了向量操作的广播机制然后就想想办法验证一下&…

Element使用Message消息提示

Element使用Message消息提示 一、导入Element1、npm 安装2、引入 Element3、实现代码4、效果 一、导入Element 1、npm 安装 推荐使用 npm 的方式安装 npm i element-ui -S2、引入 Element 在 main.js 中写入以下内容 import ElementUI from element-ui; import element-ui…

FFmpeg解析之avformat_find_stream_info函数

avformat_find_stream_info 的主要作用就是&#xff1a;解析媒体文件并获取相关的流信息 整体的逻辑如下图所示&#xff1a; /*** Read packets of a media file to get stream information. This* is useful for file formats with no headers such as MPEG. This* function…

现货黄金中短线投资该怎么做?

要明确什么是现货黄金的中短线投资&#xff0c;中短线投资是指在短期内&#xff08;一般为几天至几周&#xff09;对现货黄金进行买卖操作&#xff0c;以期获得收益的投资方式。相较于长线投资&#xff0c;中短线投资的风险相对较大&#xff0c;但同时收益也更为可观。那么&…

算法题目中图和树的存储

邻接表的方式存储图和树 这就是邻接表&#xff0c;就是将每个结点的孩子结点用链表表示出来&#xff0c;再将所有结点以数组形式连起来。 存储树和图我们需要三个数组&#xff0c;h[N], e[N], ne[N],分别表示邻接表&#xff0c;结点值&#xff0c;结点的next值&#xff0c;h[i…

Zookeeper简介及选举机制

1.概述 Zookeeper是一个开源的&#xff0c;分布式的&#xff0c;为分布式框架&#xff08;如下图中的Hadoop和Hive&#xff09;提供协调服务的Apache项目。 工作机制&#xff1a;基于观察者设计模式的分布式服务管理框架&#xff0c;负责存储和管理数据&#xff0c;接受观察者…

Set集合(Java) 及底层原理

SET<E>是一个接口&#xff0c;添加的元素是无序的&#xff1a;添加数据的顺序和获取出的数据顺序不一致&#xff1b;不重复&#xff0c;无索引。 实现类&#xff1a; 1.HashSet&#xff1a;无序不重复无索引 2.LinkedHashSet&#xff1a;有序不重复无索引 3.TreeSet&…

最佳 PDF 转 Word 转换器软件,可实现无缝转换

如今&#xff0c;PDF文件格式因其高安全性而被计算机用户所熟悉&#xff0c;这使得无法直接编辑内容。因此&#xff0c;每当用户需要复制内容时&#xff0c;都会遇到很多困难。在这里将介绍了一些可以让您将 PDF 转换为 Word 的工具。 借助高效、免费的 PDF 转 Word 转换器软件…

离散数学(一) 集合

属于关系 表示 枚举法&#xff1b; 叙述法&#xff1b; 文氏图法 基数 空集 全集 全集是相对唯一的 相等关系 有相同元素看作一个元素 包含关系 幂集 集合运算 并集 交集 补集 差集 对称差集 定理 可数集合与不可数集合 自然数集 等势 如果存在集合A到集合B的双射(又称一一…

PostgreSQL如何使用UUID

离线安装时&#xff0c;一般有四个包&#xff0c;都安装的话&#xff0c;只需要开启uuid的使用即可&#xff0c;如果工具包(即 postgresql11-contrib&#xff09;没有安装的话&#xff0c;需要单独安装一次&#xff0c;再进行开启。 开启UUID方法 下面介绍一下如何开启&#…

分布式事务Seata的使用详解

一、事务概述 事务指的就是一个操作单元&#xff0c;在这个操作单元中的所有操作最终要保持一致的行为&#xff0c;要么所有操作 都成功&#xff0c;要么所有的操作都被撤销。简单地说&#xff0c;事务提供一种“要么什么都不做&#xff0c;要么做全套”机制。 1.1.本地事物 …

Linux基础知识——命令行模式下命令的执行

文章目录 Linux基础知识——命令行模式下命令的执行开始执行Linux命令Linux基础命令的操作常用Linux命令行操作按键Linux输出错误信息查看 Linux系统在线帮助--help选项man命令info命令其他有用的文件文档百度搜索 文本编辑器&#xff1a;nanonano启动&#xff01; 正确关机方法…

自动化行业文件数据\资料防泄密软件——天锐绿盾|@德人合科技

天锐绿盾是一款自动化行业文件数据防泄密软件&#xff0c;由德人合科技提供。该软件采用动态加解密技术&#xff0c;能够有效防止公司内部数据泄密&#xff0c;同时支持各种文件格式加密&#xff0c;如CAD、OFFICE、PDF、图纸等。 PC端&#xff1a;https://isite.baidu.com/sit…

第1讲-introduction

计算机组成与结构简介 计算机的基本组成 计算机的层次结构