String、StringBuffer以及StringBuilder的各自优缺点及区别

文章目录

    • String类
    • 字符串缓冲区
    • String与StringBuffer的区别
    • 为什么StringBuffer线程安全效率低,而StringBuilder线程不安全效率高

String类

String类代表字符串,字符串是一个常量,值创建后不能改变,底层是一个字符数组
final的出现就是为了为了不想改变,而不想改变的理由有两点:设计(安全)或者效率。
final 修饰的类是不被能继承的,所以 final 修饰的类是不能被篡改的
String值为什么不能改变?
String类值不可变指的是引用地址不能改变,但是引用地址指向的数组是可以改变的,引用地址不能改变的原因是被final修饰,final修饰的变量是不能改变的
String的构造方法:
  1、new String()创建一个空的字符序列,称为空串
  2、 String(byte[] bytes) /String(byte[] bytes, Charset charset)通过字节数组创建字符串对象,第二个参数为指定字符编码
  3、String(char[] value) /String(char[] value, int offset, int count)将字符数组转化为字符串
  4、 String(String original)创建一个字符串 如 new String(“123”);
什么是空串?什么是空值?
空值是指null
空串即""
String类对象创建的细节问题:
1、比较相等问题
2、对象创建问题
String s1=“abc”;
String s2=new String(“abc”);
创建了两个对象,但是两个对象的值相等,如果常量池中存在该字面值,就不会在创建,字面值在常量池中,只有一份,第二个对象的值常量池中字面值的地址
什么是常量池?
顾名思义,常量池值放置常量的地方,jdk1.6时常量池存在方法区中,jdk1.7时常量池放在了堆中,jdk1.8时取消了永久代,替换为元空间
String类的equals方法重写了Object类的equals方法,比较的两个对象的值,值相等就为true

字符串缓冲区

String 字符串 常量池 字符串不可变(操作字符串增加 删除 时会占用大量空间)
字符缓冲区即是一个容器,容器中可以装很多字符串,并且能够对字符串进行各种操作
StringBuffer: 线程安全的可变字符序列。可以改变该对象的值和长度
StringBuilder:线程不安全的可变字符序列,但是执行速度快。用法同StringBuffer
StringBuffer构造方法:
① StringBuffer() 创建初始容量为16个字符的空串字符串缓冲区。
② StringBuffer(String str) 创建存放str值的字符串缓冲工区,初始容量为str的长度加上16个缓冲区
StringBuffer的常用方法:
① capacity() 容量。
② length() 返回字符数,长度。
③ append(Object obj) 追加

String与StringBuffer的区别

String与StringBuffer的细节问题:
① currentTimeMillis() 返回以毫秒值为单位的当前时间。
② StringBuffer与String的区别:
如果是字符串本身的拼接或者增删操作,建议用StringBuffer/StringBuilder来做,速度快。
String重写了equals方法,但是StringBuffer/StringBuilder 没有重写,仍然是Object类的。
③ StringBuffer与StringBuilder的区别:
StringBuffer 称为线程安全的字符可变序列,速度慢
StringBuilder 称为线程不安全的字符可变序列,速度快

为什么StringBuffer线程安全效率低,而StringBuilder线程不安全效率高

StringBuffer与StringBuilder都是继承自同一个抽象类,基本上方法都一样,实现也几乎都是一样的,而导致StringBuffer效率低一些的原因就是StringBuffer的几乎所有方法都加了synchronized。

不论怎样,方法只要加了synchronized同步,效率就是比不加synchronized的低

你可能感兴趣的:(java基础)