A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhangx 中级黑马   /  2013-4-16 14:58  /  1444 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String和StringBuffer我只知道一些浅显的区别,但是一到应用就糊涂了,总是混淆,不知道什么时候该用Sting什么时候该用StringBuffer?求高人指点String和StringBuffer的深度区别

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

4 个回复

倒序浏览
1.Character 是进行单个字符操作的
2.String 对一串字符进行操作。不可变类。
3.StringBuffer 也是对一串字符进行操作,但是可变类。

String:
是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.

StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
note:不能通过付值符号对他进行付值.
sb = "welcome to here!";//error
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer
中付值的时候可以通过它的append方法.
sb.append("hello");

字符串连接操作中StringBuffer的效率要比String高:

String str = new String("welcome to ");
str += "here";
的处理步骤实际上是通过建立一个StringBuffer,然后调用append(),最后
再将StringBuffer toSting();
这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.

并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.
这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.

评分

参与人数 1技术分 +2 收起 理由
陈丽莉 + 2

查看全部评分

回复 使用道具 举报
String专门定义不变字符串,而StingBuffer用来定义可变字符串。
两者在性能上椰油很大的区别:
String比较适合短的字符串,StingBuffer适合动态增加的字符串。
在实际使用过程中,要求:String+String这种在BS开发结构中不被提倡,对性能影响比较大。而StingBuffer则是比较推荐使用方法。
类似的不提倡使用的还有System.out.print()方法

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
在一些公司,有明文规定,只能使用StringBuilder和StringBuffer对字符串进行拼接;

原因只有一个,string + string的拼接,意味着”堆内存中“永远都保存了 string 无法被回收,造成内存泄露;据说对性能也有影响;

回答的不好,请支持,谢谢

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
你好,
:StringBuffer
        (1)字符串的缓冲区,是一个容器。
        (2)它和String的区别
                它是缓冲区可变长度的。
        (3)构造方法
                StringBuffer() 构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。
                StringBuffer(int num) 构造一个不带字符,但具有指定初始容量的字符串缓冲区。
                StringBuffer(String str) 构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。
        (4)常用方法
                A:增加数据
                        **append :添加各种类型的数据
                        **insert : 在容器指定位置插入各种类型的数据。
                B:删除数据
                        **deleteCharAt : 删除指定位置的字符
                        **delete 还可以用于清空StringBuffer的缓冲区
                C:替换
                        **replace
                D:获取
                        **charAt
                E:长度和容量
                        **length() 元素的个数
                        **capacity 元素的理论值
                F:获取元素的位置
                        **indexOf
                        **lastIndexOf
                G:截取
                        **substring(int start)
                        **substring(int start,int end)
                H:反转
                        **reverse
        (5)字符串和StringBuffer的转换
                String-->StringBuffer通过构造:
                        如:StringBuffer sb = new StringBuffer(String str)
                StringBuffer--String通过toString方法
                        如:StringBuffer sb = new StringBuffer();
                           sb.toString();

3:StringBuilder
        和StringBuffer的功能是一样的,但是有区别:
        StringBuffer(JDK1.0)是线程安全的。
        StringBuilder(JDK1.5)不保证线程安全。

        一般来说,我们写的程序都是单线程的,所以,用StringBuilder,效率高。

        JDK版本的升级原则:
        A:提高效率
        B:提高安全性
        C:简化书写

评分

参与人数 1技术分 +2 收起 理由
陈丽莉 + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马