SDS——重用StringBuilder
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的更多相关文章
- Java StringBuilder 高性能用法总结
StringBuilder 误解: 1. Java编译优化后+和StringBuilder的效果一样: 2. StringBuilder不是线程安全的,为了"安全"起见最好还是用S ...
- Java 中 StringBuilder 在高性能用法总结
关于StringBuilder,一般同学只简单记住了,字符串拼接要用StringBuilder,不要用+,也不要用StringBuffer,然后性能就是最好的了,真的吗吗吗吗? 还有些同学,还听过三句 ...
- StringBuilder在高性能场景下的正确用法
转载:<StringBuilder在高性能场景下的正确用法> by 江南白衣 关于StringBuilder,一般同学只简单记住了,字符串拼接要用StringBuilder,不要用+,也不 ...
- Redis 数据结构之简单动态字符串SDS
几个概念1:key对象 数据库存储键值对的键,总是一个字符串对象.2:value对象 数据库存储键值对的值,可以是字符串对象,list对象,hash对象,set对象,sorted set对象. ...
- Netty高性能编程备忘录(下)
估计很快就要被拍砖然后修改,因此转载请保持原文链接,否则视为侵权... http://calvin1978.blogcn.com/articles/netty-performance.html 前文再 ...
- StringBuilder_学习笔记
参考:https://www.jianshu.com/p/160c9be0b132 连接符号 "+" 本质 字符串变量(非final修饰)通过 "+" 进行拼接 ...
- 唯品会Java开发手册》1.0.2版阅读
<唯品会Java开发手册>1.0.2版阅读 1. 概述 <阿里巴巴Java开发手册>,是首个对外公布的企业级Java开发手册,对整个业界都有重要的意义. 我们结合唯品会的内部经 ...
- 【37】String,StringBuffer,StringBuilder区别和概念
基本的概念: 查看 API 会发现,String.StringBuffer.StringBuilder 都实现了 CharSequence 接口,内部都是用一个char数组实现,虽然它们都与字符串相关 ...
- Redis数据结构之简单动态字符串SDS
Redis的底层数据结构非常多,其中包括SDS.ZipList.SkipList.LinkedList.HashTable.Intset等.如果你对Redis的理解还只停留在get.set的水平的话, ...
随机推荐
- Linux 开放指定端口号
1.开启防火墙 [root@localhost opt]# systemctl start firewalld 2.查看当前防火墙状态 [root@localhost opt]# systemctl ...
- Flask02-Template
## 基础使用 $ vim app/templates/index.html > <html> > <head> > <title>{{title ...
- 入门大数据---PySpark
一.前言 前面我们学习的是使用Scala和Java开发Spark.最近补充了下Python基础,那么就用Python开发下Spark.Python开发Spark简称PySpark. 二.环境准备 1. ...
- python文件处理-根据txt列表将文件从其他文件夹 拷贝到指定目录
内容涉及:路径拼接,文件拷贝,内容追加(append) # !/usr/bin/python # -*- coding: UTF-8 -*- import pandas as pd import os ...
- jquery ajax 参数列表定义
出处:http://www.cnblogs.com/tylerdonet/ 1.url (要求为String类型的参数,(默认为当前页地址)发送请求的地址) 2.type ...
- 超简单集成ML kit 实现听写单词播报
背景 相信我们大家在刚开始学习一门语言的时候都有过听写,现在的小学生学语文的时候一项重要的课后作业就是听写课文中的生词,很多家长们都有这方面的经历.不过一方面这种读单词的动作相对简单,另一方面家长 ...
- Spring拦截器和SpringAop实现
一.拦截器 1.aop是面向切面编程,原理是java的发射技术. 2.分为三类,before.after.arround 3.springMvc为我们提供了一个适配器HandlerIntercepto ...
- java语言基础(五)_Scanner类_Random类_ArrayList类
API API(Application Programming Interface),应用程序编程接口.Java API是一本程序员的字典 ,是JDK中提供给程序员使用的类的说明文档.这些类将底层的代 ...
- css条纹背景样式、及方格斜纹背景的实现
一.横向条纹如下代码: background: linear-gradient(#fb3 %, #58a %) 上面代码表示整个图片的上部分20%和下部分20%是对应的纯色,只有中间的部分是渐变色.如 ...
- Flv.js文档使用随记
关键字:Flv.js | Flv js | Flv-js | HTML5 FLV Player | 0x001: 前言以下涉及到 flv.js 所有内容均是V1.5.0版本内的,如方法.属性.常量.监 ...