图析:String,StringBuffer与StringBuilder的区别

图析:String,StringBuffer与StringBuilder的区别一、JavaString类——String字符串常量字符串广泛应用在Java编程中,在Java中字符串属于对象,Java提供了String类来创建和操作字符串。需要注意的是,String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。我们来看一下这张对String操作时内存变化的图:我们可…

大家好,又见面了,我是你们的朋友全栈君。

一、Java String 类——String字符串常量

字符串广泛应用 在Java 编程中,在 Java 中字符串属于,Java 提供了 String 类来创建操作字符串

需要注意的是,String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。我们来看一下这张对String操作时内存变化的图:

图析:String,StringBuffer与StringBuilder的区别

我们可以看到,初始String值为“hello”,然后在这个字符串后面加上新的字符串“world”,这个过程是需要重新在栈堆内存中开辟内存空间的,最终得到了“hello world”字符串也相应的需要开辟内存空间,这样短短的两个字符串,却需要开辟三次内存空间,不得不说这是对内存空间的极大浪费。为了应对经常性的字符串相关的操作,就需要使用Java提供的其他两个操作字符串的类——StringBuffer类和StringBuild类来对此种变化字符串进行处理。

二、StringBuffer 和 StringBuilder 类——StringBuffer、StringBuilder字符串变量

图析:String,StringBuffer与StringBuilder的区别

对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。

和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。

三者的继承结构

图析:String,StringBuffer与StringBuilder的区别

三者的区别

1字符修改上的区别(主要)

String:不可变字符串;

StringBuffer:可变字符串、效率低、线程安全;

StringBuilder:可变字符序列、效率高、线程不安全;

2初始化上的区别,String可以空赋值,后者不行,报错

①String

StringBuffer s = null;   

StringBuffer s = “abc”;   

②StringBuffer

StringBuffer s = null; //结果警告:Null pointer access: The variable result can only be null at this location

StringBuffer s = new StringBuffer();//StringBuffer对象是一个空的对象

StringBuffer s = new StringBuffer(“abc”);//创建带有内容的StringBuffer对象,对象的内容就是字符串”

小结:(1)如果要操作少量的数据用 String;

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

3)单线程操作字符串缓冲区下操作大量数据 StringBuilder(推荐使用)。

三、StringBuilder类在Android中运用示例

(1)上官方文档,StringBuilder,A mutable sequence of characters. This class provides an API compatible with StringBuffer, but with no guarantee of synchronization. This class is designed for use as a drop-in replacement for StringBuffer in places where the string buffer was being used by a single thread (as is generally the case). Where possible, it is recommended that this class be used in preference to StringBuffer as it will be faster under most implementations.

The principal operations on a StringBuilder are the append and insert methods, which are overloaded so as to accept data of any type. Each effectively converts a given datum to a string and then appends or inserts the characters of that string to the string builder. The append method always adds these characters at the end of the builder; the insert method adds the characters at a specified point.

参考网址:https://developer.android.google.cn/reference/java/lang/StringBuilder.html

由上面的官方文档,我们知道以下几点:

一个可变的字符序列。StringBuilder类提供一个与StringBuffer兼容的API,但不保证同步。该类被设计用作StringBuffer的一个简单替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现种,它比StringBuffer要快

在StringBuilder上的主要操作时append和insert方法,可重载这些方法,以接收任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串生成器中,append方法始终将这些字符添加到生成器的末端,而insert方法则在指定的点添加字符。

例如,如果z引用一个当前内容为“start”的字符串的生成器对象,则该方法调用z.append(“le”)将使字符串生成器包含“startle”,而z.insert(4,”le”)将更改字符串生成器,使之包含“startlet”。

通常,如果sb引用StringBuilder的实例,则sb.append(x)和sb.insert(sb.length(),x)具有相同的效果。每个字符串生成器都有一定的容量,只要字符串生成器包含的字符序列的长度没有超出此容量,就无需分配新的内容缓冲区。如果内容缓冲区溢出,则此容量自动增大。

将StringBuilder的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用StringBuffer。

(2)上代码,具体实现

new Thread(new Runnable){
    @Override
        public void run(){
        HttpURLConnection connection = null;
        BufferedReader reader = null;
        try{
                URL url = new URL("http://www.baidu.com");
                connection = (HttpURLConnection)url.openConnection();
                connnection.setRequestMethod("GET");
                InputStream in = connection.getInputStream();
                //下面对获取到的输入流进行读取
                reader= new BufferedReader(new InputStreamReader(in));
                StringBuilder response = new(StringBuilder());
                String line;
                While ((line =reader.readLine())!= null ){
                    response.appen    d(line));
                }
            showResponse(reponse.toString())
        }
    }......

}

 

上段代码模拟的是向百度网请求数据,然后对网站返回的数据流进行读取,最终应用StringBuilder()进行字符串数据的读取和显示。

 

 总结:末尾总是有福利,三者区别可参照下表:

String StringBuffer StringBuilder
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间 StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量 可变类,速度更快
不可变 可变 可变
  线程安全 线程不安全
  多线程操作字符串 单线程操作字符串

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153418.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • UI自动化控制微信发送文件【解决了一个无人回答的难题,Pywin32设置文件到剪切板】「建议收藏」

    UI自动化控制微信发送文件【解决了一个无人回答的难题,Pywin32设置文件到剪切板】「建议收藏」大家好,我是小小明。前面我在《UI自动化控制PC版微信》该系列文中更新了控制微信发送图片的方法。链接:https://blog.csdn.net/as604049322/category_11396772.html根据部分群友实际工作的需要,本文将分享如何控制微信发送文件。按照前面的思路,我们发送文本和图片,都是采用复制粘贴操作剪切板的方式,而uiautomation框架本身也提供了复制文本或图片的方法。但是如果需要复制文件到剪切板,uiautomation并没有提供相应的api。翻遍了全网的资

    2022年7月11日
    22
  • 简单理解call_user_func和call_user_func_array两个函数

    简单理解call_user_func和call_user_func_array两个函数

    2021年10月26日
    43
  • java web servlet基础(PS教程)

    JavaWeb——ServletTomcat工作机制动画演示(点击动图可全屏观看)什么是ServletServlet(ServerApplet),全称JavaServlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web…

    2022年4月10日
    33
  • Arcgis api for JavaScript下载及部署(IIS和Tomcat)

    Arcgis api for JavaScript下载及部署(IIS和Tomcat)目录一,各版本下载地址二,ArcGISAPIForJavaScript3.17本地部署(IIS)2.1修改相应的js文件(2个文件)2.2将修改好的函数库复制到指定位置2.3测试ArcGISAPIForJavaScript函数库是否安装成功三,Tomcat部署3.1修改2个js文件3.2将修改好的函数库复制到指定位置3.3测试ArcGI…

    2022年6月3日
    177
  • JRtplib开发笔记(四):JRtplib的VS开发环境搭建以及Demo

    原博主博客地址:https://blog.csdn.net/qq21497936本文章博客地址:https://blog.csdn.net/qq21497936/article/details/84957708《JRtplib开发笔记(一):JRtplib简介、JThread库编译》:https://blog.csdn.net/qq21497936/article/details/8478…

    2022年4月17日
    51
  • java 日志查看_Java日志

    日志对于一个系统来说非常重要,查找异常信息、分析系统运行情况等都需要用到日志。所以无论是JDK还是第三方都提供了关于日志的相关工具,本文分别介绍以下几种工具,以及各种工具间的整合、原理。JDK的java.util.logging包第三方日志工具(commons-logging/slf4j,log4j/logback)JDK的java.util.logging包JDK1.4引入了java.util….

    2022年4月6日
    85

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号