StringBuilder

1.1 StringBuilder概述

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

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

首先在栈内存中加载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方法实现转换 }
}

Day29:StringBuilder详解的更多相关文章

  1. Java中的String,StringBuffer,StringBuilder详解与区别

    1.String Java中string类是不可变的,其中在声明的源代码中用的final,所以只能声明一次.所以每次在明面上的改变其实是重新生成一个String对象,指针指向新的String对象.同时 ...

  2. StringBuffer与StringBuilder详解

    刚刚在参加网易实习生在线考试的时候,出了一道选择题谈到了StringBuilder这个类的一些选项,虽然那道题自己做对了,但是也提醒了我应该好好了解一些StringBuffer与StringBuild ...

  3. StringBuilder 详解 (String系列之2)

    本章介绍StringBuilder以及它的API的详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string02.html StringB ...

  4. String、StringBuffer、StringBuilder详解

    String类 字符串广泛应用在java编程中,String类在java.lang包中,String类是final修饰的,不能被继承,String类对象创建后不能修改,由0或多个字符组成,包含在一对双 ...

  5. StringBUffer和StringBuilder详解

    一.StringBUffer public  final  class  StringBUffer extends Object  implements Serializable,CharSequnc ...

  6. [读书笔记]C#学习笔记八:StringBuilder与String详解及参数传递问题剖析

    前言 上次在公司开会时有同事分享windebug的知识, 拿的是string字符串Concat拼接 然后用while(true){}死循环的Demo来讲解.其中有提及string操作大量字符串效率低下 ...

  7. String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)

    本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...

  8. String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别

    本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...

  9. java之StringBuilder类详解

    StringBuilder 非线程安全的可变字符序列 .该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍).如果可能,建议优先采用该类,因为在 ...

  10. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

随机推荐

  1. 【疑难杂症】关于pycharm无法安装插件显示网络错误问题

    今天实在受不了英文的pycharm了,想着赶紧装个中文的插件,结果插件界面给我说我网络有问题 search results are not loaded check the internet conn ...

  2. Minio VS Ceph

    文章转载自:https://blog.csdn.net/Moolight_shadow/article/details/123204412

  3. Shell脚本中判断字符串是否被包含在内并且使用grep 精确匹配

    str1="abcdefgh" str2="def" result=$(echo $str1 | grep "${str2}") if [[ ...

  4. Filebeat Processors对日志数据应用基本处理和数据增强功能

    下面是一个使用drop_fields处理器从Apache访问日志中删除一些字段的示例: filebeat.inputs: - type: log enabled: true fields: apach ...

  5. 「Tubian」Tubian0.4!完全开源!

    Tubian是我自己维护的Linux发行版.Tubian基于Debian,提供了开箱既用的Wine和Waydroid,装好就有对Android应用和Windows程序的兼容. Sourceforge. ...

  6. 如何优雅的备份MySQL数据?看这篇文章就够了

    大家好,我是一灯,今天一块学习一下如何优雅安全的备份MySQL数据? 1. 为什么要备份数据 先说一下为什么需要备份MySQL数据? 一句话总结就是:为了保证数据的安全性. 如果我们把数据只存储在一个 ...

  7. vue-axios更改操作

    <template> <div class="nav"> <label for="">新部门</label>&l ...

  8. ES6 学习笔记(十二)代理器Proxy的简单使用

    1.前言 以前在学习react时做了个仿手机端的QQ音乐项目.当时的数据是通过proxy代理的QQ音乐数据接口,直接写在package.json里面.Proxy 对象(Proxy)是 ES6的特性,只 ...

  9. pip 国内源 包管理

    配置国内源 linux配置 修改 ~/.pip/pip.conf 文件,如下,添加了源并修改了默认超时时间 [global] timeout = 3000 index-url = http://mir ...

  10. VS Code插件推荐

    VS Code插件推荐 ​ VS Code作为前端开发人员在学习工作中必不可少的开发软件,其强大的功能以及丰富多样的插件都让开发人员爱不释手.下面推荐个人觉得还不错的几个插件,希望可以帮助到你.如果你 ...