概述
说明:可以事先学习下: 📁JVM
1.前置介绍
(1)发现在使用String类处理字符串时,由于字符串的不可变性,会产生很多中间变量,而且也会产生很多在常量池中废弃的数据,而使用StringBuilder可以避免这种情况的发生;
(2)而在StringBuilder出现之前,StringBuffer是很常用的:
注:StringBuilder和StringBuffer的方法基本上是一样的,在程序开发中基本是可以完全替代的;
线程安全的时候,其速度相对会慢一些;
2.StringBuilder类常见方法罗列
StringBuilder类中还有:这些方法没有必要记忆,只需要有个印象,知道StringBuilder类可以做什么就好了,用的时候去查API
append()方法:(有很多重载的形式)在字符串的末尾增加内容;
charAt(int inidex)方法:取某个位置处的字符;
delete(int start,int end):删除字符的方法;
indexOf(String str):定位子字符串的位置;
insert(int offset,***):(有很多重载形式):=在字符串的指定位置处插入内容;
length():返回字符串的长度;
replace(int start,int end,String str):替换字符串的某个字串;
subString(int start,int end):求子串;
toString():将StringBuilder类型的对象,转换成String类型的对象;
3.String和StringBuilder的区别和应用场景
注:可能StringBuilder类的诸如append()这些方法的存在,使得我们在处理字符串时可以尽量不去创建新的字符串,从而提升一些效率和降低系统压力吧
String类
String是一个类,如:String s1 = “zifuchaun”;这是把s1当成了一个String类型的对象;
1.创建字符串对象常见的三种方式
(注:(1)getBytes():方法的作用是在网络传输的时候,字符串需要以二进制字节形式的传输;
(2)这些方法用时即查就行,没必要硬记;)
2.字符串定义的其他方式
注:equals()方法;字符串和字节数组转换
1.String的方法很多,没必要全部一次性记忆,用的时候可以再查
常见方法举例:
(1)取某位置的单个字符;取子字符串
(2)字符或子字符串的位置
字符串和Byte数组间的相互转换
网络上传输的数据是二进制字节型的,所以在进行网络传输时,需要字符串和Byte数组的相互转换。
public class StringDemo3 {
public static void main(String[] args) throws UnsupportedEncodingException {
String str = new String("JAVA 编程 基础");
// 字符串转换成byte字节数组
byte[] arrs = str.getBytes();
byte[] arrs1 = str.getBytes("GBK"); // 制定编码方式
for(int i = 0;i<arrs.length;i++){
System.out.print(arrs[i]+" ");
}
System.out.println();
// 将字节数组转换成字符串。。。。注:来回转换的编码形式需要保证一致才能转换正确,否则会出现乱码
String str1 = new String(arrs);
System.out.println(str1);
// 指定编码方式,需要处理“UnsupportedEncodingException”异常
String str2 = new String(arrs,"GBK");
System.out.println(str2);
}
}
== 和equals()方法的区别
1.== 和equals()方法的区别
String类重写了equals()方法,String类的equals方法只要值一样就返回true,== 比较的是对象的内存地址是否一样。
(1)使用new这种方式创建对象时,会在堆中新开辟内存空间存放对象;
(2)采用直接变量赋值的方式创建的对象的时候,会从常量池的地方开辟空间存放值;
public class StringDemo5 {
public static void main(String[] args) {
String str1 = "imooc";
String str2 = "imooc";
String str3 = new String("imooc");
// String类重写了equals()方法,内容相同就为true
System.out.println("str1和str2的内容是否一样:"+(str1.equals(str2)));
System.out.println("str1和str3的内容是否一样:"+(str1.equals(str3)));
System.out.println("str1和str2的地址是否一样:"+(str1==str2));
System.out.println("str1和str3的地址是否一样:"+(str1==str3));
}
}
运行结果:
str1和str2的内容是否一样:true
str1和str3的内容是否一样:true
str1和str2的地址是否一样:true
str1和str3的地址是否一样:false
2.附compareTo()方法和concat()方法
compareTo()方法:比较值的大小( 注:不要重复造轮子)
concat()方法:连接字符串
str1.concat(str2)是把str1和str2的内容连接起来,然后把连接后的值输出,但是连接操作并没有改变str1和str2的值
字符串的不可变性
目前开看:String类的字符串,对其的截取,使用均只是“借用”,并不会对原字符串造成影响
1.字符串的不可变性,三个简单例子
public class StringDemo6 {
public static void main(String[] args) {
// String的不可变性
// String对象一旦被创建,则不能修改,是不可变的
// 所谓的修改其实是创建了新的对象,所指向的内存空间不变
String s1 = "imooc"; // 在常量池中生成一个"imooc"字符串,在栈中有一个s1引用指向这个字符串
s1 = "hello,"+s1; // 在常量池中生成了一个"hello,imooc"字符串,然后,s1改指向"hello,imooc"这个字符串了;
// 此时"imooc"这个字符串就没有任何引用指向它了,它就被废弃掉了
System.out.println(s1);
}
}
结果:
hello,imooc
public class StringDemo6 {
public static void main(String[] args) {
String s1 = "imooc"; // 在常量池中生成一个"imooc"字符串,在栈中有一个s1引用指向这个字符串
String s2 = "hello,"+s1;
System.out.println(s1);
System.out.println(s2);
}
}
结果:
imooc
hello,imooc
public class StringDemo6 {
public static void main(String[] args) {
String s3 = new String("hello,imooc"); // 在堆中开辟空间存储对象
System.out.println(s3.substring(0, 5)); // 将截取后的"hello"存在常量池中,以供输出
System.out.println(s3);
}
}
结果:
hello
hello,imooc
注:
(1)目前看来,这篇博客并没有什么内容;
(2)发现在使用String类处理字符串时,由于字符串的不可变性,会产生很多中间变量,而且也会产生很多在常量池中废弃的数据,而使用StringBuilder可以避免这种情况的发生;
StringBuilder常用方法举例
注:这篇博客并没有什么内容……这些方法没必要记,只需要有影响,用的时候查API
1.append()方法
append()方法:后面追加内容
public class StringBuilderDemo1 {
public static void main(String[] args) {
StringBuilder str = new StringBuilder("你好");
// 字符串后面追加内容:append
System.out.println(str.append(",imooc"));
System.out.println(str); // 此时str已经变成"你好,imooc"了;
}
}
发现,其并没有在内存中生成新的对象,也没有生成新的字符串常量;
2.其他方法
其他诸如delete()方法,insert()方法,replace()方法,,subString()方法等,很自然,也很容易理解;如果在使用的时候存在诸如索引等模糊的地方,去查API就行,或者自己测试下,以求正确使用。
真没必要记。。。。。