Java基础系列--07_String、StringBuffer和StringBuilder
String类
(1)字符串:字符串是常量;它们的值在创建之后不能更改,存储在堆中。
如果字符串多次赋值,其实是每次重新赋值的时候程序都先在内存中寻找已开辟的空间是否存在该值;如果找不到,再开辟新的空间存储该对象
(2)构造方法:
A:String s = new String(); //空字符序列
B:String s = new String(char[] chs); //分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。
C:String s = new String(char[] chs,int index,int length); //从index到length部分生成字符串
D:String s = new String(String str);
E:String s = "hello";
1 String strA = "abc";
2 //等效于:
3 //char data[] = {'a', 'b', 'c'};
4 //String strA = new String(data);
5 String strB = "hello";
6 System.out.println(strA==strB); //false
7 strA = "hello";
8 System.out.println(strA==strB); //true
9 //说明strA和StrB指向的是同一个空间
(3)字符串的注意事项
A:字符串一旦被赋值,就不能改变。
注意:字符串的值不能改变,但是引用变量可以改变。
B:字符串在作为实参传递给形参时,其实是把地址的值赋给了形参,在形参修改了字符串的内容后,原字符串的内容其实是不变的。
1 public static void main(String[] args) {
2 String s = "hello"; //将"hello"的地址赋值给了s
3 change(s);
4 System.out.println(s); //hello
5 }
6 //注意这里是无返回值,因为这里的测试是不能修改s的地址值
7 public static void change(String s) {
8 s += "java";
9 }
C:字符串的==和equals
1 //String s = new String("hello")和String s = "hello"的区别。
2 String s1 = new String("hello");
3 String s2 = new String("hello");
4 System.out.println(s1==s2); //false 每一个变量new出来的地址都不相同
5 System.out.println(s1.equals(s2));//true
6
7 String s3 = new String("hello");
8 String s4 = "hello";
9 System.out.println(s3==s4); //false
10 System.out.println(s3.equals(s4)); //true
11
12 String s5 = "hello";
13 String s6 = "hello";
14 System.out.println(s5==s6); //true
15 System.out.println(s5.equals(s6)); //true
16 /*
17 * String的equals的实现原理:
18 * 第一步:先判断这两个字符串的地址值是否相同(==实现)
19 * 相同:返回true
20 * 不同:
21 * 第二步:判断这两个字符串的长度是否相同
22 * 不同:返回false
23 * 相同:第三步:将字符串变为数组逐个进行比较
24 * 找到不同:立刻返回false
25 * 找到最后:返回true
26 */
(4)成员方法
A:判断功能
boolean equals(Object obj) //判断字符串是否相同,考虑大小写
boolean equalsIgnoreCase(String str)//判断字符串是否相同,不考虑大小写
boolean contains(String str) //判断字符串是否包含str
boolean startsWith(String str) //判断字符串是否以str开头
boolean endsWith(String str) //判断字符串是否以str结尾
boolean isEmpty() //判断字符串是否为空
B:获取功能
int length() //获取字符串的长度
char charAt(int index) //获取第index位置的字符
int indexOf(int ch) //获取字符串中第一次出现ch字符的索引
int indexOf(String str) //获取字符串中第一次出现str字符串的索引位置
int indexOf(int ch,int fromIndex) //从某个位置开始获取ch字符第一次出现的索引
int indexOf(String str,int fromIndex)//从某个位置开始获取str字符串第一次出现的索引
String substring(int start) //从某个位置开始截取字符串
String substring(int start,int end) //从某个位置开始到某个位置结束截取字符串
C:转换功能
byte[] getBytes() //将字符串转换为byte数组
char[] toCharArray() //将字符串转换为char数组
static String copyValueOf(char[] chs)//将字符数组转换成字符串
static String valueOf(char[] chs) //将字符数组转换成字符串
static String valueOf(int i) //将一个int数转换成字符串
String toLowerCase() //转小写
String toUpperCase() //转大写
String concat(String str) //拼接字符串
D:其他功能
a:替换功能
String replace(char oldChar,char newChar) //将newChar全部替换OldChar,如果OldChar不存在,原字符串直接赋值给替换后字符串
String replace(String oldString,String newString)
b:切割功能
String[] split(String regex) //通过regex切割字符串,切割后会产生一个字符串数组
c:去除两端空格功能
String trim()
d:字典顺序比较功能
int compareTo(String str) //如果str比str1大的话,返回的正数
字符串的比较原理:
第一步:将两个字符串转变为char数组
第二步:逐个比较char数组中的相同元素的大小
相同:继续比较其他元素
不同:返回 第一个数组比较元素的字符减去第二个数组中的同位置元素
注意:若较短的数组长度的最后一位已经比较完了,则返回第一个数组长度减去第二个数组的长度
int compareToIgnoreCase(String str) //忽略大小写比较
因为String变量的值是不可改变的,所以在频繁操作字符串的时候,就会产生极大的垃圾空间,影响程序的运行。而Java提供了可变的字符串缓冲区StringBuffer和StringBulid解决String带来的问题。
StringBuffer
(1)线程安全的可变字符序列,字符串可以发生改变的字符串类。字符串缓冲区类。
(2)构造方法:
A:StringBuffer() //构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。
B:StringBuffer(int capacity)//构造一个不带字符,但具有指定初始容量的字符串缓冲区。
C:StringBuffer(String str) //构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。
(3)成员方法:
A:添加功能
public StringBuffer append(anyType varName); //在缓冲区的末尾追加
StringBuffer insert(int index,String str); //在指定索引位置添加
B:删除功能
public StringBuffer delete(int start,int end); //从start开始删除到end结束,不包括end位置的字符
StringBuffer delete(0,sb.length); //清空缓冲区
public StringBuffer deleteCharAt(int index); //删除第index位置的字符
C:替换功能
public StringBuffer replace(int start,int end, String str);//替换字符串
void setCharAt(int index ,char); //修改,把指定索引位置的值改成传入的char值
D:截取功能
public String substring(int start); //从start位置开始截取字符串
E:反转功能
public StringBuffer reverse(); //反转字符串的所有字符
F:其他常用的功能
void setLength(int len); //根据传入的len值截取缓冲区的长度
toString() //转换成String
int indexOf(str); //查找str在缓冲区第一次出现的位置
int lastIndexOf(str); //从后向前查找查找str在缓冲区第一次出现的位置
StringBulider
StringBuilder与StringBuffer其实就像是孪生兄弟,使用的方式没有什么太大的区别。但是StringBuild实例不能安全使用多线程。 如果需要同步,那么就使用StringBuffer 。
StringBuilder和StringBuffer
StringBuilder和StringBuffer都是可变的字符序列,适用于需要经常对字符串修改的操作。两者的方法的使用是一样的,区别在于多线程的安全问题。
StringBuilder和StringBuffer与String的区别
StringBuilder和StringBuffeer是可变字符序列;String是不变得,一但被初始化,就不能改变
StringBuilder和StringBuffer的区别
StringBuilder是线程不安全的,所以效率比较高;StringBuffer是线程安全的,效率相对较低(可以解决多线程同步问题)