StringBuffer类比String类更高效地存储字符串还是更高效的追加字符串 本帖最后由 ouyangqing 于 2011-01-17 15:02:35 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用 String 来拼接字符串会浪费很多中间对象的内存 在进行 String 的相关操作的时候会产生许多临时的 String 对象。而 StringBuffer 在操作上是在一个缓冲中进行的,性能当然优越得多。这样一来 stringbuffer的效率就比string高。而做为简单的字符串传递和其它操作,只不要改变字符串内容的操作,用 String 效率会高一些。 那就是说存储效率还是String类的高咯 如果在程序中需要对字符串进行频繁的修改连接操作的话.使用StringBuffer性能会更高 因为昨天考试出了这道么一道选择题:其中两个选项,一个是stringbuffer比String更高效的追加字符串,一个是stringbuffer比String更高效的存储字符串,我选的是追加字符串,但老师的标准答案是存储字符串,我现在就想搞明白,我的答案到底是对还是错 要解决这些问题就必须了解对于String 和StringBuffer的一些区别:1.Sting是一个不变的对象,一但被创建时就不能在修改它的分配的内存大小,对于已经创建的Sting类的对象进行修改后要保存到一个重新创建的String类对象中去,2.String类是一个被final修饰的类,是不能被继承的;3。StringBuffer类是一个可变得对象,当对它进行修改后,不会像String类那样要重新去创建一个对象;4.StringBuffer类是不能通过一个赋值号给它进行赋值的;5。在字符串连接中StringBuffer要比String类的效率更高一些,因为String类是不可变的每次对StringBuffer类进行修改时都要进行创建新的对象,原来的对象就没用了,要被垃圾回收掉;这会影响操作效率; 那也就是说追加效率是StringBuffer的高,存储的效率是一样的咯 我们都知道字符串其实就是一个char型的数组。而String实现内部是一个不可变的 final char[] 长度等于字符串的长度,字符串对象一旦产生就不可以修改,java的操作符+在连接字符串时被重写,每2个字符串用+号连接一次都会产生一个新的长度等于连接字符串长度之和final char[]为内部实现的新的对象,同样不可修改。每次用+连接都会这样的操作,可想而知如果大量使用+性能消耗就会很大。而StringBuffer实现的是一个一个可变的 char[] 默认的构造方法是长度为16的数组,如果当前StringBuffer通过append方法加入一个字符串,会先将其加入到char[]数组当中,只用当长度超过了char[]的长度才会先产生一个新的长度更长的char[]将旧的char[] 数据先复制到新的char[] 中再将字符串放入其中,这样一对比就可以看出来,在进行大量字符串连接的时候 StringBuffer有性能上面的优势。当然在一定数量级内部2者区别不大,为了表现你对2者的了解,如果刚进公司还是用StringBuffer吧 -_-。 实在不行就看源码吧,别死扣书和老师。String是不可变的对象,有修改行为的操作都生成新的实例返回。可以将它看成和int、long这些基本类型一样拥有值语义。StringBuffer、StringBuilder则可对本对象做修改,目的是提高频繁操作的效率。至于存储效率不是这两个类的目的。实际上,这些类一般会预留多一些的无用空间,以便在频繁操作时减少重分配内存的次数。比如说,原长度是8,append后预计长度是17,则可能会直接分配到32字节,之后append时如不超过32字节就不需重分配内存并复制。类似,Vector、ArrayList等以连续空间存储可变个元素的都用到这些策略。从这点上,存储效率不大可能比String高。 String具有不变性,对于String你处理后变成新的StringStringBuffer自身是可以改变的考虑性能有点儿多余了吧String str1 = "abc";StringBuffer sb1 = new StringBuffer("abc");str1.concat("def");sb1.append("def");System.out.println("str1=" + str1);System.out.println("sb1=" + sb1.toString());结果应该是str1=abcsb1=abcdef 我觉得它说的意思就是追加,就是拼接字符串更高效一下。不过,StringBuilder的效率,比StringBuffer还要高哦,只是StringBulder是非线程安全的。 我也来回一下,我是这样理解的。如果String a="stringtest";String b="addString";String nStr=a+b;内存中就产生了a ,b ,nStr三个对象。StringBuffered sb=new StringBuffered();sb.appand("stringtest");sb.appand("addString");这时内存中只有一个sb对象。他内存占stringtestaddString这么多,而String操作完后内存中有stringtest,addString,stringtestaddString这样String明显的占更多内存,所以效率就很明显了 java有类验证两个ip是不是同网段吗? 错哪了这是? swing实现象优化大师左边按钮效果(一个答案采用者额外加100分) 为什么我找不到class java安装程序是什么样的 簡單問題:字符串中是否含有"&&&"? 我想编写一个处理图像的程序,其中一个功能是在图像上打上logo,大家给我个思路阿 讨论变量命名规则:倾囊放送,参与者都有分! java.lang.NullPointerException该处理 用jdbc 实现ms sql server7 移植到 oracle8i 问个排序的问题 @Override 解析器
而做为简单的字符串传递和其它操作,只不要改变字符串内容的操作,用 String 效率会高一些。
我选的是追加字符串,但老师的标准答案是存储字符串,我现在就想搞明白,我的答案到底是对还是错
1.Sting是一个不变的对象,一但被创建时就不能在修改它的分配的内存大小,对于已经创建的Sting类的对象进行修改后要保存到一个重新创建的String类对象中去,
2.String类是一个被final修饰的类,是不能被继承的;
3。StringBuffer类是一个可变得对象,当对它进行修改后,不会像String类那样要重新去创建一个对象;
4.StringBuffer类是不能通过一个赋值号给它进行赋值的;
5。在字符串连接中StringBuffer要比String类的效率更高一些,因为String类是不可变的每次对StringBuffer类进行修改时都要进行创建新的对象,原来的对象就没用了,要被垃圾回收掉;这会影响操作效率;
而StringBuffer实现的是一个一个可变的 char[] 默认的构造方法是长度为16的数组,如果当前StringBuffer通过append方法加入一个字符串,会先将其加入到char[]数组当中,只用当长度超过了
char[]的长度才会先产生一个新的长度更长的char[]将旧的char[] 数据先复制到新的char[] 中再将字符串放入其中,这样一对比就可以看出来,在进行大量字符串连接的时候 StringBuffer有性能上面的优势。
当然在一定数量级内部2者区别不大,为了表现你对2者的了解,如果刚进公司还是用StringBuffer吧 -_-。
至于存储效率不是这两个类的目的。实际上,这些类一般会预留多一些的无用空间,以便在频繁操作时减少重分配内存的次数。比如说,原长度是8,append后预计长度是17,则可能会直接分配到32字节,之后append时如不超过32字节就不需重分配内存并复制。类似,Vector、ArrayList等以连续空间存储可变个元素的都用到这些策略。从这点上,存储效率不大可能比String高。
String str1 = "abc";
StringBuffer sb1 = new StringBuffer("abc");
str1.concat("def");
sb1.append("def");
System.out.println("str1=" + str1);
System.out.println("sb1=" + sb1.toString());
结果应该是
str1=abc
sb1=abcdef
如果
String a="stringtest";
String b="addString";
String nStr=a+b;
内存中就产生了a ,b ,nStr三个对象。
StringBuffered sb=new StringBuffered();
sb.appand("stringtest");
sb.appand("addString");
这时内存中只有一个sb对象。他内存占stringtestaddString这么多,而String操作完后内存中有stringtest,addString,stringtestaddString这样String明显的占更多内存,所以效率就很明显了