一、String的API
1.返回指定索引处的 char 值.
String stu="abcde123abv356";
char c = stu.charAt(1);
System.out.println(c);
返回的值为b。
2.将指定字符串连接到此字符串的结尾。
String st="abcde123abv356";
String we = st.concat("wwwwwww");
System.out.println(we);
System.out.println(st == we);
拼接之后会形成新的字符串,第二句输出的是false。
String st="abcde123abv356";
String we = st.concat("");
System.out.println(we);
System.out.println(st == we);
拼接一个空串,我们想的肯定是we也是一个新串,但是由于字符串存储在常量池,当we拼接完之后,会先去常量池查找,有没有与之相同的串,答案是有,所有不会在创建新的串,第二个语句输出true。
3.当且仅当此字符串包含指定的 char 值序列时,返回 true。
String s="abcde123abv356";
boolean abc = s.contains("123ab");
System.out.println(abc);
返回的是true。
4.测试此字符串是否以指定的后缀结束。
String std="abcde123abv356";
boolean b = std.endsWith("56");
System.out.println(b);
返回的是true。但是如果是空串呢?
String std="abcde123abv356";
boolean b = std.endsWith("");
System.out.println(b);
返回的也是true。
5.返回指定字符在此字符串中第一次出现处的索引。
String stdd="abcde123abv356";
int de = stdd.indexOf("de");
System.out.println(de);
返回的是3。
6.返回指定字符在此字符串中最后一次出现处的索引。
String stdd="abcde123abv356";
int ab = stdd.lastIndexOf("ab");
System.out.println(ab);
返回的是8
7.替换目标字符串
String stdd="abcde123abv356";
String replace = stdd.replace("356", "888");
System.out.println(replace);
返回的是abcde123abv888
8.分隔
String a="babcbd";
String[] as = a.split("b");
返回的是一个数组。
9.截取
String ss="123ab123";
String substring = ss.substring(1,3);
System.out.println(substring);
截取时包含起始处的索引,不包含结束处的索引。返回的是23
10.去前后空格
String ss=" 123ab123 ";
String trim = ss.trim();
11.字符串转字符
String stu="abcde123abv356";
char[] chars = stu.toCharArray();
12.字符串转小写
String stu="abcde123abv356ASD";
String s1 = stu.toLowerCase();
13.字符串转大写
String stu="abcde123abv356ASD";
String s2 = stu.toUpperCase();
14 如果参数字符串等于此字符串,则返回值 0;如果此字符串按字典顺序小于字符串参数,则返回一个小于 0 的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于 0 的值。
String stu="abcde123abv356";
int abc1 = stu.compareTo("abcde123abv35");
System.out.println(abc1);
二.区别
(1)String是字符串常量,一旦创建之后不可更改;StringBuffer和StringBuilder是字符串变量,可以更改。String的不可变,所以适合作为Map的键。
(2)StringBuilder 是线程不安全的,StringBuffer是线程安全的,使用了Synchronized关键字,即线程锁。
(3)字符串拼接时的效率:StringBuilder > StringBuffer > String。
(4)如果操作少量的数据用 String,单线程下操作大量数据用StringBuilder,多线程下操作大量数据用StringBuffer。
三.笔试题
String st="abc";
String str="abc";
System.out.println(st==str);
System.out.println(st.equals(str));
两个返回的都是true
注:==比较在内存中的地址是否相等,equals()比较的是两个字符串的内容是否相同。
String st="ab";
String str="abc";
System.out.println(st==str);
System.out.println(st.equals(str));
两个返回的都是false
String st="ab";
String str=new String("ab");
System.out.println(st==str);
System.out.println(st.equals(str));
第一个返回的是false,第二个返回的是true。
String st=new String("ab");
String str=new String("ab");
System.out.println(st==str);
System.out.println(st.equals(str));
2.String是不可变的有什么好处?
由于String是不可变类,所以在多线程中使用是安全的,我们不需要做任何其他同步操作。
String是不可变的,它的值也不能被改变,所以用来存储数据密码很安全。
因为java字符串是不可变的,可以在java运行时节省大量java堆空间。因为不同的字符串变量可以引用池中的相同的字符串。如果字符串是可变得话,任何一个变量的值改变,就会反射到其他变量,那字符串池也就没有任何意义了。
由于字符串的不可变性,所以字符串可以作为集合中的键。因为字符串是不可变的,当创建字符串时,它的它的hashcode被缓存下来,不需要再次计算。因为HashMap内部实现是通过key的hashcode来确定value的存储位置,所以相比于其他对象更快。这也是为什么我们平时都使用String作为HashMap对象。
3.String s = new String("xyz");创建了几个String Object?并作说明。
共产生了两个2个对象,第一个是字符串常量xyz,存储于常量池中。第二个对象是new String()时产生的,存储于堆中。
4、下面的代码将创建几个字符串对象。
String s1 = new String("Hello");
String s2 = new String("Hello");
答案是3个对象.
第一,行1 字符串池中的“hello”对象。
第二,行1,在堆内存中带有值“hello”的新字符串。
第三,行2,在堆内存中带有“hello”的新字符串。这里“hello”字符串池中的字符串被重用。
3、写一个方法来判断一个String是否是回文(顺读和倒读都一样的词)?
回文就是正反都一样的词,如果需要判断是否是回文,只需要比较正反是否相等即可。String类并没有提供反转方法供我们使用,但StringBuffer和StringBuilder有reverse方法。
private static boolean isPalindrome(String str) {
if (str == null)
return false;
StringBuilder strBuilder = new StringBuilder(str);
strBuilder.reverse();
return strBuilder.toString().equals(str);
}
假设面试官让你不使用任何其他类来实现的话,我们只需要首尾一一对比就知道是不是回文了。
private static boolean isPalindromeString(String str) {
if (str == null)
return false;
int length = str.length();
System.out.println(length / 2);
for (int i = 0; i < length / 2; i++) {
if (str.charAt(i) != str.charAt(length - i - 1))
return false;
}
return true;
}
4.对字符串中的字符进行自然排序。
public static String sort(String abc){
char[] chars = abc.toCharArray();
Arrays.sort(chars);
String str=Arrays.toString(chars);
return str;
}
5.将字符串abcdefg反转为afedcbg
public static void trun(String abc,String cba){
//截取
String substring = abc.substring(1, 6);
//利用StringBuilder进行翻转
StringBuilder stringBuilder = new StringBuilder(substring);
String str = stringBuilder.reverse().toString();
//将翻转之后的字符串替换之前的
StringBuilder sb = new StringBuilder(abc);
StringBuilder replace = sb.replace(1, 6, str);
}
欢迎识别下方二维码,关注小编微信公众号,可以获取跟多Java资料: