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. thinkphp5.1 cookie跨域、thinkphp5.1 session跨域、tp5.1cookie跨域

    cookie跨域: //config/cookie.php return [ //... //仅7.3.0及以上适用 'samesite' => 'None', //是否加密cookie值,fa ...

  2. 通俗易懂理解 MySQL B+树、数据存储、索引等知识

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247485630&idx=1&sn=681c9c0d ...

  3. prometheus告警规则模板:MySQL,nginx,node

    rules_up.yml groups: - name: up rules: - alert: mysql expr: up{instance="db1",job="my ...

  4. 第四章:Django表单 - 5:模型表单ModelForm

    如果你正在构建一个数据库驱动的应用,那么你可能会有与Django的模型紧密映射的表单.比如,你有个BlogComment模型,并且你还想创建一个表单让大家提交评论到这个模型中.在这种情况下,写一个fo ...

  5. Optional源码解析与实践

    1 导读 NullPointerException在开发过程中经常遇到,稍有不慎小BUG就出现了,如果避免这个问题呢,Optional就是专门解决这个问题的类,那么Optional如何使用呢?让我们一 ...

  6. C++自学笔记 初始化列表 Initializer list

    初始化p A(){ p = 0;cout<<"A::A()"<<endl;} 初始化列表 Initializer list A():p(0){ cout&l ...

  7. 关于HM NISEDIT在新版系统下编译并运行提示权限不足问题的解决方案

    如果你使用过NSIS为你的项目制作过安装包,那HM nisedit一定是你绕不过去的槛,作为NSIS号称的最佳免费IDE/编辑器,功能齐全,与NSIS配合性能强悍,实至名归.只是开发作者最后版本更新在 ...

  8. Activate MFA报错:MFADevice entity at the same path and name already exists

    MFA即:Multi-factor authentication (MFA) 今天在为自己账号Activate MFA时报错,如下图所示: Entity already exists This ent ...

  9. 垃圾回收机制GC

    垃圾回收机制GC 我们已经知道,name = 'leethon'这一赋值变量的操作,是将变量与数据值相绑定. 而数据值是存储到内存中的,有时变量会重新赋值即绑定其他数据值,而使得原本的数据值无法通过变 ...

  10. 2.Python封装练习及私有属性

    面向对象三大特性 封装:根据职责将属性和方法封装到一个抽象的类中 继承:实现代码的重用,相同代码不需要重复的编写 1.单继承 2.多继承 多态:不同的对象调用相同的方法,产生不同的执行结果,增加代码的 ...