Java基础学习------字符串、String类、StringBuffer类、StringBuilder类总结

一、定义:
字符串是字符的序列、它可以包含字母、数字和其他符号。
String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
StringBuffer类代表一个线程安全的可变序列。
StringBuilder类代表一个可变序列。若将 StringBuilder 的实例用于多个线程是不安全的。

二、用途:
String 类包括的方法可用于检查序列的单个字符、比较字符串、搜索字符串、提取子字符串、创建字符串副本并将所有字符全部转换为大写或小写。
StringBuffer 类的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。
StringBuilder类是与StringBuffer 兼容的 API,但不保证同步,多线程也不安全。

三、两个问题

1、可变性
String类构造的对象是不变的,从它的方法可以看出,方法只有读,就连转换大小写都是先创建副本后改变大小写。这里的不变性个人觉得就是在实例化后,String对象的大小,内容等基本属性都是 不能改变的是定值。
由于它的不变性带来了一些麻烦,当我们想让它变的时候,它就是变不了,所以StringBuffer和StringBuilder两个类想救世主一样“搜得一身”解决了可变的问题,
类似于给String类带了个拖斗----字符串缓冲区。
每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。
自此可变与不可变都能随心所变,很爽吧。。嗦哒斯馁

2.字符串的处理能力
StringBuffer和StringBuilder两个类很好的解决可变问题,可是对于这个类的g功能不完善,字符串处理能力极弱、积弱、极弱(跟String类相比而言),里面基本方法都有就是少了很多String类中处理字符串的必备利器,最重要的split(),startWith(),trim()等等,但是类中有个toString()方法解决了这个问题,也许是设计懒得重复造轮子“去找String处理去吧!”

3.区别是什么
对于字符串个数<1000字符时 新建String对象和StringBuffer对象和StringBuilder对象,区别不大,有时String对象的创建速度会比其他两个快,
超过10000个字符时,毋庸置疑,后者效率更高。
但在1000到10000之间差别会很大。(摘自数据结构与算法)

JAVA测试数据

字符长度1000-----StringBuffer程序运行时间: 0ms
字符长度1000-----String程序运行时间: 0ms
字符长度1000-----StringBuilder程序运行时间: 0ms
>>>>>>>>>>>>
字符长度10000-----StringBuffer程序运行时间: 15ms
字符长度10000-----String程序运行时间: 187ms
字符长度10000-----StringBuilder程序运行时间: 0ms
>>>>>>>>>>>>
字符长度100000-----StringBuffer程序运行时间: 0ms
字符长度100000-----String程序运行时间: 29580ms
字符长度100000-----StringBuilder程序运行时间: 0ms
>>>>>>>>>>>>

1000000电脑没有了反应。
测试代码
[/code]
public static void test( int size) {

StringBuffer sBuffer=new StringBuffer();
StringBuilder sBuilder=new StringBuilder();
String string="";
long startTime=System.currentTimeMillis(); //获取开始时间
for (int i = 0; i < size; i++) {
sBuffer.append("a");
}
long endTime=System.currentTimeMillis();

long startTime1=System.currentTimeMillis(); //获取开始时间
for (int i = 0; i < size; i++) {
string +="a";
}
long endTime1=System.currentTimeMillis();

long startTime2=System.currentTimeMillis(); //获取开始时间
for (int i = 0; i < size; i++) {
sBuilder.append("a");
}
long endTime2=System.currentTimeMillis();
System.out.println("字符长度"+size+"-----StringBuffer程序运行时间: "+(endTime-startTime)+"ms");
System.out.println("字符长度"+size+"-----String程序运行时间: "+(endTime1-startTime1)+"ms");
System.out.println("字符长度"+size+"-----StringBuilder程序运行时间: "+(endTime2-startTime2)+"ms");
System.out.println(">>>>>>>>>>>>");


}
public static void main(String[] args) {
// TODO Auto-generated method stub
test(1000);
test(10000);
test(100000);
test(1000000);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值