String、StringBuffer以及StringBuilder的区别?

本文详细解析了Java中String,StringBuffer与StringBuilder的区别。涵盖了它们的实现原理、内存占用、构造方法、功能特性及适用场景,特别是对线程安全性和效率的对比。

都是java.lang包下

String 

 implements java.io.Serializable, Comparable<String>, CharSequence    占用资源多

1. 值(长度和内容)不变(常量)  private final char value[];     但引用可变        利用反射可以修改常量池中的常量(value数组)

2. 构造方法:无参、字符串常量、字符数组、字符数组的一部分、整数数组的一部分、字节数组、字节数组的一部分、StringBuffer对象、StringBuilder对象等

3. 功能:判断、获取、转换、替换、去空格、按字典序比较      NOTE:基本上返回的是新串

StringBuffer

extends AbstractStringBuilder implements java.io.Serializable, CharSequence   占用资源少

1. 值(长度和内容)可变    private transient char[] toStringCache;//不被序列化     

2. 构造方法:无参(初始大小为16),带参(指定大小),字符串(大小为字符串长度+16)

3. 功能:添加(任意类型),删除(也可指定位置),替换,反转,NOTE:原StringBuffer串上做调整修改   

               截取(返回的是新字符串)

4. 同步,线程安全,效率低

    为什么StringBuffer线程安全?因为其所有的public方法都是synchronized修饰的!

5. 缓冲区

   private transient char[] toStringCache;
   
   @Override
   public synchronized String toString() {
        if (toStringCache == null) {
            toStringCache = Arrays.copyOfRange(value, 0, count);
        }
        return new String(toStringCache, true);
    }
    String(char[] value, boolean share) {
        // assert share : "unshared not supported";
        this.value = value;
    }

缓冲区对StringBuffer的优化:直接使用toStringCache构造一个新的字符串

6. 适用场景:多线程

StringBuilder

extends AbstractStringBuilder implements java.io.Serializable, CharSequence   占用资源少

1. 值(长度和内容)可变    没有缓冲字符数组!!!

2. 构造方法:无参(初始大小为16),带参(指定大小),字符串(大小为字符串长度+16)

3. 功能:添加(任意类型),删除(也可指定位置),替换,反转,NOTE:原StringBuffer串上做调整修改   

              没有截取!!!

4. 非同步,线程不安全,效率高

    为什么StringBuffer线程不安全?因为其方法没有加同步锁!

5. 缓冲区

    @Override
    public String toString() {
        // Create a copy, don't share the array
        return new String(value, 0, count);
    }
 public String(char value[], int offset, int count) {
        if (offset < 0) {
            throw new StringIndexOutOfBoundsException(offset);
        }
        if (count <= 0) {
            if (count < 0) {
                throw new StringIndexOutOfBoundsException(count);
            }
            if (offset <= value.length) {
                this.value = "".value;
                return;
            }
        }
        // Note: offset or count might be near -1>>>1.
        if (offset > value.length - count) {
            throw new StringIndexOutOfBoundsException(offset + count);
        }
        this.value = Arrays.copyOfRange(value, offset, offset+count);
    }
    public static char[] copyOfRange(char[] original, int from, int to) {
        int newLength = to - from;
        if (newLength < 0)
            throw new IllegalArgumentException(from + " > " + to);
        char[] copy = new char[newLength];
        System.arraycopy(original, from, copy, 0,
                         Math.min(original.length - from, newLength));
        return copy;
    }

复制一个字符数组构建一个字符串

6.  适用场景:单线程 

标题SpringBoot与Android融合的全民健身App研究AI更换标题第1章引言介绍全民健身App的研究背景、意义、国内外现状,并阐述论文方法与创新点。1.1研究背景与意义分析全民健身趋势及App开发的必要性。1.2国内外研究现状综述国内外全民健身App的研究与应用现状。1.3研究方法以及创新点简述采用SpringBoot与Android结合的研究方法及创新点。第2章相关理论介绍SpringBoot框架、Android开发以及全民健身相关的理论基础。2.1SpringBoot框架概述阐述SpringBoot框架的特点与优势。2.2Android开发基础介绍Android开发的基本概念与核心技术。2.3全民健身相关理论概述全民健身的概念、意义及发展目标。第3章全民健身App的设计详细介绍全民健身App的设计思路与实现方法。3.1需求分析与功能设计分析用户需求,设计App的主要功能模块。3.2数据库设计与交互设计数据库结构,实现与后端的数据交互。3.3界面设计与用户体验设计App界面,提升用户体验。第4章SpringBoot后端实现阐述SpringBoot在全民健身App后端开发中的具体应用。4.1后端架构设计设计后端架构,确保系统的稳定性与可扩展性。4.2接口设计与实现实现与Android前端交互的接口。4.3数据处理与安全机制处理用户数据,确保数据安全。第5章Android前端实现与测试介绍Android前端实现过程及测试方法。5.1前端页面布局与交互实现App的前端页面布局与交互逻辑。5.2功能测试与性能优化对App进行功能测试,优化性能。5.3用户反馈与迭代更新收集用户反馈,进行迭代更新。第6章结论与展望总结研究成果,提出未来研究方向。6.1研究结论概括全民健身App设计与实现的主要成果。6.2展望提出App未来改进方向及全民健身领域的研究展望。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值