【Java学习记录】十九 String类

    xiaoxiao2022-07-14  176

    String类

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

     我们发现字符串内容全部存储到value[]数组中,而变量value是final类型的,也就是常量(即只能被赋值一次)。 这就是“不可变对象”的典型定义方式。 查看JDK的文档就会发现,String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含的字符串内容。而最初的String对象丝毫未动。 

    例如:

    String s = "Google"; System.out.println("s = " + s); s = "Runoob"; System.out.println("s = " + s);

    输出结果为:

    s = Google

    s = Runoob

    奇怪的是,从结果上看是改变了,不是说好的String对象是不可变的嘛,怎么就改变了呢?

    原因在于实例中的 s 只是一个 String 对象的引用,并不是对象本身,当执行 s = "Runoob"; 创建了一个新的对象 "Runoob",而原来的 "Google" 还存在于内存中。

    String直接赋值与使用new String的区别

    String类中常用方法

    StringBuffer 和 StringBuilder

    当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

    打开AbstractStringBuilder的源码:

    abstract class AbstractStringBuilder implements Appendable, CharSequence { /** * The value is used for character storage. */ char value[]; //以下代码省略 }

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

    1. StringBuffer JDK1.0版本提供的类,线程安全,做线程同步检查, 效率较低。

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

    由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。 

    常用方法列表:

    序号方法描述1public StringBuffer reverse()  将此字符序列用其反转形式取代。2public StringBuffer append(String s) 将指定的字符串追加到此字符序列。3public insert(int offset, int i) 将 int 参数的字符串表示形式插入此序列中。4replace(int start, int end, String str) 使用给定 String 中的字符替换此序列的子字符串中的字符。5public delete(int start, int end) 移除此序列的子字符串中的字符。 public class TestStringBufferAndBuilder 1{ public static void main(String[] args) { /**StringBuilder*/ StringBuilder sb = new StringBuilder(); for (int i = 0; i < 7; i++) { sb.append((char) ('a' + i));//追加单个字符 } System.out.println(sb.toString());//转换成String输出 sb.append(", I can sing my abc!");//追加字符串 System.out.println(sb.toString()); } }

    最新回复(0)