JavaAPI-String和StringBuffer
目录
一、String的概述
二、String的特点
三、面试题
四、String和StringBuffer的拼接性能测试
五、String常用的方法
六、字符串和数组中哪个是length属性,哪个是length方法
七、StringBuffer的常用方法
八、StringBuilder
一、String的概述
1.String是一个类,可以new对象
String str = new String("HelloWorld");
System.out.println(str);//HelloWorld
二、String的特点
1.不变性
2.不变性代表的是在String的变量中会存储的一个值,这个值的本身是不会变的
String s1 = "a"; // 不变性代表 s1指向的地址是会改变的,但是a是不会变的
三、面试题
1.直接赋值,下面的结果为true还false
String s1 = "abc";
String s2 = "abc";
System.out.println(s1.equals(s2)); // true
System.out.println(s1 == s2); // true 因为s1和s2是指向相同的地址,所以这里的几个为true
2.new对象,下面的结果为true还false
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2); // false 因为==比较的是地址,而s1和s2是new了两个对象,地址是不同的,所以为false
System.out.println(s1.equals(s2)); // true equals比较的是内容,s1和s2的内容相同,所以为true
3.相加,下面的结果是true和false
String s1 = "a";
String s2 = "b";
System.out.println(s1 + s2 == "ab"); // false ==右边的ab会直接存放到常量池中,而左边会在运行期的时候用一个a的副本在加上b得到另一个ab,此时常量池中会有两个ab,这两个ab的地址是不同的,所以为false
final String s3 = "a";
String s4 = "b";
System.out.println(s3 + s4 == "ab"); // false
final String s5 = "a";
final String s6 = "b";
System.out.println(s5 + s6 == "ab"); // true 用final修饰变量,变量会变为常量,常量的值是不能更改的,所以s5和s6相加的值在编译期的时候就可以直接确定下来然后放在常量池中,这时候常量池中就只会有一个ab,比较的时候就会为true
4.总结
(1)== 比较的是对象的地址
(2)equals比较的是对象的内容(仅限于String中)
(3)String 在编译期如果能确定,那么就在常量池中直接操作
四、String和StringBuffer的拼接性能测试
1.获取当前系统的毫秒数:System.currentTimeMillis()
2.String
String s = "";
long start = System.currentTimeMillis();
for(int i = 0;i < 100000;i++){// 拼接了十万次字符串s += i;
}
long end = System.currentTimeMillis();
System.out.println(end - start); // 24771 24秒 1秒=1000毫秒
3.StringBuffer
StringBuffer sb = new StringBuffer();
long start = System.currentTimeMillis();
for(int i = 0;i < 50000000;i++){// 拼接了五千万次字符串sb.append(i);
}
long end = System.currentTimeMillis();
System.out.println(end - start); // 1553 1.5秒 1秒=1000毫秒
五、String常用的方法
1.compareTo():比较字符串的大小(返回的是ASCII差值,如果相同返回长度差)
String s1 = "abcdefg.TXT";
System.out.println(s1.compareTo("abc"));
2.equals():比较字符中的内容是否相同
String s1 = "abcdefg.TXT";
System.out.println(s1.equals("abc"));
3.charAt():返回的是对应索引所在的字符
String s1 = "abcdefg.TXT";
System.out.println(s1.charAt(3));
4.indexOf():返回字符所在位置的索引,如果没有找到,则返回-1
String s1 = "abcdefg.TXT";
System.out.println(s1.indexOf(99)); // 2
System.out.println(s1.indexOf("de")); // 3
System.out.println(s1.indexOf("dd")); // -1
System.out.println(s1.indexOf("c",5)); // -1
5.valueOf():将其他类型转换为String类型
(1)valueOf是静态方法,通过类名直接调用
String.valueOf(123);
6.substring():截取字符串
(1)左闭右开
String s1 = "abcdefg.TXT";
System.out.println(s1.substring(2,4)); // cd
7.replace():替换字符串
String s1 = "abcdefg.TXT";
System.out.println(s1.replace("c","ccc"));
8.endsWith():判断是不是以XXX结尾,返回值为boolean类型
String s1 = "abcdefg.TXT";
System.out.println(s1.endsWith(".TXT")); // true
9.startsWith():判断是不是以XXX开头,返回值为boolean类型
String s1 = "abcdefg.TXT";
System.out.println(s1.startsWith("abb")); // false
10.toUpperCase():将字符串全部转换为大写
String s1 = "abcdefg.TXT";
System.out.println(s1.toUpperCase());
11.toLowerCase():将字符串全部转换为小写
String s1 = "abcdefg.TXT";
System.out.println(s1.toLowerCase());
12.length():获取字符串的长度
String s1 = "abcdefg.TXT";
System.out.println(s1.length());
13.注意:String中的操作都不会改变原字符串
六、字符串和数组中哪个是length属性,哪个是length方法
1.字符串中的是length方法,数组中的是length属性
七、StringBuffer的常用方法
1.length():获取长度
StringBuffer sb = new StringBuffer("abc");
System.out.println(sb.length());
2.capacity():容量
(1)容量只会在初始化或者是不够的情况下才会改变
StringBuffer sb = new StringBuffer("abc");
System.out.println(sb.capacity()); // 容量默认为16 +3为19
// 容量在超出后会增加
System.out.println(sb.append("1234567890aaabbbn"));
System.out.println(sb.length());
System.out.println(sb.capacity()); // 40
sb.append("1234567890aaabbbcccddd");
System.out.println(sb.length());
System.out.println(sb.capacity()); // 82
// 容量的增加规则为:(容量 + 1)* 2
3.trimToSize():将容量调整为长度的大小
StringBuffer sb = new StringBuffer("abc");
sb.trimToSize();
System.out.println(sb.length()); // 3
System.out.println(sb.capacity()); // 3
4.delete():删除固定的某一段字符
StringBuffer sb = new StringBuffer("abcdefg");
sb.delete(2,4);
System.out.println(sb);
5.append():拼接字符
StringBuffer sb = new StringBuffer("abcdefg");
sb.append(3,"bb");
System.out.println(sb);
6.insert():插入字符
StringBuffer sb = new StringBuffer("abcdefg");
sb.insert(3,"bb");
System.out.println(sb);
7.reverse():反转
StringBuffer sb = new StringBuffer("abcdefg");
sb.reverse();
System.out.println(sb);
8.setCharAt():改变指定位置的字符
StringBuffer sb = new StringBuffer("abcdefg");
sb.setCharAt(3,'g');
System.out.println(sb);
9.注意:StringBuffer中的操作会改变原字符串
10.StringBuffer中的方法有一些是和String中的方法是一样的
八、StringBuilder
1.StringBuffer和StringBuilder的区别
(1)StringBuffer中的方法比StringBuilder中的方法多了一个关键字:synchronized
- synchronized:同步
- 同步代表更安全了,但是效率就变低了
(2)所以说,StringBuffer要比StringBuilder安全;但是性能要比StringBuilder低
(3)而StringBuilder要比StringBuffer性能高;但是安全性就相对会下降一些
(4)StringBuilder中的方法基本上和StringBuffer是一样的