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() 方法 ...
随机推荐
- thinkphp5.1 cookie跨域、thinkphp5.1 session跨域、tp5.1cookie跨域
cookie跨域: //config/cookie.php return [ //... //仅7.3.0及以上适用 'samesite' => 'None', //是否加密cookie值,fa ...
- 通俗易懂理解 MySQL B+树、数据存储、索引等知识
文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247485630&idx=1&sn=681c9c0d ...
- prometheus告警规则模板:MySQL,nginx,node
rules_up.yml groups: - name: up rules: - alert: mysql expr: up{instance="db1",job="my ...
- 第四章:Django表单 - 5:模型表单ModelForm
如果你正在构建一个数据库驱动的应用,那么你可能会有与Django的模型紧密映射的表单.比如,你有个BlogComment模型,并且你还想创建一个表单让大家提交评论到这个模型中.在这种情况下,写一个fo ...
- Optional源码解析与实践
1 导读 NullPointerException在开发过程中经常遇到,稍有不慎小BUG就出现了,如果避免这个问题呢,Optional就是专门解决这个问题的类,那么Optional如何使用呢?让我们一 ...
- C++自学笔记 初始化列表 Initializer list
初始化p A(){ p = 0;cout<<"A::A()"<<endl;} 初始化列表 Initializer list A():p(0){ cout&l ...
- 关于HM NISEDIT在新版系统下编译并运行提示权限不足问题的解决方案
如果你使用过NSIS为你的项目制作过安装包,那HM nisedit一定是你绕不过去的槛,作为NSIS号称的最佳免费IDE/编辑器,功能齐全,与NSIS配合性能强悍,实至名归.只是开发作者最后版本更新在 ...
- Activate MFA报错:MFADevice entity at the same path and name already exists
MFA即:Multi-factor authentication (MFA) 今天在为自己账号Activate MFA时报错,如下图所示: Entity already exists This ent ...
- 垃圾回收机制GC
垃圾回收机制GC 我们已经知道,name = 'leethon'这一赋值变量的操作,是将变量与数据值相绑定. 而数据值是存储到内存中的,有时变量会重新赋值即绑定其他数据值,而使得原本的数据值无法通过变 ...
- 2.Python封装练习及私有属性
面向对象三大特性 封装:根据职责将属性和方法封装到一个抽象的类中 继承:实现代码的重用,相同代码不需要重复的编写 1.单继承 2.多继承 多态:不同的对象调用相同的方法,产生不同的执行结果,增加代码的 ...