当前位置: 首页 > news >正文

Java 实现简单动态字符串

Java 实现简单动态字符串

用 Java 实现简单动态字符串(Simple Dynamic String,SDS)结构体的示例代码:


import java.util.Arrays;

public class SDS {
    // 字符串结束字符
    private static char endChar = '\0';
    // 字符串长度
    private int len;
    // buf数组中未使用的字节数
    private int free;
    // 字节数组
    private char[] buf;

    // 构造函数
    public SDS(String str) {
        this.len = str.length();
        this.buf = Arrays.copyOf(str.toCharArray(), this.len + 1);
        this.buf[this.len] = endChar;
        this.free = buf.length - len - 1;
    }

    // 获取buf数组
    public char[] getBuf() {
        return buf;
    }

    // 拼接字符串 sdscat 方法用于拼接字符串,实现了空间预分配策略。
    public void sdscat(String str) {
        char[] strTemp = str.toCharArray();
        int strTempLen = str.length();
        int lastLen = this.len + strTempLen;
        // 先判断长度
        if (lastLen < 1 * Math.pow(2, 20)) {
            // 小于1MB(2^20B),那么free空间=len大小,buf的实际长度为2*len+1
            this.free = lastLen;
        } else {
            // 大于1MB(2^20B),那么free空间=1MB,buf的实际长度为1MB+len+1
            this.free = (int) Math.pow(2, 20);
        }
        this.len = lastLen;
        // 拼接数组
        char[] originChar = this.toString().toCharArray();
        char[] result = Arrays.copyOf(originChar, lastLen);
        System.arraycopy(strTemp, 0, result, originChar.length, strTemp.length);
        this.buf = Arrays.copyOf(result, lastLen + 1);
        this.buf[lastLen] = endChar;
    }

    public int getLen() {
        return len;
    }

    public void setLen(int len) {
        this.len = len;
    }

    public int getFree() {
        return free;
    }

    public void setFree(int free) {
        this.free = free;
    }
   // toString 方法用于将 SDS 对象转换为字符串表示形式。
    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder("");
        for (int i = 0; i < this.buf.length; i++) {
            if (this.buf[i]!= endChar ) {
                stringBuilder.append(this.buf[i]);
            }
        }
        return stringBuilder.toString();
    }
}

测试:

public class TestSDS {
    public static void main(String[] args) {
         SDS sds = new SDS("a a");
        System.out.println(sds.getLen() +","+ sds.getFree());
        char[] a = sds.getBuf();
        for (char aTemp : a) {
            System.out.println(aTemp);
        }
    }
}

相关文章:

  • 机器学习--逻辑回归模型
  • MyBatis映射文件常用元素详解与示例
  • 青少年编程与数学 02-009 Django 5 Web 编程 16课题、权限管理
  • 【2025最新计算机毕业设计】基于SpringBoot+Vue药管家家庭医药品回收系统【提供源码+答辩PPT+文档+项目部署】
  • 论文阅读_用于低频隔振的高负刚度新型阵列磁性弹簧的分析与设计_1
  • MySQL智障离谱问题,删了库确还存在、也不能再创建同名库
  • linux kasan 使用举例
  • Spring-AOP
  • Windows Docker运行Implicit-SVSDF-Planner
  • Python 面试常见问题解析
  • DockerDesktop更改默认的磁盘镜像地存储位置
  • 使用python进行数据分析工作,要掌握哪些数学知识?
  • Linux下学【MySQL】常用函数助你成为数据库大师~(配sql+实操图+案例巩固 通俗易懂版~)
  • Java8新特性Optional,Function,Supplier,Consumer
  • 计算机网络之网络层(网络层的功能,异构网络互联,路由与转发,SDN基本概念,拥塞控制)
  • 【办公类-90-01】】20250213中班周计划四类活动的写法(分散运动、户外游戏、个别化(美工室图书吧探索室))
  • Redis过期机制
  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第九节】
  • 用deepseek学大模型03-数学基础 概率论 最大似然估计(MLE)最大后验估计(MAP)
  • 1-13 tortoiseGit忽略文件与文件夹
  • 剑指3000亿产业规模,机器人“武林大会”背后的无锡“野望”
  • 向总书记汇报具身智能发展的“稚辉君”:从期待到兴奋再到备受鼓舞
  • 中国人保聘任田耕为副总裁,此前为工行浙江省分行行长
  • 美财长称关税战升级的责任在中方,外交部:关税战、贸易战没有赢家
  • 北美票房|《罪人》遭媒体唱衰,好莱坞业内人士集体反击
  • AI应用大盘点:谁暴涨?谁掉队?