程序媛开发之路—字符
来源:互联网 发布:mean it 编辑:程序博客网 时间:2024/06/02 13:02
大大小小的也做了好几个项目,每个项目不管是前台与后台交互,还是后台和数据库交互方面,都有碰到需要用到StringBuffer类进行字符串拼接的时候。那么StringBuffer和我们最常见的String类有什么区别呢? 和新加入的StringBuilder字符串变量有什么区别呢?
简单说吧,这三者主要性能区别在于String是不可变的对象。为什么这么说呢?
只要用到定义String类型变量时,每次改变的时候,其实都等同于重新又生成了一个新的String对象。相当于将指针指向新的String对象,而每次生成对象都会对系统产生影响 。所以经常改变内容的字符串最好不要使用String。下面我们来看String的一些基本特点:
- String类是final类,也就意味着String类不能被继承,并且它的成员方法都默认为final方法。
- String实现了三个接口:Serializable、Comparable<String>、CharSequence,Stirng类可以进行CompareTo比较。
- String类代表字符串,其赋值和基本操作我们在项目开发中都经常用到,例如String类包括的方法可以提取字符串,比较字符串,搜索字符串,创建副本等,再这里就不一一复述了。 String类字符串拼接主要是同过“+”以及将其他对象转换为字符串的特殊支持。 但是要注意的是String对象的拼装其实被JVM解释成了StringBuffer对象的拼装。所以这些时候Stirng对象的速度并不比StringBuffer对象慢。
前面我们说到了String是不可修改的,每次改变都重新生成一个新的String对象。而使用StringBuffer类不一样,每次都会对StringBuffer对象本省进行操作,而不是生成新的对象,再改变对象引用。所以从内存使用上优于String类。StringBuffer是可变类和线程安全的字符串操作类。StringBuffer 类似于String的字符串缓冲区。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不分配新的容量,当字符大小超过容量时,会自动增加容量。
初始化:
StringBuffer s = new StringBuffer
这样初始化出来的对象是一个空对象,如果需要创建带有内容的StringBuffer对象,则可以用:StringBuffer s = new StringBuffer("a bc");
注意: tringBuffer 和String 属于不同的类型,不能直接进行强制类型转换。
StringBuffer主要操作是append和insert方法,可重载这些方法,以接受任意类型的数据。每个方法都能将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符缓冲区中。 append方法始终将这些字符添加到缓冲区的末端。而insert方法则在指定的点添加字符。
StringBuilder是jdk5.0中新增加的一个类。StringBuffer 和StringBuilder两个基本上相同,只是StringBuffer是线程安全,可以同步的用于多个线程之中,类似String的字符串缓冲区,但是不能修改。 StringBuilder一个可变的字符序列,StringBuilder的实例用于多个线程并且是不安全,非同步的。
在性能上,谁更胜一筹呢?我们一起看下面的例子:
package com.tgb.cachetest.zhy; public class testString {public static void main(String[] args){String str=""; long startTime = System.currentTimeMillis(); for(long i = 0; i<100000;i++){str = str+i; }long endTime = System.currentTimeMillis();long time = endTime - startTime; System.out.print("String 消耗时间: " + time); StringBuilder builder = new StringBuilder("");startTime = System.currentTimeMillis(); for(long k = 0; k<100000;k++){builder.append(k);}endTime = System.currentTimeMillis();time = endTime - startTime; System.out.print(" StringBuilder 消耗时间:" + time);StringBuffer buffer = new StringBuffer(""); startTime = System.currentTimeMillis(); for(long n= 0; n<100000;n++){buffer.append(n); }endTime = System.currentTimeMillis(); time = endTime - startTime; System.out.println(" StringBuffer 消耗时间:"+ time);} }
运行上面的例子,得到的结果是:
从上面我们可以看出:StringBuilder > StringBuffer > String .
总结: 如果要操作少量的数据最好用String类型,如果是单线程操作字符串缓冲区操作大量数据,用StringBuilder类型。如果是多线程操作字符串缓冲区下操作大量数据,用StringBuffer.
- 程序媛开发之路—字符
- 程序媛开发之路—JSP自定义标签
- 操作系统开发之——打印字符
- Java开发字符界面程序
- 一名程序媛的软件开发之路
- 袁峰:我的程序开发之路
- 程序人生 - 开发工程师人生之路
- 程序人生 : 开发工程师人生之路
- 程序人生 : 开发工程师人生之路
- “欢快”的小程序开发之路
- IOS开发之—程序截图
- IOS开发之—程序截图
- IOS开发之—程序截图
- IOS开发之—程序截图
- IOS开发之—程序截图
- 程序开发之“道”
- Web开发之程序开发
- 趣味程序之打印字符图案系列
- 975 关于521【打表】
- Android之发送短信和接收验证码
- 给docker的官方mongo镜像添加认证登录
- 关于View的ScrollTo, getScrollX 和 getScrollY
- 68 MRC单例实现
- 程序媛开发之路—字符
- GitHub优秀的 Android 开源项目整理-经典版
- org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update
- 69 单例使用宏实现
- zoj 3362 Beer Problem 【最大费用最大流 需要判断最长路值是否为负】
- NFS server权限设置问题
- 助力开发团队
- OpenGL-vs2012-glfw-glew 测试环境搭建
- 新的征程