一、String 和 StringBuffer,StringBuilder
相同点:String,StringBuffer,StringBuilder都是可以用来存储字符串的
不同点:1、String存储的字符串是不可变的,StringBuffer、StringBuilder存储的字符串是可变的。
其中在String中增加字符串时,有两种方法:用 “+” 拼接和concat()添加【注意:这里拼接后的字符串是重新的一个字符串。这个字符串如果在常连池存在就直接指向,如果不在就是创建之后放入常连池,再指向,而并不是在原来的基础上拼接】
String str = "hello";
str = str.concat(" world");//hello world
str = str+" java";//hello world java
而StringBuffer和StringBuilder则使用append()方法,直接在后面添加,而并非重新重建一个对象【StringBuffer和StringBuilder共用一套API接口(API可理解为一套不需要了解源码和内部具体实现的方法(函数)集合,包括源码、字节码和帮助文档)】
StringBuffer sb = new StringBuffer();
sb.append("hello");//hello
sb.append(" world");//hello world
2、一般StringBuffer和StringBuilder添加字符串的速度比String添加的快【因为String是重新创建一个字符串,在重新指向;而StringBuffer和StringBuilder是直接在后面拼接】;
String str="hello";
String str1 ="world";
String str2 = str + str1;//hello world
StringBuffer sb = new StringBuffer();
sb.append(str);
sb.append(str1);//hello world
但是,你是不是觉得String就是比他两个慢呢,oh,no!下面这种方式就是String较快了,其实这是java虚拟机(JVM)的一种给你的一种“视觉混扰”,其实在JVM底层在你这样添加时他是当做String str = "hello world"来处理的;因此这种情况String添加速度较快
String str="hello"+"world";
StringBuffer sb = new StringBuffer("hello");
String str = " world";
sb.append(str);
二、StringBuffer 和 StringBuilder
相同点:共用一套API,StringBuilder是在StringBuffer的基础上产生的;
不同点:1.StringBuffer线程安全,StringBuilder线程不安全;
2.StringBuilder速率比StringBuffer速率快;(有点在某些方面有时候就是缺点,StringBuffer慢的原因就是有锁安全,因此就慢,想象一下自己在排队过安检的时候)
三、扩展,包装类、String类、线程,DataSource(数据源)都有一个叫做“池”的概念
1. 包装类和String类叫做常量池【常量池JDK1.6之前是存在于jvm方法区内存,1.7是jvm堆内存,1.8之后是jvm的元空间】
2.线程的叫做线程池
3.常用的DataSource—Druid【connectionPool连接池,底层用jdbc和线程池技术实现】(国产阿里的)、C3P0和dbcp(国外)
不管是叫常量池或者常量池最大的作用就是代码复用,使用的时候提高执行效率