package example.java;

/**
* @author 杜科
* @description 简单动态字符串,非线程安全。采取类似buffer的设计,使其成为一个可以方便重用的StringBuilder
* @contact AllenDuke@163.com
* @date 2020/6/9
*/
public class SDS implements Comparable<SDS>{ private int writePosition;//下一个要写的下标 private int capacity;//char数组大小 private char[] chars; private int hashcode=0; public SDS(){
this.capacity=40;
this.chars=new char[40];
} public SDS(int capacity){
this.capacity=capacity;
this.chars=new char[capacity];
} /**
*在使用sds时,尽量设定好最大容量,以减少扩容判断
*/ public SDS append(char ch){
if(writePosition==capacity) grow();
this.chars[writePosition++]=ch;
return this;
} public SDS append(String s){
if((this.capacity-this.writePosition)<s.length()) grow();//先一次判断扩容
for(int i=0;i<s.length();i++){
this.chars[writePosition++]=s.charAt(i);
}
// s.getChars(0, s.length(), chars, writePosition);
return this;
} public SDS append(SDS sds){
if((this.capacity-this.writePosition)<sds.length()) grow();//先一次判断扩容
for(int i=0;i<sds.length();i++){
this.chars[writePosition++]=sds.charAt(i);
}
return this;
} private void grow(){
int oldCapacity=capacity;
int newCapacity=capacity<<1;
char[] newChars=new char[newCapacity];
System.arraycopy(chars,0,newChars,0,oldCapacity);
capacity=newCapacity;
this.chars=newChars;
} public char charAt(int i){
return this.chars[i];
} public SDS setCharAt(int i, char ch){
this.chars[i]=ch;
return this;
} public SDS clear(){
this.writePosition=0;
this.hashcode=0;
return this;
} public int length(){
return this.writePosition;
} @Override
public int compareTo(SDS sds){
if(this.writePosition<sds.writePosition) return -1;
if(this.writePosition>sds.writePosition) return 1;
for(int i=0;i<writePosition;i++){
if(chars[i]<sds.charAt(i)) return -1;
if(chars[i]>sds.charAt(i)) return 1;
}
return 0;
} @Override
public int hashCode() {
if(hashcode!=0) return hashcode;
for(int i=0;i<writePosition;i++) hashcode=hashcode*31+chars[i];//与String的hashcode生成方法保持一致
return hashcode;
} @Override
public boolean equals(Object obj) {
if(this==obj) return true;
if(obj.hashCode()!=this.hashcode) return false;
if(!(obj instanceof SDS)) return false;
SDS sds= (SDS) obj;
if(sds.writePosition!=this.writePosition) return false;
for(int i=0;i<this.writePosition;i++){
if(sds.charAt(i)!=this.chars[i]) return false;
}
return true;
} @Override
public String toString() {
return new String(chars,0,writePosition);
} }

比起StringBuilder,SDS减少了大量无关紧要的运算,性能似乎比StringBuilder好。

简单测试

package example.java;

/**
* @author 杜科
* @description 测试SDS可重用的性能
* @contact AllenDuke@163.com
* @date 2020/6/17
*/
public class SDSTest { private static int count=100000000; public static void main(String[] args) {
long start=System.currentTimeMillis()/1000;
testStringBuilder();
testSDS();
} public static void testStringBuilder(){
StringBuilder builder = new StringBuilder();
long time = System.currentTimeMillis();
for(int i=0;i<10000000;i++){
builder = new StringBuilder(40);
builder.append("aa");
builder.append("bb");
builder.append("cc");
builder.append("dd");
builder.append("ee");
builder.toString();
}
System.out.println("StringBuilder new 耗时:" + (System.currentTimeMillis() - time));
long time1 = System.currentTimeMillis();
StringBuilder builder1 = new StringBuilder(40);
for(int i=0;i<10000000;i++){
builder1.delete(0, builder.length());
builder1.append("aa");
builder1.append("bb");
builder1.append("cc“);
builder1.append("dd");
builder1.append("ee");
builder1.toString();
}
System.out.println("StringBuilder delete 耗时:" + (System.currentTimeMillis() - time1));
long time2 = System.currentTimeMillis();
StringBuilder builder2 = new StringBuilder(40);
for(int i=0;i<10000000;i++){
builder2.setLength(0);
builder2.append("aa");
builder2.append("bb");
builder2.append("cc");
builder2.append("dd");
builder2.append("ee");
builder2.toString();
}
System.out.println("StringBuilder setLenth=0 耗时:" + (System.currentTimeMillis() - time2));
} public static void testSDS(){
SDS sds;
long time = System.currentTimeMillis();
for(int i=0;i<10000000;i++){
sds = new SDS();
sds.append("aa");
sds.append("bb");
sds.append("cc");
sds.append("dd");
sds.append("ee");
sds.toString();
}
System.out.println("SDS new 耗时:" + (System.currentTimeMillis() - time));
long time2 = System.currentTimeMillis();
sds=new SDS();
for(int i=0;i<10000000;i++){
sds.clear();
sds.append("aa");
sds.append("bb");
sds.append("cc");
sds.append("dd");
sds.append("ee");
sds.toString();
}
System.out.println("SDS clear 耗时:" + (System.currentTimeMillis() - time2));
}
}

SDS——重用StringBuilder的更多相关文章

  1. Java StringBuilder 高性能用法总结

    StringBuilder 误解: 1. Java编译优化后+和StringBuilder的效果一样: 2. StringBuilder不是线程安全的,为了"安全"起见最好还是用S ...

  2. Java 中 StringBuilder 在高性能用法总结

    关于StringBuilder,一般同学只简单记住了,字符串拼接要用StringBuilder,不要用+,也不要用StringBuffer,然后性能就是最好的了,真的吗吗吗吗? 还有些同学,还听过三句 ...

  3. StringBuilder在高性能场景下的正确用法

    转载:<StringBuilder在高性能场景下的正确用法> by 江南白衣 关于StringBuilder,一般同学只简单记住了,字符串拼接要用StringBuilder,不要用+,也不 ...

  4. Redis 数据结构之简单动态字符串SDS

    几个概念1:key对象 数据库存储键值对的键,总是一个字符串对象.2:value对象 数据库存储键值对的值,可以是字符串对象,list对象,hash对象,set对象,sorted set对象.    ...

  5. Netty高性能编程备忘录(下)

    估计很快就要被拍砖然后修改,因此转载请保持原文链接,否则视为侵权... http://calvin1978.blogcn.com/articles/netty-performance.html 前文再 ...

  6. StringBuilder_学习笔记

    参考:https://www.jianshu.com/p/160c9be0b132 连接符号 "+" 本质 字符串变量(非final修饰)通过 "+" 进行拼接 ...

  7. 唯品会Java开发手册》1.0.2版阅读

    <唯品会Java开发手册>1.0.2版阅读 1. 概述 <阿里巴巴Java开发手册>,是首个对外公布的企业级Java开发手册,对整个业界都有重要的意义. 我们结合唯品会的内部经 ...

  8. 【37】String,StringBuffer,StringBuilder区别和概念

    基本的概念: 查看 API 会发现,String.StringBuffer.StringBuilder 都实现了 CharSequence 接口,内部都是用一个char数组实现,虽然它们都与字符串相关 ...

  9. Redis数据结构之简单动态字符串SDS

    Redis的底层数据结构非常多,其中包括SDS.ZipList.SkipList.LinkedList.HashTable.Intset等.如果你对Redis的理解还只停留在get.set的水平的话, ...

随机推荐

  1. 一对多分页的SQL到底应该怎么写?

    1. 前言 MySQL一对多的数据分页是非常常见的需求,比如我们要查询商品和商品的图片信息.但是很多人会在这里遇到分页的误区,得到不正确的结果.今天就来分析并解决这个问题. 2. 问题分析 我们先创建 ...

  2. gatewayworker 安装 pcntl 扩展

    安装其它扩展也是如此. 第一步,查看php版本: /phpstudy/server/php/bin/php -v 第二步,下载扩展文件: http://php.net/releases/  这里面寻找 ...

  3. Python 中的元类到底是什么?这篇恐怕是最清楚的了

    类作为对象 在理解元类之前,您需要掌握 Python 的类.Python 从 Smalltalk 语言中借用了一个非常特殊的类概念. 在大多数语言中,类只是描述如何产生对象的代码段.在 Python ...

  4. 教你如何开发一个完败Miracast的投屏新功能

      手机与电视,是陪伴在我们生活最常见,陪伴最长久的智能设备.迅猛发展的移动终端与通信技术,赋予了手机更广阔多元的应用生态,大屏电视则以大视野和震撼影音,弥补了手里方寸带来的视觉局限.而今,手机的延伸 ...

  5. idea 链接 Tomcat 出现的错误 Application server libraries not found

    红色字体是重点 好久好久没有上来了.一直忙于工作没事有时间进行总结. 最近在家隔离期间发现了一个好玩的游戏率土之滨  , 玩的不错和大盟主混的很好.在给盟里做考勤任务的时候发现很麻烦还需要用Excel ...

  6. (私人收藏)java实例、知识点、面试题、SHH、Spring、算法、图书管理系统、综合参考

    https://pan.baidu.com/s/1hkmgJU6pf2sBjNV1NlOaNgr6l2 Java趣味编程100例java经典选择题100例及答案java面试题大全java排序算法大全j ...

  7. tomcat发布时候jar包问题

    今天遇到个问题就是,启动tomcat时,报:java.lang.NullPointerException at org.apache.jsp.**_jsp.jspInit(index_jsp.java ...

  8. C#数据结构与算法系列(二十一):希尔排序算法(ShellSort)

    1.介绍 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序. 2.基本思想 希尔排 ...

  9. HTML条件注释_关于IE条件注释

    普通的HTML注释形式是 <!-- 注释 --> 而IE5~IE9这5个版本的IE浏览器还另外支持一种特殊的if条件注释(感觉有点类似模板渲染时的语法结构) <!--[if IE]& ...

  10. SpringCloud系列之集成分布式事务Seata应用篇

    目录 前言 项目版本 项目说明 Seata服务端部署 Seata客户端集成 cloud-web module-order module-cart module-goods module-wallet ...