[转载] Java StringBuilder StringJoiner

参考链接: 何时在StringBuilder上使用StringJoiner

1. StringBuilder 

Java编译器对String做了特殊处理,使得我们可以直接用+拼接字符串。 

虽然可以直接拼接字符串,但是,在循环中,每次循环都会创建新的字符串对象,然后扔掉旧的字符串。这样,绝大部分字符串都是临时对象,不但浪费内存,还会影响GC效率。 

为了能高效拼接字符串,Java标准库提供了StringBuilder,它是一个可变对象,可以预分配缓冲区,这样,往StringBuilder中新增字符时,不会创建新的临时对象。 

package com.learn.string;

 

//StringBuilder相关

 

public class Test {

    public static void main(String[] args) {

 

        /**

         * Java编译器对String做了特殊处理,使得我们可以直接用+拼接字符串。

         * 虽然可以直接拼接字符串,但是,在循环中,每次循环都会创建新的字符串对象,然后扔掉旧的字符串。

         * 这样,绝大部分字符串都是临时对象,不但浪费内存,还会影响GC效率。

         * 为了能高效拼接字符串,Java标准库提供了StringBuilder,它是一个可变对象,可以预分配缓冲区,

         * 这样,往StringBuilder中新增字符时,不会创建新的临时对象

         */

        String s="";

        for(int i=0; i<100; i++){

            s=s+","+i;

        }

        System.out.println(s.substring(1));

 

        StringBuilder stringBuilder=new StringBuilder(1024);

        for(int i=0;i<100;i++){

            stringBuilder.append(",");

            stringBuilder.append(i);

        }

        System.out.println(stringBuilder.substring(1));

        s=stringBuilder.toString();

        System.out.println(s.substring(1));

 

        /**

         * StringBuilder还可以进行链式操作

         * 查看StringBuilder的源码,可以发现,进行链式操作的关键是,

         * 定义的append()方法会返回this,这样,就可以不断调用自身的其他方法。

         */

        StringBuilder stringBuilder2=new StringBuilder(1024);

        stringBuilder2.append("xiao").append("ming").append("!").insert(0,"haha,");

        System.out.println(stringBuilder2);

        //haha,xiaoming!

    }

}

 

仿照StringBuilder,设计一支持链式操作的类。例如,一个可以不断增加的计数器: 

package com.learn.string;

 

//设计一个支持链式操作的类

 

class Adder{

 

    private int sum=0;

 

    public Adder add(int n){

        sum+=n;

        return this;

    }

 

    public Adder inc(){

        sum+=1;

        return this;

    }

 

    public int value(){

        return sum;

    }

}

 

public class Test2 {

 

    public static void main(String[] args) {

        Adder adder=new Adder();

        adder.add(2).add(3).inc().add(60);

        System.out.println(adder.value());

        //66        

    }

    

}

 

注意:对于普通的字符串+操作,并不需要我们将其改写为StringBuilder,因为Java编译器在编译时就自动把多个连续的+操作编码为StringConcatFactory的操作。在运行期,StringConcatFactory会自动把字符串连接操作优化为数组复制或者StringBuilder操作。 

2. StringJoiner 

package com.learn.string;

 

import java.util.StringJoiner;

 

public class Test3 {

 

    public static void main(String[] args) {

        String[] names={"aaa","bbb","ccc"};

        /**

         * 类似用分隔符拼接数组的需求很常见,所以Java标准库还提供了一个StringJoiner来干这个事

         * 可以给StringJoiner指定“开头”和“结尾”

         */

        StringJoiner sj=new StringJoiner(", ","Hello ","!");

        for(String name:names){

            sj.add(name);

        }

        System.out.println(sj.toString());

        //Hello aaa, bbb, ccc!

 

        //在不需要指定“开头”和“结尾”的时候,用String.join()更方便

        String s=String.join(", ",names);

        System.out.println(s);

        //aaa, bbb, ccc

    }

}

 

StringJoiner内部是如何拼接字符串的呢?查看源码,可以发现,StringJoiner内部实际上就是使用了StringBuilder,所以拼接效率和StringBuilder几乎是一模一样的。 

String还提供了一个静态方法join(),这个方法在内部使用了StringJoiner来拼接字符串,在不需要指定“开头”和“结尾”的时候,用String.join()更方便 

注: 

1.用指定分隔符拼接字符串数组时,使用StringJoiner或者String.join()更方便; 

用StringJoiner拼接字符串时,还可以额外附加一个“开头”和“结尾”。 

2.StringBuffer,是Java早期的一个StringBuilder的线程安全版本,它通过同步来保证多个线程操作StringBuffer也是安全的,但是同步会带来执行速度的下降。 

3.StringBuilder是可变对象,用来高效拼接字符串; 

StringBuilder可以支持链式操作,实现链式操作的关键是返回实例本身。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540160.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EMC VMAX的磁盘构成,fast policy(重要)

首先是流程&#xff0c; 不同种类的磁盘&#xff08;sata&#xff0c;fc&#xff0c;flah&#xff09;->disk group->raid->DATA volume->thin pool->TDEV and BCVDEV (lun) 然后细看&#xff1a; 1&#xff09; 不同种类的磁盘叫做disk&#xff0c;这是可见的物…

[转载] Java反射是什么?看这篇绝对会了!

参考链接&#xff1a; Java中的util.Arrays与Reflection.Array的示例 作者&#xff1a;火星十一郎 https://www.cnblogs.com/hxsyl 一.概念 反射就是把Java的各种成分映射成相应的Java类。 Class类的构造方法是private&#xff0c;由JVM创建。 反射是java语言的一个特性…

[精讲-3]Offline Domain Join

从windows 2008 ,windows 7开始起就具备脱机加入域的功能,就是它们在未连接DC的情况下,也可以加入域. 假如环境lab.com ,一台已加入域的PC (WIN7Client) 和即将加入域的PC(win7-2) 在win7client上run下面这个命令 DC已作了一次预先的动作:创建了computer object 在win7-2上,用本…

[转载] Java——toArray,集合转换为数组

参考链接&#xff1a; 从ArrayList到Java的Array数组转换&#xff1a;toArray()方法 package day04; import java.util.ArrayList; import java.util.Collection; /** * 集合转换为数组 * Collection中定义了两个方法 * Object[] toArray * <T>Y[] toArray(T[] array) …

c#匿名方法

//以下示例和说明都源于《visual c# 2005 技术内幕》 //匿名函数就是没有名字的函数&#xff0c;是专用于委托的函数。 using System; using System.Collections.Generic; using System.Text; namespace 匿名方法 { public delegate void DelegateClass(); public dele…

[转载] JAVA8 创建流的5种方式

参考链接&#xff1a; 用Java创建流的10种方法 java8中的流式操作是一个很重要的内容 1、通过 stream 方法把 List 或数组转换为流&#xff0c;如Arr.stream()&#xff1b; //通过stream方法把List或数组转换为流 Arrays.asList("a1", "a2", "a3&…

用户反馈:对 Rafy 开发框架的一些个人建议

对Rafy开发框架的一些个人建议 1、潜在使用群体分析 个人认为使用类似Rafy、AgileEAS.NET、PDF.NET及OpenWorks框架的群体主要为以下几种&#xff1a; 1.1、小微软件企业 小微软件企业&#xff0c;这类软件公司的开发人员一般在10人以下&#xff0c;多以项目实施为主基本谈不上…

[转载] Java8新特新--Stream语法应用在ArrayList的元素移除和排序

参考链接&#xff1a; 如何在Java 8中打印Stream的元素 单元测试&#xff1a; Test public void Test02(){ // 源 ArrayList<Integer> IdsSour new ArrayList<>(); IdsSour.add(5); IdsSour.add(1); IdsSour.add(3); IdsSour.add(2); IdsSour.add(6); IdsSour.a…

搭建iscsi存储系统

搭建iscsi存储系统 NAS和SAN服务器概述 NAS网络附属存储&#xff1a; NAS&#xff08;Network Attached Storage)&#xff0c;NAS服务器是连接在网络上&#xff0c;具备资料存储功能的服务器&#xff0c;一种与用数据存储服务器。网络附属存储基于标准网络协议&#xff08;Tcp/…

[转载] Java8 Stream流遍历 如何使用索引

参考链接&#xff1a; Java 8中迭代带有索引的流Stream 1. 问题来源 Java8的Stream流为我们的遍历集合带来了方便&#xff0c;基本可以取代for循环了。但是有一些情况需要知道当前遍历的索引&#xff0c;使用for循环当然可以轻易获得&#xff0c;但使用stream就很难了。 比如…

Jquery简单的右侧浮动菜单

今天有空稍微看了下Jquery动画函数animate这个方法&#xff0c;发现可以用这个方法来做下简单的右侧浮动菜单 因为经常做淘宝页面时候会碰到这样的效果 以前都是用人家的javascript组件代码 发现老是用人家也不好&#xff0c;所以今天有空用jqeury中的animate这个方法写了一个简…

[转载] Java8-Stream API 详解

参考链接&#xff1a; 如何在Java 8中从Stream获取ArrayList 摘要 Stream 作为 Java 8 的一大亮点&#xff0c;它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同于 StAX 对 XML 解析的 Stream&#xff0c;也不是 Amazon Kinesis 对大数据实时处理…

在Microsoft System Center中利用您的现有投资管理VMware--Veeam MP v6.5

在 Microsoft System Center 中利用您的现有投资管理 VMware VeeamManagement Pack (MP) v6.5 适用于物理、虚拟和备份基础架构的单一的虚拟管理平台 前段时间介绍了Veeam Management Pack (MP) v6.0产品&#xff0c;昨天发布了新版本VeeamManagement Pack (MP) v6.5&#xff0…

[转载] Java关键字(Java 8版本)

参考链接&#xff1a; 所有Java关键字列表 定义 被Java语言赋予了特殊含义&#xff0c;用作专门用途的字符串&#xff08;单词&#xff09;&#xff0c;这些关键字不能用于常量、变量、和任何标识符的名称。 Java关键字(Java 8版本) Java关键字(Java 8 以后版本) 注意事…

uiw 1.2.17 发布,基于 React 16 的组件库

发布&#xff0c; 高品质的UI工具包&#xff0c;React 16的组件库。 文档网站&#xff1a;uiw-react.github.io开源仓库&#xff1a;github.com/uiw-react/u… 更新内容&#xff1a; ? 修复没有代码检测文件匹配*.css。 5712887 ? 添加 .editorconfig 文件. d82dabf ⛑ 给测试…

[转载] Java中this和super关键字分别是什么意思

参考链接&#xff1a; Java中的Super关键字 this和super关键字 this是自身的一个对象&#xff0c;代表对象本身可以理解为指代当前的对象&#xff0c;它可以调用当前对象的属性、方法和构造方法&#xff0c;一般情况下可以省略&#xff0c;必须使用this的地方是区分出现名字重…

SpringMVC注解HelloWorld

今天整理一下SpringMVC注解 欢迎拍砖 RequestMapping RequestMapping是一个用来处理请求地址映射的注解&#xff0c;可用于类或方法上。用于类上&#xff0c;表示类中的所有响应请求的方法都是以该地址作为父路径。 RequestMapping注解有六个属性&#xff0c;下面我们把她分成三…

mysql问答汇集

问:A&#xff0c;B两台mysql实现主从复制,A提供写&#xff0c;B提供读,那既然B要同步A&#xff0c;当A更新数据的时候&#xff0c;B不也一样要更新吗&#xff1f;那B不还是没有实现负载减轻吗&#xff1f;还有能通过MYSQL proxy实现3台mysq均衡l吗&#xff1f;一台写&#xff0…

自制 移动端 纯原生 Slider滑动插件

在Google搜关键字“slider”或“swiper”能找到一大堆相关插件&#xff0c;自己造轮子是为了能更好的理解其中的原理。 给这个插件取名为“veSlider”是指“very easy slider”非常简单的一个滑动插件。 这只是个半成品&#xff0c;仅仅实现了手指滑动、自动轮播、跳转等基本功…

ISA Server 2006 部署步骤

ISA Server 2006 部署步骤 Posted by 尹揆 在这里先把ISA2006的安装步骤给大家贴出来,后面陆续会有一些配置及日常的应用,希望大家多多指教!呵呵.ISA功能的强大自然不用多说了,一句话只要能想到它就能做到!放入光盘出现在我们面前还是其人性化的界面点默认的下一步吧接受协议序…