Day29:StringBuilder详解
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";因为world为String类型且并不存在,所以在常量池中会新建一个空间来存放对象world,地址为002
s+="world"等于s=s+"world"=helloworld;于是又有一个新的对象helloworld产生,地址为003;
最后来到输出语句,输出s,s的指向为003,于是输出helloworld。
main方法执行完毕,弹栈消失。
String类型的数据存放在堆内存中的常量池,为常量;为常量则不可更改;
所以每一个String类型的数据的增加都会在常量池生成一个对象;
也就是说如果我们对字符串进行拼接操作,每次拼接,都会产生一个新的String对象,会浪费我们的内存空间,上面的字符串拼接创建了三个对象,最终我们使用的仅为一个;为了解决这种 现象,Java提供了一种类为StringBuilder。
StringBuilder是一个可变的字符串类,即其对象的内容是可变的;在进行字符串拼接时是不会产生新的对象的。
1.2 String和StringBuilder的区别
- 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相互转换
为什么我们会用到StringBuilder和String相互转换呢?因为我们会用到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详解的更多相关文章
- Java中的String,StringBuffer,StringBuilder详解与区别
1.String Java中string类是不可变的,其中在声明的源代码中用的final,所以只能声明一次.所以每次在明面上的改变其实是重新生成一个String对象,指针指向新的String对象.同时 ...
- StringBuffer与StringBuilder详解
刚刚在参加网易实习生在线考试的时候,出了一道选择题谈到了StringBuilder这个类的一些选项,虽然那道题自己做对了,但是也提醒了我应该好好了解一些StringBuffer与StringBuild ...
- StringBuilder 详解 (String系列之2)
本章介绍StringBuilder以及它的API的详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string02.html StringB ...
- String、StringBuffer、StringBuilder详解
String类 字符串广泛应用在java编程中,String类在java.lang包中,String类是final修饰的,不能被继承,String类对象创建后不能修改,由0或多个字符组成,包含在一对双 ...
- StringBUffer和StringBuilder详解
一.StringBUffer public final class StringBUffer extends Object implements Serializable,CharSequnc ...
- [读书笔记]C#学习笔记八:StringBuilder与String详解及参数传递问题剖析
前言 上次在公司开会时有同事分享windebug的知识, 拿的是string字符串Concat拼接 然后用while(true){}死循环的Demo来讲解.其中有提及string操作大量字符串效率低下 ...
- String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)
本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...
- String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别
本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...
- java之StringBuilder类详解
StringBuilder 非线程安全的可变字符序列 .该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍).如果可能,建议优先采用该类,因为在 ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
随机推荐
- 7、System类
System类 常见方法 exit 退出当前程序 System.out.println("ok1"); //1. exit(0) 表示程序退出 //2. 0 表示一个状态,正常的状 ...
- 【译】CLR类型加载器设计
前言 本文翻译自BotR中的一篇,原文链接 Type Loader Design ,可以帮助我们了解CLR的类型加载机制(注意是Type类型,而不是Class类),文中涉及到术语或者容易混淆的地方,我 ...
- .NET WebAPI 自定义 NullableConverter 解决请求入参 “”空字符触发转换异常问题
最近在项目中启用了Nullable 可为空的类型,这个特性确实很好用,在 WebAPI 的入参上可以直接采用 ? 来标记一个字段是否允许为空,但是使用过程中遇到了如下一个问题,比如创建部门接口 我们定 ...
- scheduler打印状态到日志
编辑脚本和目录 # 如下步骤每个proxysql节点都需要操作 [root@ss30 opt]# mkdir -p /opt/proxysql/log [root@ss30 opt]# vim /op ...
- 升级Gogs版本
今天早上收到阿里云发的报警短信,大致内容如下: 前提分析: 公司代码代码仓库使用是Gogs搭建的,版本是0.11.34,二进制方式安装的,连接的是其他主机上的MySQL数据库,因此被检测到有这个漏洞 ...
- MongoDB分片集群-Sharded Cluster
分片概念 分片(sharding)是一种跨多台机器分布数据的方法, MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署. 换句话说:分片(sharding)是指将数据拆分,将其分散存在 ...
- MongoDB分片集群中配置参数说明
replication: #副本集的名称 replSetName: myshardrs01 sharding: #分片角色 clusterRole: shardsvr sharding.clust ...
- JuiceFS 元数据引擎选型指南
文件系统是我们常见的存储形式,内部主要由数据和元数据两部分组成.其中数据是文件的具体内容,通常会直接展现给用户:而元数据是描述数据的数据,用来记录文件属性.目录结构.数据存储位置等.一般来说,元数据有 ...
- RNN自学理解(一)
RNN对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,利用了RNN的这种能力,使深度学习模型在解决语音识别.语言模型.机器翻译以及时序分析等NLP领域的问题时有所突破. 参考文献1 ...
- 网页计时访问器application对象
网页计时访问器 application对象代表Web应用本身,整个Web共享一个application对象.开始于服务器打开结束与服务器关闭.在不同的浏览器打开j计时器仍然有作用.除非把服务器关闭 & ...