概述

说明:可以事先学习下: 📁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就行,或者自己测试下,以求正确使用。

真没必要记。。。。。