String,StringBuffer,StringBuilder
String字符串常量
StringBuffer字符串常量(线程安全)
StringBuilder字符串常量(非线程安全,使用场景单线程)
底层都实现了CharSequence类,但处理机制不同
- String是不可改变的量,也就是创建之后就不可修改了
- StringBuffer是一个可变字符串序列,与Stirng一样,在内存中都是保存在一个有序的字符串序列(Char数组),不同的是StringBuffer的值都是可变的
- StringBuilder与StringBuffer一样都是可变字符串序列,不同的是StringBuilder是线程不安全的,StringBuffer是线程安全的
使用场景
String:在字符串不经常变化的场景使用,如常量的定义,少量变量的运算
StringBuffer:在频繁的进行变量运算(如拼接,替换,删除)使用,并且运行在多线程环境,如xml解析,http参数解析和封装
StringBuilder:在频繁的进行变量运算(如拼接,替换,删除)使用,并且运行在单线程环境,如sql拼接,json封装等
有些特定场景下String要比StringBuffer快
String str = "This "+"is "+ "a "+"test";
StringBuffer strBuffer = new StringBuffer("This").append("is").append("a").append("test");
这样的情况下Stirng生成对象要比StringBuffer快的多
eqaul和==区别
==比较两个对象的时候,检查的是两个对象的内存地址是否相同
equal默认和==一样,比较的是地址,但是eqaul被重载之后,比较的就是对象的value,String类就重写了这个方法
String特例:
String s1 = "abd";
String s2 = "abd";
System.out.print(s1==s2) -> true
这是因为Stirng在创建表达式(非new方式)的时候,会先在Stirng缓冲池中寻找相同值的对象
s1先被放在缓冲池,再创建s2的时候程序找到了相同值的s1,直接引用