一、String
*1、String类型的值,会在方法去内存中存放,没有新的String类型的值,都会在方法区内存存放一份。
*2、String值是不可更改的,如果要更改String类型的值,实际上不是修改,而是创建一个信息的String类型的值。
*3、如果是new String()值,则会在方法区的字符串常量池+堆内存中都会有存放此String类型的值。
二、StringBuffer
* 1、StringBuffer是可变长度的,自动扩容。因为StringBuffer也是通过数组表示,所以其扩容其实还是创建新的数据,将原数组内容拷贝到新数组
* 2、StringBuffer无参数构造方法,会调用super(16)所以,调用无参数构造方法时,默认创建空间的长度16个字符
* 3、通过送具体的长度参数,这样就可以创建任意长度的字符空间
* 4、对于String类型,频繁的拼接,会在字符串常量池创建大量的字符串,所以会占用大量空间。所以对于需要频繁拼接字符串时,建议通过StringBuffer来实现
不要通过String来拼接
* 5、StringBuffer与String没有继承关系,所以这两个引用数据类型不能直接转换,或者强制转换
* 6、StringBuffer有重写toString方法,否则就会返回内存地址
public class Test01 { public static void main(String[] args) { //StringBuffer与String类没有继承关系,所以不能直接转换/强制类型转换 //StringBuffer a = "abc"; //StringBuffer正确的创建方式 StringBuffer b = new StringBuffer("abc"); System.out.println(b); //abc , StringBuffer有重写toString方法 //String在字符串常量池中一段创建,不得修改 String s1 = "abc"; String s2 = s1.replace("a", "x"); System.out.println(s1 == s2); //false(是两个地址) //StringBuffer的长度可变,在字符创常量池中创建后可以修改 StringBuffer sb1 = new StringBuffer("abc"); StringBuffer sb2 = sb1.append("123"); System.out.println(sb1 == sb2); //true(是一个地址) //、大量字符串进行拼接时,尽量避免使用String,建议StringBuffer、StringBuilder //比如我们要查询的表1:user, 条件 where userid=1 String table1 = "user"; StringBuffer sqlSelect = new StringBuffer(100); sqlSelect = sqlSelect.append("select * from ").append(table1).append(" where userid =1"); System.out.println(sqlSelect); //select * from user where userid =1 } }
StringBuffer常用方法
参考一下被人的文章吧
https://www.cnblogs.com/haitiansBlog/p/4889532.html
三、StringBuilder
..后续完善