String、StringBuffer、StringBulider之间的联系和区别

首先,我们大概总体的解释一下这三者的区别和联系

String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间。

StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。

StringBuilder和StringBuffer类功能基本相似,唯一的区别就是StringBuilder不是线程安全的。

下面具体看看:

1. String 类  String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间。  String s = "a"; //假设s指向地址0x0001  s = "b";//重新赋值后s指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是s所指向的,s已经指向了其它地址。  因此String的操作都是改变赋值地址而不是改变值操作。 

2. StringBuffer 类

StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。

每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。  StringBuffer buf=new StringBuffer(); //分配长16字节的字符缓冲区  StringBuffer buf=new StringBuffer(512); //分配长512字节的字符缓冲区  StringBuffer buf=new StringBuffer("this is a test")//在缓冲区中存放了字符串,并在后面预留了16字节的空缓冲区。

3.StringBuilder  StringBuffer和StringBuilder类功能基本相似,主要区别在于StringBuffer类的方法是多线程、安全的,而StringBuilder不是线程安全的,相比而言,StringBuilder类会略微快一点。毕竟StringBuilder不是线程安全,小号的资源也没有那么大。对于经常要改变值的字符串应该使用StringBuilder类。

4.线程安全  StringBuffer 线程安全  StringBuilder 线程不安全  5.速度   一般情况下,速度从快到慢:StringBuilder > StringBuffer > String,这种比较是相对的,不是绝对的。 

6.总结  (1).如果要操作少量的数据或者是可以用final修饰的字符串用 = String  (2).单线程操作字符串缓冲区 下操作大量数据 = StringBuilder  (3).多线程操作字符串缓冲区 下操作大量数据 = StringBuffer 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据

Zzreal的大数据笔记-ScalaDay02

昨天整理了一下Scala的一些基本内容,不是很全面,不过作为学习Spark的基础足够了, 如果需要系统的学习Scala,建议还是去菜鸟教程一步步的看下来会比较条...

19310
来自专栏加米谷大数据

Scala语言:既存类型

Scala既存类型语法: ? 既存类型具有 T forSome {Q}的形式,Q 是一个类型声明的序列。设t1[tps1]>:L1<:U1,...,tn[tps...

3706
来自专栏前端进阶之路

JavaScript数据结构02 - 栈

通过前面一节《JavaScript数据结构01 - 数组》我们知道,可以在数组的任意位置上删除或添加元素。然而,有时候我们还需要一种在添加或删除元素时有更多控制...

972
来自专栏令仔很忙

新手学JAVA(二)----String类与StringBuffer类的区别

在Java中有两种字符串的操作:String类和StringBuffer类(缓冲字符串处理类)。 下面先简单的说一下两者的区别。 String类和St...

1222
来自专栏java达人

设计模式之代理模式(二)CGLIB动态代理实现

像上一篇所说的代理模式其实是静态代理,在实际开发中其实应用不大,因为他需要事先知道被代理对象是谁,而且被代理对象和代理对象实现了公共的接口。实际情况往往并不能满...

19910
来自专栏程序员互动联盟

【专业技术】C++虚函数的缺省参数

编者按:缺省参数,缺省函数,缺省构造函数,如果你有些迷糊,本文可以让你把它看个清楚。呵呵。 前些日子,有个同学问我一个关于虚函数的缺省参数问题。他是从某个论坛上...

2926
来自专栏林冠宏的技术文章

Deque的部分成员函数 解析,关于这个类,百度有很多解析,唯独没有其函数介绍

函数 描述 c.assign(beg,end) c.assign(n,elem) 将[beg; end)区间中的数据赋值给c。 ...

1908
来自专栏WD学习记录

Python数据结构与算法笔记(2)

栈、队列、deques、列表是一类数据的容器,它们数据项之间的顺序由添加或删除的顺序决定。一旦一个数据项被添加,它相对于前后元素一直保持该位置不变。诸如此类的数...

1051
来自专栏LanceToBigData

Java常用类(三)之StringBuffer与StringBuidler

前言   前面一篇给大家介绍了String类,这个我们经常会用到的一个类,那这一篇给大家分享的是StringBuffer与StringBuidler。等下我也会...

2295
来自专栏积累沉淀

多线程带来的数据不一致

解决:两种方法 1同步快 import java.util.Random; public class Test13 { /** * ...

1875

扫码关注云+社区

领取腾讯云代金券