黑马程序员技术交流社区

标题: StringBuffer 和StringBuilder 为什么能被final修饰? [打印本页]

作者: t_mac    时间: 2011-12-3 23:08
标题: StringBuffer 和StringBuilder 为什么能被final修饰?
本帖最后由 t_mac 于 2011-12-4 17:05 编辑

StringBuffer 和StringBuilder 不是可变字符串吗, 为啥还可以被final修饰,如果这样直接用String不就行了吗?
作者: 王德云    时间: 2011-12-3 23:28
final修饰类:表示该类不可继承
线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。

作者: 段波    时间: 2011-12-4 00:01
是的!StringBuffer和StringBuider是可变字符序列,二者用法差不多,只不过StringBuffer是线程安全的,而StringBuider是不安全的!一般情况下使用StringBuider就可以了,除非要考虑数据安全时才用StringBuffer.  final修饰表示它们是终极类,不能被继承 ,jdk中public final class StringBufferextends Objectimplements Serializable, CharSequence已经标明了,应该不会有问题噻!
   string 是System.Text中的一个基类,它是基于引用类型而不是基于值类型的.string变量追加时 是先开辟一个空间,把现在的复制过去再加新内容,然后让变量指向这个新空间,所以如果要经常改变的内容就不要用string了选择StringBuider会好得多!

作者: 赵燕燕    时间: 2011-12-4 01:08
final修饰变量时,变量成为常量,值不可被修改
StringBuilder是个类,用final修饰它,表示该类不能被继承。
作者: 常登凯    时间: 2011-12-4 01:40
final修饰变量时,变量成为常量,值不可被修改;
StringBuffer是可变字符串没错,但是你用了final修饰他就是常量了,你就不能修改它了。他可变不代表他不能用final修饰啊。至于为什么不用String而用SB,这个就是程序员基于目标的选择了吧。
作者: fly51888    时间: 2011-12-4 12:10
本帖最后由 fly51888 于 2011-12-4 12:12 编辑

我想该提问者没有把概念搞清楚。final修饰类时表示该类不可继承;修饰变量时表示该变量是常量,即不可变;
修饰方法时表示该方法不可被重写,记住是重写哦,不是重载。
例如:final StringBuilder sb = new StringBuilder("dasfg");
该语句中的final修饰StringBuilder  表示变量sb只能指向 new StringBuilder("dasfg")创建的内存地址,
即指针的指向是不能改变的,如:sb = new StringBuilder("dsaf");就会出现不能编译的问题;但指针指向的内容还是可以改变的,
如:改变内容 sb.append("dsaf");该语法是正确的。

完整代码如下:
public class App {

        public static void main(String[] args) {
                final StringBuilder sb = new StringBuilder("dasfg");
                sb.append("dsaf");
               
                sb = new StringBuilder("dsaf");
        }
}

其中sb = new StringBuilder("dsag");行,会出现编译错误。
StringBuffer也是同理。只是StringBuffer是线程安全的,StringBuilder不是。
作者: 杨银川    时间: 2011-12-4 12:48
恩,楼上的大神们回答的都很全了,其实简单的说,StringBuffer 和StringBuilder 是可变的,String是不变的,但都可以用final修饰,只是他们的用法不一样,所以要明确两点,一个是看声明,一个是看用途,不冲突,呵呵,个人意见,多多学习。
作者: t_mac    时间: 2011-12-4 17:05
谢谢各位,学习了
作者: 武超    时间: 2011-12-4 20:15
类String Buffer是类似String的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容
而StringBuilder也是一样的
作者: 李明    时间: 2011-12-8 23:04
StringBuilder是jdk1.5开始有的新特性,是StringBuffer的简易替代。final修饰类表示类不可以被继承,和他是可变容器应该没有关系。final修饰变量才等同于常量。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2