String、StringBuffer、StringBuilde
1.String类
1.八点注意事项
特别是第八点:
2.两种创建String对象的区别
String a = "wcw";
String b = "wcw";
System.out.println(a == b);
//结果为true,这是通过方式一创建,返回的地址一样
练习:
3.字符串String对象特性
小结:对于两个变量相加,底层是StringBuijder sb = new StringBuilder(); sb.append(a); sb.append(b);
sb是在堆中,并且append是在原来字符串的基础上追加的。
重要规则:String c = “ab” + “cd”,常量相加,看的是池。String c = a + b,变量相加,是在堆中。
练习题:
package com.enum_;
/**
* Created on 2021/6/18.
*
* @author Ryan_小王
*/
public class Test {
String str = new String("wcw");
final char[] ch = {'j', 'a', 'v', 'a'};
public void change(String str, char ch[]) {
str = "java";
ch[0] = 'h';
}
public static void main(String[] args) {
Test ex = new Test();
ex.change(ex.str, ex.ch);
System.out.print(ex.str + " and ");
System.out.println(ex.ch);
}
}
//结果:wcw and hava
注意:每一个String对象都有一个字符数组value存放字符串。字符数组的数据放在堆中,final类型的数组可以改变数据但是不能改变地址。例中str和ch为类的属性放在堆中,ex为对象实例放在栈中,change传入的实参首先初始化后局部变量str也是指向ex对象str的value数组,走完程序内部内容后局部变量str指向常量池的java,并没有改变对象实例ex的str。
4.String常用类
方法compareTo演示:
//(1)如果长度相同,并且每个字符也相同,则返回0
//(2)如果长度相同或者不相同,但是在进行比较时,可以区分大小,
// 就返回if (c1 != c2) {
// return c1 - c2;
// }
//(3)如果前面的部分相同,就返回s1.len - s2,len
String s1 = "wcd";
String s2 = "wcaw";
System.out.println(s1.compareTo(s2));
方法format演示:
String name = "小王";
int age = 23;
double score = 98.3;
char gender = '男';
//将所有信息拼接在一个字符串
String info = "我的姓名是" + name + "年龄" + age + "分数" + score + "性别" + gender;
System.out.println(info);
String info1 = String.format("我的名字是%s年龄是%d,成绩是%.2f,性别是%c",name,age,score,gender);
System.out.println(info1);
2.StringBuffer类
变长的,若char[]容量不足则会新开辟一个容量大的字符数组,并不会改变对象的地址。
1.String和StringBuffer类对比
2.StringBuffer构造器
默认无参构造器为一个大小为16的char[],若传入字符串,则char[]的大小为str.length() + 16。
3.String和StringBuffer的转换
//String-->StringBuffer
String str = "hello";
//方式1 使用构造器
//注意:返回的才是StringBuffer对象,堆str本身没有影响
StringBuffer stringBuffer = new StringBuffer(str);
//方式2 使用append方法
StringBuffer stringBuffer1 = new StringBuffer();
stringBuffer1 = stringBuffer1.append(str);
//StringBuffer-->String
StringBuffer stringBuffer2 = new StringBuffer("wcw");
//方式1 使用StringBuffer提供的toString方法
String s = stringBuffer2.toString();
//方式2 使用构造器来确定
String s0 = new String(stringBuffer);
4.StringBuffer类常见方法
5.StringBuffer练习
String str = null;
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(str); //底层源码调用的AbstractStringBuilder的appendNULL
System.out.println(stringBuffer.length()); //4
System.out.println(stringBuffer); //null
StringBuffer stringBuffer1 = new StringBuffer(str); //底层 super(str.length + 16),空指针异常
System.out.println(stringBuffer1);
3.StringBuilder类
1.基本介绍
StringBuilder不是线程安全的,方法都没有synchronized关键字,可在单线程中使用,比StringBuffer快。
2.String、StringBuffer、StringBuilder
String、StringBuffer、StringBuilder三者的比较:
String、StringBuffer、StringBuilder三者的选择: