做积极的人,而不是积极废人!
源码精品专栏
原创 | Java 2020超神之路,很肝~
中文详细注释的开源项目
RPC 框架 Dubbo 源码解析
网络应用框架 Netty 源码解析
消息中间件 RocketMQ 源码解析
数据库中间件 Sharding-JDBC 和 MyCAT 源码解析
作业调度中间件 Elastic-Job 源码解析
分布式事务中间件 TCC-Transaction 源码解析
Eureka 和 Hystrix 源码解析
Java 并发源码
一,前言二,字符串,StringBuiler和StringBuffer三,各种字符串操作的效率测试四,Java字符串和正则表达式五,总结
一,前言
刚开始学习Java时,作为只是C语言的小白,就为其中的字符串操作而感到震撼。在此之下,C语言在字节序中保存一个结尾的\ 0去表示字符串,想实现串联拼接,还需要调用strcpy库函数或者自己手动去复制副本,非常麻烦,更别提其他复杂操作,而Java通过字符串类让串联操作变得十分简单和方便。此外,还有stringbuilder等这些类的辅助,那么本文就从String,StringBuiler和StringBuffer的区别开始,去探讨Java中的字符串操作。
二,字符串,StringBuiler和StringBuffer2.1字符串类
Java提供了String类来创建和操作字符串。在二进制中可以看到**,String类内部的实现也是一个字节数组**,这个数组是final类型的,因此** String是不可变的对象,每次在对字符串类进行改变的时候都会生成一个新的字符串对象,**然后将指针指向新的字符串对象。
2.2 StringBuilder类
和字符串类不同的是,StringBuilder类的对象能够被多次修改,并且不产生新的对象。这个特性的意义在于,如果我们进行大量的字符串操作,使用字符串类就会产生很大的性能消耗,而StringBuilder就可以避免这个问题。
2.3 StringBuffer类
StringBuffer和StringBuiler之间的最大不同在于StringBuilder的方法不是线程安全的。
由于StringBuilder相比较于StringBuffer有速度优势,所以多数情况下建议使用StringBuilder类。而在应用程序中要求线程安全的情况下,则必须使用StringBuffer类。
2.4 String,StringBuilder和StringBuffer的比较(对比C / C )操作类型说明是否可变线程安全性表现Java中的String字符串类中使用final关键字修饰字符数组来保存字符串不可变线程安全低Java中的StringBuffer字符串变量可变线程安全一般Java中的StringBuilder字符串变量可变线程不安全一般C / C 中的char *操作char *是一个指针,可以指向一个字符串多重可变不可知高C / C 中的char数组用一个字符编码来保存字符串不可变不可知高C / C 中的字符串封装类字符串可以被看成以字符为元素的一种容器。可变并发读操作是线程安全的较高三,各种字符串操作的效率测试3.1测试代码@Testpublicvoidtest(){intcount=100000;longstartTime=System.currentTimeMillis();Stringstr=””;for(inti=0;i<count;i ){str =i;}System.out.println(“执行” count “次String耗时:” getRunTime(startTime));startTime=System.currentTimeMillis();StringBuilderstringBuilder=newStringBuilder(“”);for(inti=0;i<count;i ){stringBuilder.append(i);}System.out.println(“执行” count “次StringBuilder耗时:” getRunTime(startTime));startTime=System.currentTimeMillis();StringBufferstringBuffer=newStringBuffer(“”);for(inti=0;i<count;i ){stringBuffer.append(i);}System.out.println(“执行” count “次StringBuffer耗时:” getRunTime(startTime));}3.2测试结果执行100000次String耗时:32s执行100000次StringBuilder耗时:2ms执行100000次StringBuffer耗时:4ms3.3小结
可以看到String类的性能远低于StringBuiler和StringBuffer,而StringBuiler在本次测试中比Stringbuffer提高了50%的性能
经过测试和比较,可以看到Java中同为串联操作,但由于背后实现的原理不同,形成的性能差异也是十分巨大,相当于在之下,C / C 中的串行操作性能更高。类的性能远低于StringBuiler和StringBuffer,而StringBuiler比Stringbuffer的性能稍微高一点。对性能的探究,最终还是要回到使用场景,可以进行总结,如果不涉及串联操作,那么String类是首选,如果涉及的串行操作没有线程安全问题,那么使用StringBuilder,如果涉及的串行操作存在线程安全问题,那么使用StringBuffer
欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢: