美文网首页zi
Java-0006-String、StringBuffer、St

Java-0006-String、StringBuffer、St

作者: 云转水流 | 来源:发表于2016-07-15 00:58 被阅读27次

    2016.7.14

    String   字符串常量

    String是一个对象不是基本类型

    是不可变对象,一旦创建就不能修改它的值

    对于已存在的String对象操作都是创建一个新的String,并赋值新的值

    String、StringBuffer和StringBuilder都是final类,不能被继承

    而String的各种拼接操作都是通过StringBuffer来完成的

    String s = "Hello";//s引用静态区的字符串字面量

    String s = new String("Hello");//s引用堆上的字符串对象

    创建,拼接

    (+),concat

    索引

    indexOf、lastIndexOf

    以开头/结尾

    startsWith、endWith

    获取指定位置的字符

    charAt()

    获取子字符串

    substring(int,int)

    比较

    equals(String)和compareTo(String)

    匹配

    indexOf(String)和lastIndexOf(String)

    修减两边空白

    trim()

    替换

    replace(String,String)和replaceAll(String,String)

    拆分

    split(String)

    StringBuffer和StringBuilder字符串变量

    //更快,比String快几百至几千倍

    StringBuffer//适用于多个线程操作同一个字符串的场景

    StringBuilder//适用于单线程环境

    //StringBuilder更快

    StringBuffer 

    //线程安全,需同步,可能会需要等待

    是一个可变对象,对它修改是不会创建新的对象

    它只能通过构造函数创建,不能赋值

    创建后内存会分配给它内存空间,并初始保存一个null

    想要赋值是可以用它的append()方法

    内存空间--字符串缓冲区,若溢出Java将自动扩充

    StringBuffer sb = new StringBuffer();

    sb.append("hello");

    也可以构造时传入初始值

    StringBuffer sb = new StringBuffer("hello");

    StringBuffer比String高效的原因,

    String str = new String("hello");

    str+="hi";

    的操作步骤实际上是创建一个StringBuffer,然后调用append方法,再调用toString方法赋值给str

    String比StringBuffer多了很多附加步骤,所以很慢

    StringBuilder

    //线程不安全,不需同步,不需要等待,会比StringBuffer更快

    StringBuilder与StringBuffer相似

    该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。

    //在指定位置插入字符串

    insert(int ,String)

    //删除指定位置字符串

    delete(int ,int)

    //倒转

    reverse()

    一个完整的Unicode字符叫代码点CodePoint,而一个Java char叫代码单元code unit。如果String 对象以UTF-16保存 Unicode 字符,需要用2个字符表示一个超大字符集的汉字,这这种表示方式称之为 Surrogate,第一个字符叫Surrogate High,第二个就是Surrogate Low。

    代码点(Code Point)就是指Unicode中为字符分配的编号,一个字符只占一个代码点,例如我们说到字符“汉”,它的代码点是U+6C49.代码单元(Code Unit)则是针对编码方法而言,它指的是编码方法中对一个字符编码以后所占的最小存储单元。 例如UTF-8中,代码单元是一个字节,因为一个字符可以被编码为1个,2个或者3个4个字节;在UTF-16中,代码单元变成了两个字节(就是一个 char),因为一个字符可以被编码为1个或2个char(你找不到比一个char还小的UTF-16编码的字符,嘿嘿)。说得再罗嗦一点,一个字符,仅仅对应一个代码点,但却可能有多个代码单元(即可能被编码为2个char)。

    //上面这段是copy来的,还不是很理解

    //追加

    append(String)

    System.currentTimeMilis//当前时间

    字符串操作注意

    toCharArray()

    可以将一个字符串返回成一个字符数组,配合for循环可以很好的操作字符

    replace(String,String)、replaceFirst(String,String)、replaceAll(String,String)

    则3个可以用来替换字符串,其中replaceFirst(String,String)、replaceAll(String,String)第一个参数的String并不是一般的字符串,它需要转义来通过正则表达式

    例如你想匹配一个"+",你就需要输入"+"的转义字符"\+",但"\"也是需要转义的,就变成了"\\+"

    split(String)

    拆分函数的参数也需要转义

    另外拆分完的数组也很有趣,例如String[ ] arr = str.split(word);

    当str和word字符串内容相同时,arr.length为0

    当str比word长,并且str以word结尾时,arr.length为1

    但当str比word长,并且str以word开头时,arr.length为2


    相关文章

      网友评论

        本文标题:Java-0006-String、StringBuffer、St

        本文链接:https://www.haomeiwen.com/subject/uacyjttx.html