zoukankan      html  css  js  c++  java
  • String,StringBuilder和StringBuffer

    String

    字符串常量,由String创建的字符内容,长度是不可改变,存放字符的数组被声明为final。

    实际上String类操作字符串是通过建立一个StringBuffer,然后调用append();最后再toString()转换为String,效率上要低一些。并且原来的对象需要被回收,影响性能。

    为什么String要设计为不可变?

    1.字符串常量池的需要

    字符串常量池是Java堆中一个特殊的存储区域,当创建一个String对象时,如果该字符串值已存在常量池中,就不会创建一个新的对象,而是引用已经存在的对象。

    String s1 = " Helloworld! ";

    String s2 = " Helloworld! ";

    执行完第一行代码后,常量池已存在" Helloworld ",则直接把已存在的字符串内存地址返回给s2

    如果字符串对象允许改变,那么将会导致各种逻辑错误,比如改变一个对象会影响到另一个独立的对象,这也是一种优化的手段。

    2.允许String对象缓存HashCode

    Java中String对象的HashCode被频繁使用,字符串不变性保证了HashCode的唯一性,可以对HashCode进行缓存,无需每次使用都计算新的HashCode.

    3.安全性

    String被许多Java类用来当做参数,如URL地址,文件路径PATH,反射机制所需的String参数等,若String是可变的,将会引起各种安全隐患。

    设计为不可变带来的好处

    1.字符串不可变才能实现字符串池,可以在运行时节省很多Java堆空间

    2.还是安全性提高了,数据库,网络编程甚至类加载器都会使用到字符串,不可变的字符串会减少漏洞的发生

    3.多线程安全。同一个字符串实例可以被多个线程共享,String本身就是线程安全的

    4.其HashCode被缓存,无需重新计算,使得字符串适合作为Map中的键,因为处理速度要更快。

    StringBuffer

    字符串变量,如果频繁对字符串内容进行修改,最好使用StringBuffer,因为它对StringBuffer对象本身进行操作,而不是生成新的String对象然后指针指向新的对象。

    StringBuffer大部分字符串操作方法都加了关键字Synchronized,即线程安全。

    StringBuffer和String之间的转换如下:

    String s1 = " 123 " ;

    StringBuffer s2 = new StringBuffer( s1 ) ;  String转StringBuffer

    String s3 = s2.toString( ) ; StringBuffer转String

    注:String和StringBuffer属于不同类型,也不存在继承关系,无法强转和向上造型!

    StringBuilder

    可变的字符序列,JDK5新增,提供一个与StringBuffer兼容的API,但不保证同步。一般用在单线程条件下使用字符缓冲区,如果允许,建议优先采用该类,不考虑线程安全且其他情况相同下,它比StringBuffer要快10%~15%左右的性能,但应该要提前确定是否运行在单线程下。

    三者使用情况

    操作少量数据,使用String;单线程下操作大量数据,使用StringBuilder;多线程下操作大量数据,使用StringBuffer。

  • 相关阅读:
    request内置对象
    JSP页面、包含
    HTTP协议
    html简介
    数据访问层工具类
    数据运算
    可变于不可变对象分类
    有序 无序 的区别
    字符串方法
    day01_final
  • 原文地址:https://www.cnblogs.com/yuan-zhou/p/10848531.html
Copyright © 2011-2022 走看看