目录
2.StringBuilder
(学完StringBuilder之后要求能够知道String和StringBuilder的区别以及能够使用StringBuilder完成需求)
2.1StringBuilder在内存中的执行流程
为了讲明白StringBuilder我们先来看一下字符串的操作
这里由一串代码,在main方法中String s =“hello”;
s += “world”;
并输出了s的值,那s的值应该是多少呢?
首先main方法会进入到栈内存中,String s会进入到main方法里面,而hello是一个常量,就会在堆内存中的常量池里出现它有个地址001,把001赋值给s
那么这个s就通过001指向了堆内存常量池里的001对应的数据内容
然后s += “world”;就相当于s = s + “world”;
这里又出现了一个world这样的一个常量,然后就会到堆内存中的常量池去找“world”结果没有“world”这个字符串常量,他就会在常量池添加一个常量对象002,它的内容是“world”,
然后就是s + “world”,s它是001,它的内容是“hello”,“hello”加上“world”内容是“helloworld”这个常量对象,所有在这里也会出现“helloworld”这样一个创建对象,它的地址是003,最后把这个003赋值给这个s,然后这个s就通过003指向了常量池的003对应的“helloworld”,
最后输出这个s的时候就是输出的003里面对应的内容:“helloworld”
最后在堆内存里面我们终使用的s其实是003里面的内容,001和002的内容就浪费掉了。
所以重点要说(下图):
2.2StringBuilder概述
StringBuilder是一个可变的字符串类,我们可以把它看成是一个容器。这里的可变指的是StringBuilder对象中的内容是可变的。(就是说他在做拼接的时候是不会创建一个对象的)
String和StringBuilder的区别:
String:内容是不可变的
StringBuilder:内容是可变的
2.3StringBiilder构造方法
先到帮助文档查看StringBilder构造方法
了解之后,到代码中演示:
/*
StringBuilder构造方法:
public StringBuilder();创建一个空白可变字符串对象,不含有任何内容
public StringBuilder(String str);根据字符串的内容,来创建可变字符串对象
*/
public class StringBuiDemo {
public static void main(String[] args) {
//public StringBuilder();创建一个空白可变字符串对象,不含有任何内容
StringBuilder sb = new StringBuilder();
//这里在控制台输出了sb: 没有其他任何内容,因为我们创建的是空白可变字符串对象,没有任何内容
System.out.println("sb:" + sb);
//我们来使用这个方法
System.out.println("sb.length():" + sb.length());//它的长度是0
//public StringBuilder(String str);根据字符串的内容,来创建可变字符串对象
StringBuilder sb2 = new StringBuilder("hello");
System.out.println("sb2“" + sb2);//输出了 hello
//我们来使用这个方法
System.out.println("sb2.length():" + sb2.length());//它的长度是5
}
}
2.4StringBuilde的添加和反转方法
代码演示:
/*
String Builder的添加和反转方法
public StringBuilder append(任意类型):添加数据,并返回对象本身
public StringBuilder reverse():返回相反的字符序列
*/
public class StringBuilder_FZ_Demo {
public static void main(String[] args) {
//要调方法首先得有对象
StringBuilder sb = new StringBuilder();
//有了对象之后调方法:public StringBuilder append(任意类型):添加数据,并返回对象本身
//StringBuilder sb2 = sb.append("hello");
//System.out.println("sb:" + sb);//2.但是为什么这里也是hello呢?
//System.out.println("sb2:" + sb2);//1.这里肯定是hello
//3.看下列解释
//System.out.println(sb == sb2);//返回的是true,说明sb和sb2是同一个对象
//4.它添加数据,并返回对象本身也就是说明返回的是自己,也就是说我们不需要一个StringBuilder来接收了
//5.可以直接写:对象.append(); 因为返回的是对象本身,因为对象本身也是个对象,是对象就可以调用方法
//sb.append("hello");
//sb.append("world");
//sb.append("java");
//sb.append(100);
//System.out.println("sb:" + sb);// sb:helloworldjava100
//System.out.println("================");
//6.上面5.那样写也是没有问题的,当然也可以改进一下,采用链式编程:
sb.append("hello").append("world").append("java").append(100);
System.out.println("sb:" + sb);//也会得到sb:helloworldjava100
//7.public StringBuilder reverse():返回相反的字符序列。反转方法演示:
sb.reverse();//reverse直接实现了把sb的内容反转
System.out.println("sb:" + sb);//会得到 001avajdlrowolleh
}
}
2.5StringBuilder和String相互转
(为什么要学习StringBuilder和String相互转换因为StringBuilder中有两个比较好用的方法一个是append,一个是reverse,如果String想使用这两个方法是使用不了的,所以得先想办法把String转换为StringBuilder,最后还得把StringBuilder转回String,所以要学习它们的相互转换)
- StringBuilder转换为String
public String toString():通过toString()就可以实现把StringBuilder转换为String。
- String转换为StringBuilder
public StringBuilder(String s):通过构造方法就可以实现把String转换为StringBuilder。
代码演示:
/*
1. StringBuilder转换为String
public String toString():通过toString()就可以实现把StringBuilder转换为String。
2. String转换为StringBuilder
public StringBuilder(String s):通过构造方法就可以实现把String转换为StringBuilder。
*/
public class StringZHDemo {
public static void main(String[] args) {
//StringBuilder转换为String
StringBuilder sb = new StringBuilder();
sb.append("hello");
//String s = sb;这样直接转换是不可以的
//public String toString():通过toString()就可以实现把StringBuilder转换为String。
String s = sb.toString();
System.out.println("s:" + s);
//String转换为StringBuilder
String s1 = "world";
//StringBuilder sb1 = s1;这样写也是错误的
//public StringBuilder(String s):通过构造方法就可以实现把String转换为StringBuilder
StringBuilder sb1 = new StringBuilder(s1);
System.out.println("s1:" + s1);
}
}