String StringBuffer区别

zhouixi 2017-02-17 05:39:32
String StringBuffer 同样都是由final修饰的。
为什么String不能改变
而StringBuffer则可以改变 不解?求高手。
...全文
151 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
鱿鱼ing 2017-02-17
  • 打赏
  • 举报
回复
String是一个类,也可以表示字符串数据类型 String:是对象不是原始类型.为不可变对象,一旦被创建,就不能修改它的值.对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去. String 是final类,即不能被继承.作为参数传递时,只是复制了一份引用 string s = "a"; s = "b"; 那意思是这里是两个对象,string s = "a";是一个对象,s = "b"; 又是1个对象,第一个对象会被垃圾回收 StringBuffer: 是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象 它只能通过构造函数来建立, StringBuffer sb = new StringBuffer(); 对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer中赋值的时候可以通过它的append方法. sb.append("hello"); StringBuffer的处理步骤实际上是通过建立一个StringBuffer,然后调用append(),最后再将StringBuffer toSting(); insert方法 比较 字符串连接操作中StringBuffer的效率要比String高 String 新建对象,垃圾回收影响性能 不可变好处: 1. 只有当字符串是不可变的,字符串池才有可能实现。字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串。但如果字符串是可变的,那么String interning将不能实现 2. 数据库的用户名、密码都是以字符串的形式传入来获得数据库的连接,或者在socket编程中,主机名和端口都是以字符串的形式传入。因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子,改变字符串指向的对象的值,造成安全漏洞。 3. 因为字符串是不可变的,所以是多线程共享安全的,同一个字符串实例可以被多个线程共享。 4. 因为字符串是不可变的,所以在它创建的时候hashcode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键往往都使用字符串 5.类加载器要用到字符串,不可变性提供了安全性,以便正确的类被加载。譬如你想加载java.sql.Connection类,而这个值被改成了myhacked.Connection,那么会对你的数据库造成不可知的破坏。 坏处:影响效率,对系统性能产生影响。 特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的 StringBuffer 和StringBuilder可变 区别 改变 StringBuffer 每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。 StringBuilder类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。但不保证同步。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。 Final关键字    final关键词生命的域的值只能被 初始化一次,一般在构造方法中初始化,在多线程开发中,final域通常用来实现不可变对象,当对象中干的共享变量的值不可能发生变化时,在多线程中也就不需要同步来进行处理,故在多线程开发中应该尽可能使用不可变对象。另外,在代码执行时,final域的值可以被保存在寄存器中,而不用从主存中频繁重新读取。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧