zoukankan      html  css  js  c++  java
  • [面试经] Java

    String - Java语言中非常基础和重要的类,提供了构造和管理字符串的各种基本逻辑。它是典型的Immutable类,被声明成为final class,所有属性也都是final的。也由于它的不可变性,类似拼接、剪裁字符串等操作,都会产生新的String对象。由于字符串操作的普遍性,所以有关操作的效率往往对应用性能有明显影响。

      String是Immutable类的典型实现,原生的保证了基础线程安全,因为你无法对它内部数据进行任何修改,这种便利甚至体现在拷贝构造函数中,由于不可变,Immutable对象在拷贝时不需要额外复制数据。

    StringBuffer - 是为解决上面提到拼接产生太多中间对象的问题而提供的一个类,我们可以用append或者add的方法,把字符串添加到已有序列的末尾或者指定位置。StringBuffer本质是一个线程安全的可修改字符序列,它保证了线程安全,也随之带来了额外的性能开销,所以除非有线程安全的需要,不然还是推荐使用它的后继者 - StringBuilder。

      StringBuffer的线程安全是通过把各种修改数据的方法都加上synchronized关键字实现的,非常直白。

    StringBuilder - 是Java1.5中新增的,在能力上面和StringBuilder没有本质区别,但是它去掉了线程安全的部分,有效减小了开销,是绝大部分情况下进行字符串拼接的首选。

    应用场景

    【A】在字符串内容不经常发生变化的业务场景优先使用String,例如:常量声明、少量的字符串拼接操作等。如果有大量的字符串内容拼接,避免使用String与String之间的“+”操作,因为这样会产生大量无用的中间对象,耗费空间且执行效率低下(新建对象、回收对象花费大量时间)。

    【B】在频繁进行字符串的运算(如拼接、替换、删除等),并且运行在多线程环境下,建议使用StringBuffer,例如XML解析、HTTP参数解析与封装。

    【C】在频繁进行字符串的运算,并且运行在但线程环境中,建议使用StringBuilder,例如SQL语句拼装、JSON封装等。

  • 相关阅读:
    条款33:避免遮掩继承而来的名称
    LeetCode OJ:Combinations (排列组合)
    LeetCode OJ:Delete Node in a Linked List(链表节点删除)
    LeetCode OJ:Contains Duplicate III(是否包含重复)
    LeetCode OJ:Contains DuplicateII(是否包含重复II)
    luogu 1004 方格取数
    平衡树之伸展树(Splay Tree)题目整理
    P2472 [SCOI2007]蜥蜴(网络最大流)
    P1349 广义斐波那契数列(矩阵加速)
    P4113 [HEOI2012]采花 (莫队TLE)
  • 原文地址:https://www.cnblogs.com/tingtwang/p/11132655.html
Copyright © 2011-2022 走看看