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

    String : String 类对象代表不可变的Unicode字符序列,因此我们可以将String对象称为“不可变对象”。 那什么叫做“不可变对象”呢?指的是对象内部的成员变量的值无法再改变。

    我们打开String类的源码,如图:

      

    我们发现字符串内容全部存储到value[]数组中,而变量value是final类型的,也就是常量(即只能被赋值一次)。 这就是“不可变对象”的典型定义方式。对字符串的很多操作,本质都会生成一个新的字符串。比如:substring()是对字符串的截取操作,但本质是读取原字符串内容生成了新的字符串。

    StringBuilder喝StringBuffer非常类似,均代表可变的字符序列。 这两个类都是抽象类AbstractStringBuilder的子类,方法几乎一模一样。我们打开AbstractStringBuilder的源码。如图:

    显然,内部也是一个字符数组,但这个字符数组没有用final修饰,随时可以修改。因此,StringBuilder和StringBuffer称之为“可变字符序列”。那两者有什么区别呢?

          1. StringBuffer JDK1.0版本提供的类,相关的方法都加了同步检查,因此“线程安全,效率低”。 比如,append方法就增加了synchronized同步标记。。

          2. StringBuilder JDK1.5版本提供的类,线程不安全,不做线程同步检查,因此效率较高。 建议采用该类。

     不可变和可变字符序列使用陷阱

      1 String一经初始化后,就不会再改变其内容了。对String字符串的操作实际上是对其副本(原始拷贝)的操作,原来的字符串一点都没有改变。

      2 不管是对String还是对StringBuilder操作 最终多是对他们自身的char[] value 这个数组属性操作,而String的value数组是常量,一经初始化之后就不能再修改,后续在对String的操作,都是新创建一个String对象。而StringBuilder种的value数组不是常量,后续对StringBuilder对象操作,都是对这个value操作,不需要在创建StringBuidler对象,当然在对value扩容的时候,还是要新建value数组对象的。

  • 相关阅读:
    MySQL约束条件
    MySQL基本数据类型
    MySQL基本sql语句,存储引擎,创建表的语法,严格模式
    MySQL环境变量配置及系统服务制作,设置及修改密码,跳过授权表并重置密码,统一编码
    数据库及SQL语句由来,重要概念介绍,MySQL安装,启动服务端及连接,初识SQL语句
    图书管理系统前端页面搭建
    Bootstrap组件2
    c#版工作流之流程发起(3)
    C#版工作流运行机制(1)
    c#版本工作流引擎状态机(2)
  • 原文地址:https://www.cnblogs.com/Tony100/p/11377156.html
Copyright © 2011-2022 走看看