String、StringBuilder和StringBuffer

QuibblerQuibbler 2019-12-25 约 3 分钟 1980 次阅读

String、StringBuilder和StringBuffer

1、String

String内容是不可变的字符,String底层使用了一个不可变的字符数组(final char[])

private final char value[];

String进行拼接 :

//在此创建了三个对象
    String str = "a"+"b";

String 定义的字符串保存在常量池里面,进行+操作时不能直接在原有基础上拼接。每次+操作 : 隐式在堆上new了一个跟原字符串相同的StringBuilder对象,再调用append方法 拼接+后面的字符。


        Java6和6之前,常量池是存放在方法区中的。

        Java7,将常量池是存放到了堆中,常量池就相当于是在永久代中,所以永久代存放在堆中。

        Java8之后,取消了整个永久代区域,取而代之的是元空间。没有再对常量池进行调整。

2、StringBuilder

StringBuilder底层是可变的字符数组。是线程不安全,效率高。

StringBuilder进行高效的字符串拼接:

StringBuilder sb = new StringBuilder();
    //仍然还是原来的对象,不会创建新的StringBuilder对象
    sb.append("a").append("b");

3、StringBuffer

StringBuffer底层是可变的字符数组。是线程安全的,效率低。

与StringBuilder相比,内部的大量方法都加了synchronized关键字加锁同步。

4、比较

速度:

StringBuilder > StringBuffer > String

String最慢,因为每次都要重新开辟内存,产生很多匿名对象,影响系统性能。


使用:

(1)单线程下如果要操作少量的数据用 String

(2)单线程操作字符串缓冲区下操作大量数据 StringBuilder

(3)多线程操作字符串缓冲区下操作大量数据 StringBuffer

相关推荐

获取系统SDK版本、判断手机ROM
精选Code

获取系统SDK版本、判断手机ROM

Build获取系统SDK版本Android中部分API的使用,需要在特定的SDK版本之后才能使用,因此在兼容老版本SDK的时候,经常需要判断API的版本。各种Android版本的对应关系参考《Android各版本对应的SDK版本》判断手机ROM有时候需要判断手机系统的ROM,检测ROM是MIUI、EMUI还是Flyme,可以使用getprop命令,去系统build.prop文件(关于build.p

4.3k
AndroidStudio中各种中文乱码问题
精选Code

AndroidStudio中各种中文乱码问题

AndroidStudio中各种中文乱码问题1、编译Java错误信息乱码在出现这个Annotation processors must be explicitly declared now...问题的时候,正好也发现AndroidStudio Build Output错误信息都乱码。经常遇到各种问题,习惯了,现在遇到的问题,都是以后的答案。 1.1、修改项目build.gradle(无效)在整个p

2.8k
Function Calling 详解:让大模型调用你的函数
精选Code

Function Calling 详解:让大模型调用你的函数

问大模型“北京今天多少度”,它只能用训练数据里的旧知识猜,或者老实承认不知道。但如果告诉它“我这里有个查天气的接口”,它会说:“帮我调用 get_weather,城市参数填北京。”你的程序执行调用,把结果递回去,它再组织成一句自然的回答。Function Calling(函数调用)让模型从“只会聊天”进化为“会办事”——它是大模型连接外部世界的第一块基石,也是一切 Agent 系统的地基。本文按“…

109