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() 方法 ...
随机推荐
- 【疑难杂症】关于pycharm无法安装插件显示网络错误问题
今天实在受不了英文的pycharm了,想着赶紧装个中文的插件,结果插件界面给我说我网络有问题 search results are not loaded check the internet conn ...
- Minio VS Ceph
文章转载自:https://blog.csdn.net/Moolight_shadow/article/details/123204412
- Shell脚本中判断字符串是否被包含在内并且使用grep 精确匹配
str1="abcdefgh" str2="def" result=$(echo $str1 | grep "${str2}") if [[ ...
- Filebeat Processors对日志数据应用基本处理和数据增强功能
下面是一个使用drop_fields处理器从Apache访问日志中删除一些字段的示例: filebeat.inputs: - type: log enabled: true fields: apach ...
- 「Tubian」Tubian0.4!完全开源!
Tubian是我自己维护的Linux发行版.Tubian基于Debian,提供了开箱既用的Wine和Waydroid,装好就有对Android应用和Windows程序的兼容. Sourceforge. ...
- 如何优雅的备份MySQL数据?看这篇文章就够了
大家好,我是一灯,今天一块学习一下如何优雅安全的备份MySQL数据? 1. 为什么要备份数据 先说一下为什么需要备份MySQL数据? 一句话总结就是:为了保证数据的安全性. 如果我们把数据只存储在一个 ...
- vue-axios更改操作
<template> <div class="nav"> <label for="">新部门</label>&l ...
- ES6 学习笔记(十二)代理器Proxy的简单使用
1.前言 以前在学习react时做了个仿手机端的QQ音乐项目.当时的数据是通过proxy代理的QQ音乐数据接口,直接写在package.json里面.Proxy 对象(Proxy)是 ES6的特性,只 ...
- pip 国内源 包管理
配置国内源 linux配置 修改 ~/.pip/pip.conf 文件,如下,添加了源并修改了默认超时时间 [global] timeout = 3000 index-url = http://mir ...
- VS Code插件推荐
VS Code插件推荐 VS Code作为前端开发人员在学习工作中必不可少的开发软件,其强大的功能以及丰富多样的插件都让开发人员爱不释手.下面推荐个人觉得还不错的几个插件,希望可以帮助到你.如果你 ...