美文网首页
【JAVA】Char、String、StringBuffer、S

【JAVA】Char、String、StringBuffer、S

作者: 温柔的谢世杰 | 来源:发表于2019-07-27 11:06 被阅读0次

    String 和 Char

    1.String不是Java定义的一种基本数据类型。
    基本数据类型包括:byte,short,int,long,float,double,char,boolean

    2.c语言中String是以“\0”结尾的char类型的数组char[]
    java中,String 内部是用 char [] 数组实现的,不过结尾不用 \0。

    3.使用equals()方法比较两个String是否内容一样(即字符串中的各个字符是否都一样)。

    4.char 存储的 unicode 码,不仅可以存储 ascII 码,汉字也可以。


    String、StringBuffer、StringBuilder

    这三个类的主要区别在两个方面:运算速度(运算性能或执行效率)和线程安全性。

    1、运算速度比较(通常情况下):StringBuilder > StringBuffer > String

    String 是 final 类不能被继承且为字符串常量,而 StringBuilder 和 StringBuffer 均为字符串变量。String 对象一旦创建便不可更改,而后两者是可更改的,它们只能通过构造函数来建立对象,且对象被建立以后将在内存中分配内存空间,并初始保存一个 null,通过 append 方法向 StringBuffer 和 StringBuilder 中赋值。

    请看如下示例代码:

    String str = "abc";
    System.out.println(str);
    str = str + "de";
    System.out.println(str);
    

    上述代码先创建一个 String 对象 str,并赋值 abc 给 str,然后运行到第三行,JVM 会再创建一个新的 str 对象,并将原有 str 的值和 de 加起来再赋值给新的 str。而第一个创建的 str 对象被 JVM 的垃圾回收机制(GC)回收掉。所以 str 实际上并没有被更改,因为第二个str和第一个str是两个对象,而不是一个。即 String 对象一旦创建就不可更改。所以 Java 中对 String 对象进行的操作实际上是一个不断创建并回收对象的过程,因此在运行速度上很慢。

    而 StringBuilder 和 StringBuffer 的对象是变量,对变量的操作是直接对该对象就行更改,因此不会进行反复的创建和回收。所以在运行速度上比较快。

    
    String str = "abc" + "de";
    StringBuilder stringBuilder = new StringBuilder().append("abc").append("de");
    System.out.println(str);
    System.out.println(stringBuilder.toString());
    
    

    上述代码中 String 的操作速度反而要比 StringBuilder 快,这是因为在 JVM 眼里,第 1 行的代码操作和下列代码是完全一样的,所以很快。

    String str = "abcde";
    

    但如下的代码写法形式速度会很慢,JVM 会不断地创建和回收对象来进行操作。

    String str1 = "abc";
    String str2 = "de";
    String str = str1 + str2;
    

    2、 线程安全性

    StringBuffer(线程安全的)

    StringBuffer 中大部分方法由 synchronized 关键字修饰,在必要时可对方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致,所以是线程安全的。类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。

    StringBuilder(非线程安全)

    而 StringBuilder 的方法没有该关键字修饰,所以不能保证线程安全性。是 JDK1.5 新增的,该类提供一个与 StringBuffer 兼容的 API,但不能保证同步,所以在性能上较高。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。

    3、 总结

    String:适用于少量的字符串操作。

    StringBuilder:适用于单线程下在字符串缓冲区进行大量操作。

    StringBuffer:适用于多线程下在字符串缓冲区进行大量操作。

    相关文章

      网友评论

          本文标题:【JAVA】Char、String、StringBuffer、S

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