java—StringBuffer和StringBuilder

本文详细比较了String、StringBuffer和StringBuilder三个类的区别,包括它们的特点、底层实现原理、常见方法及性能差异。通过源码分析帮助理解字符串操作时的选择。

1. String、StringBuffer、StringBuilder三者的异同?

  • String:不可变的字符序列;底层使用char[]存储
  • StringBuffer:可变的字符序列;线程安全的,效率低 (因为使用了synchronized) ;底层使用char[]存储
  • StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储

2. StringBuffer类:

其可变的字符序列体现在:

  • 例如下面示例,对于String,因为储存在final的char[]中,具有不可变性。其常用方法都是直接返回一个新的String对象,原本的对象不会改变。
  • 但是StringBuffer类型的对象,其setCharAt()方法是void的,直接可以在原储存区域更改该对象某个位置的值。
  • 注意声明StringBuffer类型的对象时不能用  StringBuffer sb = "abc"; 这是对于String类型可以使用的,从而储存在常量池中。
package day3;

public class stringtest1 {
    public static void main(String[] args){

        StringBuffer sb = new StringBuffer("abc");
        sb.setCharAt(0, 'A');
        System.out.println(sb);//Abc

        String s = "abc";
        String s1 = s.replace('a','A');
        System.out.println(s);//abc
        System.out.println(s1);//Abc

    }
}

3. String和StringBuffer和StringBuilder区别的源码分析

  • String str = new String();     源码中:char[] str = new char[0]; 
  • String str = new String("abc"); 源码中:char[] str = new char[]{'a','b','c'};
  • String str = "abc";   源码中:final char[] str = new char[]{'a','b','c'};

 

  • StringBuffer str = new StringBuffer();  源码中:char[] str = new char[16]; 创建了长度为16的char[]。如果容量不够用就扩容。
  • StringBuffer str = new StringBuffer("abc");  源码中:char[] str = new char[16+str.length()];   创建了长度为19的char[]。相当于多扩容了16个位置。
  • 对于StringBuffer的 str,虽然创建时都多扩容了16个位置,但是str.length()还是实际长度
  • 对于StringBuffer str = new StringBuffer(); 这种构造方式,因为一开始默认创建16个容量的char[],再之后添加元素的时候如果超出容量,要重新创建一个长度等于原来容量的2倍 + 2的char[],再把原来的数组复制到新数组中。我们推荐利用StringBuffer str = new StringBuffer(int capacity); StringBuiler str = new StringBuiler(int capacity);这种构造方式,避免复制等操作。
  • StringBuffer和StringBuilder在上面源码是一样的,都是可变的。

4. StringBuffer和StringBuiler的常用方法:(StringBuffer和StringBuiler的常用方法一样,只介绍StringBuffer)

注意void类型的方法都是直接对原字符串进行修改,有返回值的就是没修改原来的字符串,而是返回一个新的字符串

StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
StringBuffer delete(int start,int end):删除指定位置的内容,左闭右开
StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str
StringBuffer insert(int offset, xxx):在指定位置插入xxx,xxx支持多种基本数据类型转化为string
StringBuffer reverse() :把当前字符序列逆转

public int indexOf(String str)  返回str在原字符串中出现的位置
public String substring(int start,int end):返回一个从start开始到end索引结束的左闭右开区间的子字符串
public int length()
public char charAt(int n )
public void setCharAt(int n ,char ch)

总结:
   增:append(xxx)
   删:delete(int start,int end)
   改:setCharAt(int n ,char ch) / replace(int start, int end, String str)
   查:charAt(int n )
   插:insert(int offset, xxx)
   长度:length();

示例:对于StringBuffer s = new StringBuffer("hello");

  •  自动将基本数据类型转成string后增加到最后。
  • s1.append(1); //hello1
  • s1.append('1');//hello1
  • s1.append(false);//hellofalse
  • s1.append(11.01);//hello11.01
  • s1.delete(2,4); //heo  左闭右开
  • s1.replace(2,4,"aa");// heaao
  • s1.insert(1,1); // h1ello
  • s1.reverse(); // olleh

5. String和StringBuffer和StringBuilder的效率

对比String、StringBuffer、StringBuilder三者的效率:“注意这里string是用字面量的方式创建”
从高到低排列:StringBuilder > StringBuffer > String

String最低的原因是不可变,所以每次操作都是需要重新在常量池里创建。

 

 

 

 

 

 

 

 

AI 一站式短剧/漫剧生成平台 Industrial AI Motion Comic & Video Workbench中文 English 日本語 License: CC BY-NC-SA 4.0BigBanana AI Director 是一个 AI 一站式短剧/漫剧平台,面向创作者,实现从灵感到成片的高效生产。它摇弃了传统的"抽卡式"生成,采用 "Script-to-Asset-to-Keyframe" 的工业化工作流。通过深度集成 AntSK API 的先进 AI 模型,实现 "一句话生成完整短剧,从剧本到成片全自动化",同时精准控制角色一致性、场景连续性与镜头运动。界面展示项目管理项目管理Phase 01: 剧本与分镜剧本创作 剧本与故事Phase 02: 角色与场景资产角色场景 场景Phase 03: 导演工作台导演工作台 镜头九宫格 镜头与帧 镜头与帧1Phase 04: 成片导出成片导出提示词管理提示词管理核心理念:关键帧驱动 (Keyframe-Driven)传统的 Text-to-Video 往往难以控制具体的运镜起止画面。BigBanana 引入了动画制作中的 关键帧 (Keyframe) 概念:先画后动:先生成精准的起始帧 (Start) 结束帧 (End)。插值生成:利用 Veo 模型在两帧之间生成平滑的视频过渡。资产约束:所有画面生成均受到“角色定妆照”“场景概念图”的强约束,杜绝人物变形。核心功能模块Phase 01: 剧本与分镜 (Script & Storyboard)智能剧本拆解:输入小说或故事大纲,AI 自动拆解为包含场次、时间、气氛的标准剧本结构。视觉化翻译:自动将文字描述转化为专业的 Midjourney/Stable Diffusion 提示词。节奏控
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值