• (1)请你说明String 和StringBuffer,StringBuilder的区别


    (1):String 是对象不是原始类型,是不可变对象,一旦创建,就不能修改它的值,对于已经存在的String对象的修改都是重新创建一个String对象,把新的值保存进去;String是final类,不能被继承。

    这里补充下原始类型:char,boolean,byte,short,int,long,float,double对应其包装类型:首字母大写:Character,Boolean,Byte,Short,Integer,Long,Float,Double

    (2):StringBuffer 是可以修改的对象,修改它的时候不会像创建String对象一样重新创建赋值,它只能通过构造函数创建,在创建后会在内存中分配空间,初始化会保存一个null,当向StringBuffer赋值的时候可以通过它的append方法。它的本质是一个线程安全的可修改的字符序列,把所有修改数据的方法都加上synchronized。但是保证了线程安全是需要性能的代价。

    (3):在操作字符串连接中StringBufer效率要比String要高:

    String str = new String("hello,word");

    str + = "xiaoming";

    上面的处理其实是先通过建立一个StringBuffer 通过append方法,最后 .toString(); 通过对比知道String的连接操作比StringBuffer多了一些操作,效率会大打折扣。

    (4):String对象的创建修改过程每次都会创建新的对象,这样之前的对象就会被垃圾回收,影响性能。

    -------------

    (5):StringBuilder JDK1.5发布的,与StringBuffer本质上没有区别,就是去掉了保证线程安全那部分,减少了开销。

    (6):StringBuffer与StringBuilder都继承了AbstractStringBuilder,底层都是利用可修改的char数组(JDK9后是byte数组)。

    (7):如果有大量字符串需要拼接,如果能预知大小,最好在new StringBuffer,StringBuilder的时候设置capacity,避免多次扩容,扩容要抛弃原有数组拷贝创建新的数组。

    总结:少量操作字符串使用String就够了,如果在程序中需要对字符串频繁修改连接操作,String在操作字符串的时候new了很多次StringBuffer,建议使用StringBuffer,这样性能更高,很多情况下我们操作字符串不需要线程安全,可以用StringBuilder,减小开销。

  • 相关阅读:
    linux一行执行多条命令 shell
    创建右键nushell打开UTF8(似乎需要win10 1803版本以上,admin的不需要)
    uniapp零碎总结
    nginx https配置问题
    ElasticSearch随记
    ElasticSearch修改index增加字段
    分区表创建和查询
    netfinal
    Mysql 命令操作
    【2022.06.23】python连接数据库
  • 原文地址:https://www.cnblogs.com/baimh/p/11185313.html
Copyright © 2020-2023  润新知