18.javase-javaAPI-String/StringBuffer/StringBuilder

String

String是java中最重要的类,也是我们工作中最常用的类.我们必须熟悉其api.
特性:
1.String类为final修饰的最终类,不能被继承.
2.String类指向的地址值不能改变.
3.String类存储数据其实底层也是字符数组
4.字符串常量池.同一内存地址下的字符串值不能变,只可能是被GC回收了,重新分配才可能发生改变.
在这里插入图片描述
面试常考问题 为什么String要用final修饰,设计成值不可变的?
首先为什么要把String设计成值不可变呢?
1.因为如果把String设计成值可变,那么多线程去操作这个String,值就会被随意修改.设计成值不可变保证了多线程调用String的安全性.
2.其次为了保证String多线程的安全性,所以才设计String为final修饰的最终类,保证其不能被子类修改.例子如下.

public class 为什么String要设计成不可变类 {
 
	public static void main(String[] args) {
 
		String a, b, c;
		a = "test";
		b = a;
		c = b;
		String processA = processA(a);
		String processB = processB(b);
		String processC = processC(c);
		System.out.println(processA);
		System.out.println(processB);
		System.out.println(processC);
	}	
	static String processA(String str){
		return str + "A";
	}	
	static String processB(String str){
		return str + "B";
	}	
	static String processC(String str){
		return str + "C";
	} 
}
//输出
// testA
//testB
//testC

当String支持非可变性的时候,它们的值很好确定,不管调用哪个方法,都互不影响。如果String是可变的,就可能如下例,我们使用StringBuffer来模拟String是可变的

public class 为什么String要设计成不可变类2 {
 
	public static void main(String[] args) {
 
		StringBuffer a, b, c;
		a = new StringBuffer("test");
		b = a;
		c = b;
		String processA = processA(a);
		String processB = processB(b);
		String processC = processC(c);
		System.out.println(processA);
		System.out.println(processB);
		System.out.println(processC);
	}
	
	static String processA(StringBuffer str){
		return str.append("A").toString();
	}
	
	static String processB(StringBuffer str){
		return str.append("B").toString();
	}
	
	static String processC(StringBuffer str){
		return str.append("C").toString();
	}
 
}
//OUTPUT
// testA
//testAB
//testABC

常用方法
A:判断功能
boolean equals(Object obj) 重写了的比较
boolean equalsIgnoreCase(String str) 比较忽略大小写
boolean contains(String str) 包含
boolean startsWith(String str) 以某个字符串开始
boolean endsWith(String str) 以某个字符串结尾
boolean isEmpty() 空
B:获取功能
int length() 长度
char charAt(int index) 指定位置的字符
int indexOf(int ch) 指定字符的位置
int indexOf(String str) 指定字符串的位置
int indexOf(int ch,int fromIndex) 从某个位置开始,指定字符的位置
int indexOf(String str,int fromIndex) 从某个位置开始,指定字符串的位置
String substring(int start) 从A位置开始截取之后的全部
String substring(int start,int end) 截取,从A位置开始到B位置结束
C:转换功能
byte[] getBytes() 转换成字节数组
char[] toCharArray() 转换成字符数组
static String valueOf(char[] chs) 将字符数组转换成字符串
static String valueOf(int i) 将int类型转换成字符串
String toLowerCase() 全转换成小写
String toUpperCase() 全转换成大写
String concat(String str) 字符串拼接
String[] split(String regex) 切割字符串
D:其他功能
a:替换功能
String replace(char old,char new) 替换字符
String replace(String old,String new) 替换字符串
b:去空格功能
String trim() 收尾去空格
c:按字典比较功能
int compareTo(String str) 比较字符串
int compareToIgnoreCase(String str) 忽略大小写比较

StringBuffer/StringBuilder

由于String字符串的值不可变,所以对String进行字符串操作的时候会产生大量的内存垃圾,所以Java设计了StringBuilder缓冲区,这个对String操作的时候就可以该表值.
(1)用字符串做拼接,比较耗时并且也耗内存,而这种拼接操作又是比较常见的,为了解决这个问题,Java就提供了
一个字符串缓冲区类。StringBuffer供我们使用。
(2)StringBuffer的构造方法
A:StringBuffer()//默认是16位
B:StringBuffer(int size)
C:StringBuffer(String str)//长度是str.length + 16.
(3)StringBuffer的常见功能(自己补齐方法的声明和方法的解释)
A:添加功能: append(): 追加功能 insert () 插入功能
B:删除功能: delete(): 删除
C:替换功能: replace() 替换
D:反转功能 reverse() 反转,倒叙
E:subString()截取功能(注意这个返回值)这个方法的返回值是String类型,前面5个方法的返回值都是StringBuffer类型的
(4)StringBuffer的练习(做一遍)
A:String和StringBuffer相互转换
String --> StringBuffer
构造方法
StringBuffer --> String
toString()方法
B:字符串的拼接
C:把字符串反转
D:判断一个字符串是否对称
(5)面试题
小细节:
StringBuffer:同步的,数据安全,效率低。
StringBuilder:不同步的,数据不安全,效率高。
A:String,StringBuffer,StringBuilder的区别
B:StringBuffer和数组的区别?
(6)面试注意的问题:
1.String作为形式参数和基本类型做形式参数相同,形参改变并不影响实参
StringBuffer作为形式参数,形参改变直接影响实参
2.StringBuffer和StringBuilder线程安全与否实现的区别

builder在这里插入图片描述
buffer

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值