Day29:StringBuilder详解

IT技术2年前 (2022)发布 IT大王
0

StringBuilder

1.1 StringBuilder概述

我们先对普通的String字符串对象建立进行内存分析;

public class Demo{
    public static void main(String[] args){
        String a="hello;
        s+="world";
    System.out.println(s);  
    }
}

Day29:StringBuilder详解

首先在栈内存中加载main方法,

然后来到String a=”hello;此时堆内存中的常量池中会创建一个对象且存放着hello,地址为001;栈内存中则存放着变量a,实则为地址001,并指向001对象;

程序来到s+=”world”;因为worldString类型且并不存在,所以在常量池中会新建一个空间来存放对象world,地址为002

s+=”world”等于s=s+”world”=helloworld;于是又有一个新的对象helloworld产生,地址为003;

最后来到输出语句,输出s,s的指向为003,于是输出helloworld

main方法执行完毕,弹栈消失。


String类型的数据存放在堆内存中的常量池,为常量;为常量则不可更改;

所以每一个String类型的数据的增加都会在常量池生成一个对象;

也就是说如果我们对字符串进行拼接操作,每次拼接,都会产生一个新的String对象,会浪费我们的内存空间,上面的字符串拼接创建了三个对象,最终我们使用的仅为一个;为了解决这种 现象,Java提供了一种类为StringBuilder

StringBuilder是一个可变的字符串类,即其对象的内容是可变的;在进行字符串拼接时是不会产生新的对象的。


1.2 StringStringBuilder的区别

  • String:对象内容是不可变的
  • StringBuilder:对象内容是可变的

1.3 StringBuilder的构造方法

方法名 说明
public Stringbuilder (){}; 无参构造方法;调用时对象内容为空
public Stringbuilder (String s){}; 有参构造方法;调用时对象内容为传递的实参值
public class StringbuilderDemo{
    public static void main(String[] args){
     //public Stringbuilder (){};调用无参构造,对象内容为空
    Stringbuilder st=new Stringbuilder();
    System.out.println(st);//没有任何输出
    // 我们来输出他的字符长度
    System。out.println(st.length());//0   这里需要注意一下  数组的长度方法引用是不需要加括号的;字符串的长度方法的引用是需要加上括号的
     //public Stringbuilder (){};调用无参构造,对象内容为空
    Stringbuilder st1=new Stringbuilder("工地佬");
    System.out.println(st1);//输出 工地佬 
    System。out.println(st1.length()); 
    }
}

1.4 StringBuilder的添加和反转方法

方法名 说明
public StringBuilder append(任意类型数据) 参数可以添加任意数据,且返回值为调用者对象本身
public StringBuilder reverse() 将调用者对象字符串反转后返回
//StringBuilder添加
public class Test{
    public static void main(String[] args){
        StringBuilder sb=new StringBuilder();//此时sb为空值对象
        sb.append("工地佬");//调用添加方法
        //因为StringBuilder类字符串内容可变,不会创建新的对象,直接在sb所指引的堆内存中添加字符串"工地佬";
        System.out.println(sb);//工地佬
    }
}
//StringBuilder反转
public class Test{
    public static void main(String[] args){
        StringBuilder sb=new StringBuilder("工地佬");
        // sb.reverse();此方法返回的是一个字符串对象且为自身对象sb;我们无需在定义变量接收,直接控制台输出即可
        System.out.println(sb.reverse());//佬地工
        System.out.println(sb.reverse());//工地佬  再次反转
    }
}
//链式编程
public class Test{
    public static void main(String[] args){
        StringBuilder sb=new StringBuilder();
        sb.append("工地佬");
        sb.append("工地佬").append("是").append("牛马");
        //因为append方法返回的是对象,所以我们可以继续调用方法,形成了链式编程
        System.out.println(sb);//工地佬
    }
}

1.5 StringBuilder和String相互转换

为什么我们会用到StringBuilderString相互转换呢?因为我们会用到StringBuilder的两种方法,而String没有,所以我们先将String转换为StringBuilder类型,当方法使用完后再转换回去。

  • StringBuilder转为String

通过调用toString方法即可实现

  • String转为StringBuilder

通过StringBuilder的构造方法即可实现;也就是将String对象作为参数

//StringBuilder转为String
public class Change{
    public static void main(String[] args){
        String s="工地佬";
        StringBuilder sb=new StringBuilder(s);//String对象作为StringBuilder构造器参数实现转换
        sb.append("是牛马");
        System.out.println(sb.toString());//调用toString方法实现转换
    }
}
© 版权声明
好牛新坐标 广告
版权声明:
1、IT大王遵守相关法律法规,由于本站资源全部来源于网络程序/投稿,故资源量太大无法一一准确核实资源侵权的真实性;
2、出于传递信息之目的,故IT大王可能会误刊发损害或影响您的合法权益,请您积极与我们联系处理(所有内容不代表本站观点与立场);
3、因时间、精力有限,我们无法一一核实每一条消息的真实性,但我们会在发布之前尽最大努力来核实这些信息;
4、无论出于何种目的要求本站删除内容,您均需要提供根据国家版权局发布的示范格式
《要求删除或断开链接侵权网络内容的通知》:https://itdw.cn/ziliao/sfgs.pdf,
国家知识产权局《要求删除或断开链接侵权网络内容的通知》填写说明: http://www.ncac.gov.cn/chinacopyright/contents/12227/342400.shtml
未按照国家知识产权局格式通知一律不予处理;请按照此通知格式填写发至本站的邮箱 wl6@163.com

相关文章