图析: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对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量 可变类,速度更快
不可变 可变 可变
  线程安全 线程不安全
  多线程操作字符串 单线程操作字符串

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java8 list转换对象_Java8将List对象转换Map「建议收藏」

    java8 list转换对象_Java8将List对象转换Map「建议收藏」基于Java8的函数式编程概念,去实现List转换MappublicclassDemoMian2{publicstaticvoidmain(String[]args){ListusersList=newArrayList();Usersusers=newUsers();users.setId(1L);users.setName(“张三”);users.setSex(…

  • python创建线程池_python爬虫多线程和多进程

    python创建线程池_python爬虫多线程和多进程importthreadingfromconcurrent.futures.threadimportThreadPoolExecutorlock=threading.Lock()deffunc(x,y):”””打印x次y”””globallockforiinrange(x):withlock:print(y)#线程池最大线程数3withThreadPool

  • matlab的插值方法[通俗易懂]

    matlab的插值方法[通俗易懂]1.Lagrange插值插值是在已知数据之间寻找估计值的过程。在信号处理和图像处理中,插值极其常用。类型很多:比如多项式插值,一、二、三维插值,样条插值等。方法介绍:对给定的n个插值点x1,x2,⋯,xnx1,x2,⋯,xn{x_1},{x_2},\cdots,{x_n}及对应的函数值y1,y2,⋯,yny1,y2,⋯,yn{y_1},{y_2},\cdots,{y_n}…

  • Windows系统下JBOSS服务器下载安装

    Windows系统下JBOSS服务器下载安装Windows系统下JBOSS服务器下载安装JDK的安装Jboss的介绍Jboss下载Jboss安装JDK的安装首先安装JDK,配置环境变量(PATH,CLASSPATH,JAVA_HOME)。可以参照:Windows环境下JDK安装与环境变量配置Jboss的介绍JBOSS是EJB的服务器,就像Tomcat是JSP服务器一样,就是服务器的一种。JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用,而不用支付费用。Jboss的详细介绍可以参照:jboss的百度百科。Jboss下载Jbo

  • PNG文件格式具体解释

    PNG文件格式具体解释

  • vagrant 登录不了

    vagrant 登录不了

发表回复

您的电子邮箱地址不会被公开。

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