MyStringBuffer-自定义实现StringBuffer

在Java中,StringBuffer是一个可变的字符串类,它允许对字符串进行动态修改。与String类不同的是,StringBuffer对象的长度和内容都可以被改变。这使得StringBuffer在需要频繁修改字符串内容时比String更加高效。

StringBuffer类提供了许多方法来操作字符串,比如添加字符、插入字符、替换字符、反转字符串等。由于StringBuffer是可变的,所以它的性能比直接对String对象进行字符串拼接要好,尤其是当需要频繁地修改字符串时。

另外,需要注意的是,StringBuffer是线程安全的,因此适合在多线程环境下使用。如果不需要线程安全性,则可以使用StringBuilder类,它与StringBuffer类功能类似,但不是线程安全的。
自定义MyStringBuffer实现了增加append,插入Insert,删除delete,自定义异常,自动扩容,字符串反转等等。
接口:
在Java中,接口(Interface)是一种抽象类型,它只包含方法的声明而没有方法的实现。接口定义了一组方法的签名,但具体的实现由实现接口的类来完成。任何实现了接口的类都必须实现接口中定义的所有方法。

接口在Java中有以下好处:

实现多继承:Java中一个类只能继承一个类,但可以实现多个接口。通过接口,可以让一个类具备多个行为,实现更灵活的设计。
规范和约定:接口定义了一组方法的规范,强制实现类提供这些方法的实现。这有助于代码的规范化和约定性,提高代码的可读性和可维护性。
解耦合:接口将接口与实现分离,降低了类之间的耦合度。通过接口,可以让类只依赖于接口而不依赖于具体的实现,提高了代码的灵活性和可复用性。
扩展性:接口可以在不影响已有代码的情况下扩展新的功能。实现类可以根据需要实现新的接口,而不需要修改现有代码。

package Basic.String_Num;public interface IStringBuffer {public void append(String str) throws MyStringBuffer.indexIsOutofRangeException,MyStringBuffer.indexIsNagetiveException;public  void append(char c) throws MyStringBuffer.indexIsOutofRangeException,MyStringBuffer.indexIsNagetiveException;public void insert(int pos,char c) throws MyStringBuffer.indexIsOutofRangeException,MyStringBuffer.indexIsNagetiveException;public void insert(int pos,String str) throws MyStringBuffer.indexIsOutofRangeException, MyStringBuffer.indexIsNagetiveException;public  void delete(int start) throws MyStringBuffer.indexIsOutofRangeException,MyStringBuffer.indexIsNagetiveException;public  void delete(int start,int end) throws MyStringBuffer.indexIsOutofRangeException,MyStringBuffer.indexIsNagetiveException;public int length();public void reverse();
}

代码实现:

package Basic.String_Num;import javax.swing.plaf.synth.SynthDesktopIconUI;public class MyStringBuffer implements IStringBuffer{int length=0;int capacity=16;char []value;class indexIsNagetiveException extends Exception{public indexIsNagetiveException(){}public indexIsNagetiveException(String msg){super(msg);}}class indexIsOutofRangeException extends Exception{public indexIsOutofRangeException(){}public indexIsOutofRangeException(String msg){super(msg);}}public MyStringBuffer(){value=new char[capacity];}public MyStringBuffer(String str){this();if(str==null){throw new NullPointerException("空指针错误!");}if(str.length()>capacity){capacity=2*str.length();value=new char[capacity];}if(capacity>=str.length()){System.arraycopy(str.toCharArray(),0,value,0,str.length());length=str.length();}}@Overridepublic void append(String str) throws  indexIsNagetiveException,indexIsOutofRangeException{insert(length,str);}@Overridepublic void append(char c) throws  indexIsNagetiveException,indexIsOutofRangeException{append(String.valueOf(c));}@Overridepublic void insert(int pos, char c)throws indexIsNagetiveException,indexIsOutofRangeException {insert(pos,String.valueOf(c));}@Overridepublic void insert(int pos, String b) throws indexIsOutofRangeException, indexIsNagetiveException {//边界条件判断if(pos<0){throw new indexIsNagetiveException(String.valueOf(pos)+"下标为负异常");}if(pos>length){throw new indexIsOutofRangeException(String.valueOf(pos)+"下标超出范围异常");}if(b==null){throw new NullPointerException(String.valueOf(pos)+"空指针异常");}//扩容while((length+b.length())>capacity){capacity=(int)((length+b.length())*1.5f);char[] newvalue=new char[capacity];System.arraycopy(value,0,newvalue,0,length);value=newvalue;}char[] cs=b.toCharArray();System.arraycopy(value,pos,value,pos+cs.length,length-pos);System.arraycopy(cs,0,value,pos,cs.length);length=cs.length+length;}@Overridepublic void delete(int start) throws indexIsNagetiveException,indexIsOutofRangeException {delete(start,length);}@Overridepublic void delete(int start, int end) throws indexIsNagetiveException, indexIsOutofRangeException {if(start<0)throw new indexIsNagetiveException(String.valueOf(start)+"下标为负异常");if(start>length)throw new indexIsOutofRangeException(String.valueOf(start)+"下标超出范围");if(end<0)throw new indexIsNagetiveException(String.valueOf(end)+"下标为负异常");if(end>length)throw new indexIsOutofRangeException(String.valueOf(end)+"下标超出范围");if(start>=end)throw new indexIsOutofRangeException(String.valueOf(start)+"下标超出范围");System.arraycopy(value,end,value,start,length-end);length-=(end-start);}@Overridepublic int length() {return length;}@Overridepublic void reverse() {for(int i=0;i<length/2;i++){char temp=value[i];value[i]=value[length-i-1];value[length-i-1]=temp;}}public String toString(){char[] realString=new char[length];System.arraycopy(value,0,realString,0,length);return new String(realString);}public static void main(String[] args) {String str = "dsjflabdji";MyStringBuffer sb = new MyStringBuffer(str);try {
//            sb.insert(0,null);sb.insert(-1,"test");sb.insert(11,"test");sb.delete(-1, 1);sb.delete(6,5);sb.delete(11,0);} catch (Exception e) {// TODO: handle exceptionif(e instanceof NullPointerException)System.out.println("出现空指针异常");if(e instanceof indexIsNagetiveException | e instanceof indexIsOutofRangeException )System.out.println("出现下标异常");e.printStackTrace();}}}

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

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

相关文章

Docker基础篇(六) dockerfile体系结构语法

FROM&#xff1a;基础镜像&#xff0c;当前新镜像是基于哪个镜像的 MAINTAINER &#xff1a;镜像维护者的姓名和邮箱地址 RUN&#xff1a;容器构建时需要运行的命令 EXPOSE &#xff1a;当前容器对外暴露出的端口号 WORKDIR&#xff1a;指定在创建容器后&#xff0c;终端默认登…

《Docker 简易速速上手小册》第4章 Docker 容器管理(2024 最新版)

文章目录 4.1 容器生命周期管理4.1.1 重点基础知识4.1.2 重点案例&#xff1a;启动并管理 Python Flask 应用容器4.1.3 拓展案例 1&#xff1a;调试运行中的容器4.1.4 拓展案例 2&#xff1a;优雅地停止和清理容器 4.2 容器数据管理与持久化4.2.1 重点基础知识4.2.2 重点案例&a…

C++力扣题目 42--接雨水 84--柱状图中最大的矩形

42. 接雨水 力扣题目链接(opens new window) 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1]输出&#xff1a;6解释&#xff…

一键解锁本地大型语言模型!Ollama框架让你轻松运行Gemma

想要在本地运行大型语言模型吗&#xff1f; Ollama框架提供了这样的机会。 这个框架是专为在Docker容器中部署LLM而设计的&#xff0c;简化了部署和管理流程。 安装Ollama后&#xff0c;你只需执行一条命令&#xff0c;即可在本地运行开源大型语言模型。 它将模型权重、配置…

Less预处理器教程

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学&#xff0c;可以点心心支持一下哈 一、Less介绍 less官方文档 lesscss.org/ less中文文档 less.bootcss.com/ less是一种css预处理器&#xff0c;它扩展了css语言&#xff0c…

C++ 设计模式:单例模式

一个类只允许存在一个对象 实现起来很简单&#xff0c;将构造函数设置为私有&#xff0c;拷贝构造等关闭然后提供一个静态接口返回实例即可 class A {A() {}A(const A&) delete;A& operator(const A&) delete; public:static A& get_val() {static A a;retu…

Docker复习笔记

Centos7安装Docker Docker官网:www.docker.com Docker官网仓库:hub.docker.com Docker文档是比较详细的 安装相关依赖 yum -y install gcc gcc-c yum install -y yum-utils 设置docker镜像仓库 yum-config-manager --add-repo https://download.docker.com/linux/centos/do…

OpenCV开发笔记(七十五):相机标定矫正中使用remap重映射进行畸变矫正

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/136293833 各位读者&#xff0c;知识无穷而人力有穷&#xff0c;要么改需求&#xff0c;要么找专业人士&#xff0c;要么自己研究 红胖子(红模仿…

网络设备和网络软件

文章目录 网络设备和网络软件网卡交换机交换机的三个主要功能交换机的工作原理第二层交换和第三层交换交换机的堆叠和级联 路由器路由器工作原理 网关网关的分类 无线接入点(AP)调制解调器网络软件 网络设备和网络软件 网卡 网络接口卡又称网络适配器&#xff0c;简称网卡。网…

【计算机网络】数据链路层--以太网/MTU/ARP/RARP协议

文章目录 一、以太网1.以太网帧格式2.MAC地址3.局域网的转发原理 二、MTU1.什么是MTU2.MTU对IP协议的影响3.MTU对UDP影响4.MTU对于TCP协议的影响 三、ARP协议1.ARP协议的作用2.ARP数据报的格式3.ARP协议的工作流程 一、以太网 “以太网” 不是一种具体的网络, 而是一种技术标准…

论文阅读:《High-Resolution Image Synthesis with Latent Diffusion Models》

High-Resolution Image Synthesis with Latent Diffusion Models 论文链接 代码链接 What’s the problem addressed in the paper?(这篇文章究竟讲了什么问题&#xff1f;比方说一个算法&#xff0c;它的 input 和 output 是什么&#xff1f;问题的条件是什么) 这篇文章提…

c++学习记录 string容器—构造函数

string和char*区别&#xff1a; char*是一个指针string是一个类&#xff0c;类内部封装了char*&#xff0c;管理这个字符串&#xff0c;是一个char*型的容器 特点&#xff1a; string类内部封装了很多成员方法&#xff0c;例如&#xff1a;查找find、拷贝copy、删除delete、…

激光雷达与rgb相机外参标定

1 简介 最近在做livox与rgb相机的外参标定&#xff0c;网上看了很多开源方法大对数是基于ros做的&#xff0c;由于对ros不太熟悉&#xff0c;所以先基于python写一个初始版本&#xff0c;以下是全部代码&#xff0c;后面有有时间再整理&#xff0c;相机的内参是使用matlab工具…

音视频剪辑|Windows|抽帧和合帧

什么是抽帧&#xff1f; FFmpeg 抽帧&#xff08;Extracting frames&#xff09;的作用是从视频文件中按需提取单张或多张静止图像&#xff08;帧&#xff09;&#xff0c;并将它们保存为图片文件&#xff08;如 JPEG、PNG 等格式&#xff09;。这一功能在以下场合十分有用&am…

Python服务器监测测试策略与工具:确保应用的高可用性!

在构建高可用性的应用程序时&#xff0c;服务器监测测试是至关重要的一环。Python作为一种强大的编程语言&#xff0c;提供了丰富的工具和库来帮助我们进行服务器监测测试。本文将介绍一些关键的策略和工具&#xff0c;帮助你确保应用的高可用性。 1. 监测策略的制定&#xff…

Vue3 (unplugin-auto-import自动导入的使用)

安装 参考链接 npm i -D unplugin-auto-importvite.config.ts里面配置 import AutoImport from unplugin-auto-import/viteAutoImport({imports:[ vue,vue-router]})重新运行项目会生成一个auto-imports.d.ts的文件 /* eslint-disable */ /* prettier-ignore */ // ts-nochec…

YOLOv9尝鲜测试五分钟极简配置

pip安装python包&#xff1a; pip install yolov9pip在https://github.com/WongKinYiu/yolov9/tree/main中下载好权重文件yolov9-c.pt。 运行下面代码&#xff1a; import yolov9model yolov9.load("yolov9-c.pt", device"cpu") # load pretrained or c…

苹果手机动画演示动画PR样机模板视频素材 iPhone Mockup 7.0

适用于Premiere苹果手机动画演示PR样机模板视频素材 iPhone Mockup 7.0 产品信息&#xff1a; 5款支持alpha频道的动画智能手机。 轻松关闭屏幕上的背景、阴影和反射。 适用于Premiere Pro 2023 每个样机持续时间为13秒。 4K分辨率。 轻松更改颜色。 适用于图像或视频。 包括视…

m估计及其c++简单实现

文章目录 什么是m估计怎么求解m估计呢&#xff1f;Huber函数时的线性m估计 什么是m估计 自20世纪60年代稳健统计建立以来&#xff0c;在国内外众多学者的研究之下&#xff0c;诞生了一系列稳健统计重要理论和成果。其中最主要且广泛使用的稳健统计有以下三类&#xff1a; L-e…

Jmeter学习系列之八:控制器Controllers 的入门介绍

一、Controllers 简介 Jmeter有两种类型的控制器&#xff1a;Samplers&#xff08;取样器&#xff09;和Logical Controllers&#xff08;逻辑控制器&#xff09;&#xff1b;它们驱动着测试的进行取样器&#xff1a;让jmeter发送请求到服务器以及接收服务器的响应数据逻辑控制…