常用类详解(二)StringBuffer

news2024/9/22 7:37:28

StringBuffer类:

基本介绍:

java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删

很多方法与String相同,但StringBuffer是可变长度的。

StringBuffer是一个容器。

我们进行查看StringBuffer,如下所示:

package com.ypl.stringbuffer_;

public class StringBuffer01 {
    public static void main(String[] args) {
//1.StringBuffer的直接父类是AbstractStringBuilder
//2.StringBuffer实现了Serializable(序列化接口),即StringBuffer的对象可以串行化.
//3.在父类中  AbstractStringBuilder有属性char [] value,不是final类型的,从父类AbstractStringBuffer继承下来的char [] value,该value数组存放字符串内容,引出存放在堆中的,不再是存放在常量池了。
//4.因为StringBuffer字符内容是存在char[]  value,所以在变化(增加(如果数据存储不下来,即进行双倍扩容,同时将数据拷贝过来,更改地址,即改变指向)或删除)时不用每次都更换地址(即不是每次都创建新的对象),所以效率高于String。 
        StringBuffer stringBuffer = new StringBuffer("hello");
    }
}

我们查看他的类图如下所示:

 我们查看StringBuffer的·源码如下所示:

public final class StringBuffer
//StringBuffer是一个final类,不能被继承。
    extends AbstractStringBuilder
    implements Serializable, CharSequence

里面进去为声明性质的接口Serializable: 

我们再进去他的父类:存放内容是在 char [ ]  value.

 

 String  VS  StringBuffer

(1)String保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址,效率较低  //public final  char  value[ ];

(2)StringBuffer保存的是字符串变量,里面的值可以修改,每次StringBuffer的更新实际上可以更新内容,不用每次更新地址,效率较高   //char[ ]  value ;//放在这个堆

StringBuffer的构造器:

(1)StringBuffer( ):构造一个其中的不带字符的字符串缓冲区,其初始容量为16个字符

我们追进去如下所示:

 

我们继续追进去如下所示:

  

(2)StringBuffer(CharSequence seq ) :构造一个字符串缓冲区,它包含与指定的CharSequence相同的字符

(3)StringBuffer(int  capacity )://capacity容量,构造一个不带字符,但具有指定初始容量的字符串缓冲区,即对char[  ]大小进行指定

 我们追进去如下所示:

(4)StringBuffer(String str ) :构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容

我们创建如下:

我们追进去如下所示:

 

 

 String和StringBuffer之间的相互转换。

我们的代码如下所示:

package com.ypl.stringbuffer_;

public class StringAndStringBuffer {
  

    public static void main(String[] args) {

        //String--->StringBuffer
        String str="hello tom";
        //方式1 使用构造器
        //注意:返回的才是StringBuffer对象,对Str本身没有影响
        StringBuffer stringBuffer = new StringBuffer(str);
        System.out.println(stringBuffer);
        //方式2:使用的是append方法
        StringBuffer append = new StringBuffer().append(str);
 
        //StringBuffer---->String
        StringBuffer stringBuffer3 = new StringBuffer("rgf");
        //方式1:使用StringBuffer提供的toString方法
        String s = stringBuffer3.toString();
        //方式2:使用构造器来搞定
        String s1 = new String(stringBuffer3);


    }
}

 StringBuffer类的常用方法:

 (1)增:append

package com.ypl.stringbuffer_;

public class StringBufferMethod {
    public static void main(String[] args) {
        StringBuffer s = new StringBuffer("hello");
        //增:append
        s.append(',');//"hello,"
        s.append("张三丰"); //"hello,张三丰"
        s.append("赵敏").append(100).append(true).append(10.5); //"hello,张三丰赵敏100true10.5
        /*
        我们查看toString返回的方法
        public synchronized String toString() {
        if (toStringCache == null) {
            toStringCache = Arrays.copyOfRange(value, 0, count);
        }
        return new String(toStringCache, true);
    }
         */
        System.out.println(s);
        //
    }
}

我们查看toString的源码进行解析:我们进行debug如下所示:

  (2)删:delete(start,end)

(3)改 :replace(start,end,string)  //将start----end间的内容替换掉,不含end

(4)查:indexOf  //查找子串在字符串第一次出现的索引,如果找不到返回-1

(5)插:iinsert

(6)获取长度:length

我们通过代码来进行了解:

package com.ypl.stringbuffer_;

public class StringBufferMethod {
    public static void main(String[] args) {
        StringBuffer s = new StringBuffer("hello");
        //增:append
        s.append(',');//"hello,"
        s.append("张三丰"); //"hello,张三丰"
        s.append("赵敏").append(100).append(true).append(10.5); //"hello,张三丰赵敏100true10.5”
        /*
        我们查看toString返回的方法
        public synchronized String toString() {
        if (toStringCache == null) {
            toStringCache = Arrays.copyOfRange(value, 0, count);
        }
        return new String(toStringCache, true);
    }
         */
        System.out.println(s);
        /*
        删:delete(start,end)
        删除索引为>=start && <end 处的字符
        删除11到14的字符(但不包括14)[11,14)
         */

        s.delete(11,14);
        System.out.println(s);  //"hello,张三丰赵敏true10.5“

        //改 :replace(start,end,string) //将start----end间的内容替换掉,不含end
        //使用"周芷若"替换9-11的字符。
        s.replace(9,11,"周芷若");
        System.out.println(s);  //"hello,张三丰周芷若true10.5

        //查:indexOf //查找子串在字符串第一次出现的索引,如果找不到返回-1
        int indexOf = s.indexOf("张三丰");
        System.out.println(indexOf);

        //插:insert
        //在索引为9的位置,插入“赵敏”原来索引为9的内容自动后移
        s.insert(9,"赵敏");
        System.out.println(s);

        //获取长度:length
        System.out.println( s.length());//22
        System.out.println(s);
    }
}

我们运行之后如下所示:

 StringBuffer测试题1如下所示:

我们的代码设置如下所示:

public class StringBufferExercise {
    public static void main(String[] args) {
        String str=null;
        StringBuffer sb = new StringBuffer();
        sb.append(str);//需要看源码,底层调用的是父类的AbstractStringBuilder的appendNull方法
        /**
         * 我们查找append方法:
         *我们进行打断点,我们追加进去之后如下所师:
         *  public synchronized StringBuffer append(String str) {
         *         toStringCache = null;
         *         super.append(str);
         *         return this;
         *     }
         */
        System.out.println(sb.length());   //4

        System.out.println(sb); //null

我们进行debug查看如下所示:

 

我们上面了解到StringBuffer的父类如下所示:AbstractStringBuilder 

我们查看他的父类的代码

我们发现如果str为null,我们返回appendNull,我们继续查看其源码:

 

 我们发现是把我们的空对象转成字符数组'n' 'u' 'l' 'l'。

我们运行之后如下所示:

 我们在上面的基础上增加如下代码:

String str=null;
StringBuffer sb1 = new StringBuffer(str);  //看底层源码
        System.out.println(sb1);

我们继续追加代码:

 我们发现是我们首先计算传进去的字符串的长度,我们传进去的为null,这个时候就会出现问题,我们会执行:super(null.length( ) +16);我们会直接抛出空指针异常。

我们运行之后发现出现如下所示:

的确抛出空指针异常。 

  StringBuffer测试题2如下所示:

输入商品名称和商品价格,要求打印效果如下所示,使用该方法完成:

商品名    商品价格

手机    123,657.59

要求:价格的小数点前面每三位用逗号隔开,再输出。

我们设计的代码如下所示:

package com.ypl.stringbuffer_;

import java.util.Scanner;

public class StringBufferMethod01_ {
    public static void main(String[] args) {
        /**
         * 输出如下格式:
         * 商品名  商品价格
         * 手机  123,657.59
         * 要求:价格的小数点前面每三位用逗号隔开,再输出。
         */
        /*思路分析:
        1.定义一个Scanner对象,接收用户输入的价格(String)
         */
        //2.希望使用到StringBuffer的insert方法,需要将String转成StringBuffer
        //3.然后使用相关方法进行字符串的处理
        Scanner scanner = new Scanner(System.in);
        if (scanner.hasNext()) {
            //String str="125553555345.55";
            String str = scanner.next();
            StringBuffer stringBuffer = new StringBuffer(str);
            for (int i = stringBuffer.lastIndexOf(".") - 3; i > 0; i -= 3) {
                //  int j= stringBuffer.lastIndexOf(".");
                stringBuffer = stringBuffer.insert(i, ",");
            }
            System.out.println(stringBuffer);
            //上面的两步需要做一个循环处理,才是正确的。
        }
        scanner.close();
    }
}

我们运行之后如下所示:

 

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

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

相关文章

fpga设计中如何防止信号被优化

本文分别对quartus和vivado防止信号被优化的方法进行介绍。 为什么要防止信号被优化 ​ 在FPGA开发调试阶段&#xff0c;经常遇到这样的情况&#xff0c;需要临时添加信号&#xff0c;观察信号变化&#xff0c;用来定位代码中存在的问题&#xff0c;很多时候这些临时添加的信…

sg3_utils arm64 静态编译

需求背景 在进行ufs等scsi device测试时&#xff0c;需要进行power mode切换等测试&#xff0c;因此需要有一个简单地工具集来向scsi device&#xff08;ufs接口&#xff09;发送scsi命令&#xff0c;比如 scsi reset命令等。在网上调研后发现sg3_utils是一个比较全面的工具。…

本地代码提交至gitee仓库

1、新建仓库 新建一个私人访问的仓库 2、创建公钥 点开cmd 输入ssh-keygen -t rsa -C "xxxxxxxxxx.com" 邮箱填入自己使用的即可。 输入完毕后&#xff0c;连按三次enter。 命令就会执行完毕&#xff0c;会出现这个界面 此时已经代表ssh公钥已经创建完毕。 公…

自动驾驶TPM技术杂谈 ———— 摄像头标定

文章目录介绍摄像头内参标定摄像头模型的建立摄像头坐标系与环境坐标系的转换图像坐标系与图像像素坐标系小孔成像与图像物理坐标系环境坐标系与图像像素坐标系的转换摄像头畸变矫正常见内参标定方法平面标定自标定摄像头间外参标定介绍 标定传感器是自动驾驶感知系统中不可缺少…

Springboot集成工作流Activity

介绍 官网&#xff1a;https://www.activiti.org/ 一 、工作流介绍 1.工作流&#xff08;workflow&#xff09; 就是通过计算机对业务流程自动化执行管理&#xff0c;它主要解决的是“使在多个参与这之间按照某种预定义规则自动化进行传递文档、信息或任务的过程&#xff0c…

儿童绘本馆图书借阅租赁知识付费小程序源码交流

1.分类图书 2.书单推荐 4.会员卡次、期限购买 5.借阅时间选择 6.积分签到 7.优惠Q领取 前端uniapp开发 后端thinkphp开发 完全开源 <template> <view class"sp-section sp-index"> <!-- search --> <view class&qu…

【第30天】SQL进阶-查询优化- performance_schema系列实战五:查看最近的事务执行信息(SQL 小虚竹)

回城传送–》《32天SQL筑基》 文章目录零、前言一、 查看最近的事务执行信息数据准备&#xff08;如果已有数据可跳过此操作&#xff09;开启第一个会话&#xff0c;配置启用事务事件开启第二个会话&#xff0c;用于执行事务&#xff0c;并模拟事务回滚第一个会话查询活跃事件第…

详解无线技术标准都使用哪些频段?中国物联网市场又适用哪些频段

由于各行各业都有各自的频段只应用需求&#xff0c;所以一般频段都是由国家来进行分配的。国家设立无线电管理机构&#xff0c;通过拍卖、定价的方法向企业、机构发放频段使用许可。获得许可的机构将会获得拍照。这也就是5G&#xff0c;4G时各运营商获得国家颁发牌照的由来。只…

【QT】TCP通信(QTcpServer 和 QTcpSocket)

目录1. TCP通信概述2. QTcpServer2.1 公共函数2.2 信号2.3 保护函数3. QTcpSocket3.1 公共函数3.2 信号4. 代码示例4.1 服务器端MainWindow.hMainWindow.cpp4.2 客户端MainWindow.hMainWindow.cpp4.3 界面显示1. TCP通信概述 TCP是一种被大多数Internet网络协议&#xff08;如…

【设计模式】我终于读懂了代理模式。。。

&#x1f466;代理模式的基本介绍 1)代理模式&#xff1a;为一个对象提供一个替身&#xff0c;以控制对这个对象的访问。即通过代理对象访问目标对象,这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。 2)被代理的对象可以是远程对象、创建…

SharpImpersonation:一款基于令牌和Shellcode注入的用户模拟工具

关于SharpImpersonation SharpImpersonation是一款功能强大的用户模拟工具&#xff0c;该工具基于令牌机制和Shellcode注入技术实现其功能&#xff0c;可以帮助广大研究人员更好地对组织内部的网络环境和系统安全进行分析和测试。 该工具基于 Tokenvator的代码库实现其功能&a…

webpack、vite、vue-cli、create-vue 的区别

webpack、vite、vue-cli、create-vue 的区别 首先说结论 Rollup更适合打包库&#xff0c;webpack更适合打包项目应用&#xff0c;vite基于rollup实现了热更新也适合打包项目。 功能工具工具脚手架vue-clicreate-vue构建项目vite打包代码webpackrollup 脚手架:用于初始化&#…

icon-font的使用

先登录阿里巴巴图标矢量库官网iconfont-阿里巴巴矢量图标库在官网挑选需要的图标点击图标购物车并且点击下载代码下载好之后将文件夹里面的css&#xff0c;ttf文件放置到你的项目当中并且点击里面的html文件这里面有详细的用法&#xff0c;这里我是用的时font class方法‘方法二…

【macOS】mac电脑M2芯片安装Homebrew 最简单的方法

一 Homebrew的安装 打开终端&#xff0c;复制如下命令&#xff0c;按回车执行 M芯片和Intel芯片均可 中途可能需要你手动输入密码&#xff0c;输入完成回车即可&#xff08;密码不可见 选择中科大或者清华镜像源 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/Hom…

MyBatis案例 | 使用映射配置文件实现CRUD操作——修改数据

本专栏主要是记录学习完JavaSE后学习JavaWeb部分的一些知识点总结以及遇到的一些问题等&#xff0c;如果刚开始学习Java的小伙伴可以点击下方连接查看专栏 本专栏地址&#xff1a;&#x1f525;JavaWeb Java入门篇&#xff1a; &#x1f525;Java基础学习篇 Java进阶学习篇&…

简单易懂、无线产品上市认证:进网许可证、入网证、CTA认证

简单易懂、无线产品上市认证:进网许可证、入网证、CTA认证 通信产品想在中国市场进行销售,一般需要通过以下三种认证 : CCC强制认证、TA型号核准(SRRC)、NAL进网许可(CTA) 今天我们来详细了解一下NAL(Network Access License)工信部信息通信管理局的相关要求。 那么…

【软考】系统集成项目管理工程师(二十一)项目收尾管理

1. 项目验收2. 项目总结3. 系统维护4. 项目后评价补充:人员转移和资源遣散广义的系统集成项目收尾管理工作通常包含四类典型的工作:项目验收工作、项目总结工作、系统维护工作 以及 项目后评价工作,此外项目团队成员的后续工作也应在收尾管理时妥善安排;狭义的系统集成项目…

C++程序中执行abort等操作导致没有生成dump文件的问题案例分析

目录 1、概述 2、查看C运行时函数abort的内部实现 3、开源库jsoncpp中调用abort的代码场景说明 4、开源库WebRTC中调用abort的代码场景说明 5、项目问题实例分析 5.1、问题说明 5.2、进一步分析 5.3、动态申请内存失败的可能原因分析 6、最后 VC常用功能开发汇总&…

计算机网络(第三版) 胡亮 课后习题第二章答案

计算机网络&#xff08;第三版&#xff09; 胡亮 课后习题第二章答案 1、数据通信系统由哪些部分组成&#xff1f; 信源、发送设备、传输设备、接受设备&#xff0c;信宿 2、数据通信应该解决的主要问题有哪些&#xff1f; 提高传输系统的利用率接口&#xff0c;编码和同步交换…

C++类基础(十二)

运算符重载&#xff08;终&#xff09; ● 类型转换运算符 – 函数声明为 operator type() const – 与单参数构造函数一样&#xff0c;都引入了一种类型转换方式 struct Str {Str(int p): val(p){}operator int() const //重载类型转换运算符: 没有显示声明返回类型&#xff…