zoukankan      html  css  js  c++  java
  • java String,StringBuilder和StringBuffer类的区别

    对String而言:

    String是只读字符串,所引用的字符串不能被改变,一经定义,无法再增删改。

    String 定义的字符串保存在常量池里面,进行+操作时不能直接在原有基础上拼接。

    每次+操作 : 隐式在堆上new了一个跟原字符串相同的StringBuilder对象,再调用append方法 拼接+后面的字符。

    例如: 

    String str1="ss";                          StringBuilder str2=new StringBuilder(ss);
    str1=str1+"oo";     等于                    str2.append(oo);

    (Java6和6之前,常量池是存放在方法区中的。

    Java7,将常量池是存放到了堆中,常量池就相当于是在永久代中,所以永久代存放在堆中。

    Java8之后,取消了整个永久代区域,取而代之的是元空间。没有再对常量池进行调整。)

    区别

    String是只读字符串,所引用的字符串不能被改变,Stringbuffer和Stringbuilder定义的可以通过各种方法来达到简单的增删改;

    String和Stringbuilder在单线程环境下使用;

    StringBuffer在多线程环境下使用,可以保证线程同步;

    Stringbuilder 和StringBuffer 实现方法类似,均表示可变字符序列,不过StringBuffer 用synchronized关键字修饰(保证线程同步)

    运行速度

    当需要对某一字符串大量重复+操作时:

    Stringbuilder 最快,不需要考虑线程同步;

    StringBuffer次之;

    String最慢,因为每次都要重新开辟内存,产生很多匿名对象,影响系统性能。

  • 相关阅读:
    Swagger注解及参数细节的正确书写。
    TCP连接为什么三次握手四次挥手
    OpenMeetings安装
    [LeetCode]Best Time to Buy and Sell Stock III
    [LeetCode]Best Time to Buy and Sell Stock
    [LeetCode]Best Time to Buy and Sell Stock II
    [LeetCode]Delete Node in a Linked List
    [LeetCode]Lowest Common Ancestor of a Binary Search Tree
    [LeetCode]Invert Binary Tree
    [LeetCode]Same Tree
  • 原文地址:https://www.cnblogs.com/jiezai/p/10705018.html
Copyright © 2011-2022 走看看