String、StringBuffer、StringBuilder
我宁愿写bug⚠️,也不愿什么都不做 ❗️
💚哈喽!大家好!💚
❤️我是 一看就会,一写就废 的 浩浩🔍❤️
💙让我带你编程带你飞,带你飞进垃圾堆!💙
💜 如果对你有所帮助,请给我点个赞👍!💜
键盘敲烂💥,工资过万💰
文章目录
💛1. String
💙2. StringBuffer
💜3. StringBuilder
❤️4. String、StringBuffer、StringBuilder 区别
1. String |
- String是被final修饰的类,不能被继承。
- String底层是通过char类型的数据实现的。
- String类,因为它被final修饰,所以是不可变的类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可变的,直到这个对象被销毁。
看到这里有的同学就要问了
String s = "abc";s = "def";System.out.println(s);/*def*/
这不明明就是修改了吗?怎么还说它不可变呢?
我们从底层去分析,我们每次对String的赋值都是改变它的堆内存的地址指向。也就是说,我们每次对String的赋值都会创建新的String对象,占用新的堆内存空间。
当我们经常性的对字符串操作就会极大浪费内存空间,为了避免对内存空间的浪费,我们就可以使用StringBuffer类、和StringBuilder类
2. StringBuffer |
- StringBuffer类,称为字符串缓冲区;所表示的也是一个字符序列;这个类型必须用new创建对象,和String相反,它是可变的类;
- StringBuffer对象则代表一个字符序列可以改变的字符串,当StringBuffer被创建以后,通过StringBuilder提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串的字符序列。
StringBuffer s = new StringBuffer("abc");s.append("def");System.out.println(s);/*abcdef*/
我们再分析以上代码的底层逻辑
我们可以看到,StringBuffer对象是一个字符串序列可变的字符串,它没有重新生成一个对象,而是在原来的基础上对字符串进行修改。
3. StringBuilder |
-
StringBuilder类,与StringBuffer兼容,使用方法基本类似,但是不保证线程安全。
4. String、StringBuffer、StringBuilder 区别 |
-
String类是不可变的,对象一旦被创建,就不能被修改;可以使用 = 直接赋值,此时使用常量池;也可以使用new创建,不使用常量池;
-
StringBuffer是可变的,对象创建后,可以修改;必须使用new关键字,是线程安全的;
-
StringBuilder是不保证线程安全的,在单线程情况下使用比StringBuffer高效;必须使用new关键字