字符串一直是Java开发中最常用的技术之一,也是面试时需要重点复习的知识点,弄清楚字符串的工作原理是我们每个程序员的基本要求,接下来我们就来回顾一下字符串的相关内容
1.String 对象是不可变的
首先我们得明确,字符串不是8大基本数据类型之一。字符串String对象是不可变的,它是由final修饰的类,String类中每一个看似会修改值的方法,其实都是创建了一个新的String对象,而最初的String对象一直未变。若创建的字符串没有任何引用时,GC(垃圾回收器)将对它进行回收。
例如:
String str="abc";
String str="def";
该过程首先创建了字符串"abc",随后创建了字符串"def"。虽然此时的引用str指向"def",但字符串"abc"依旧存在于字符串常量池中,并没有改变。
2.字符串按值传递
之前在学习《Java核心技术Ⅰ》有幸学到了一点该方面的知识,java语言不同于C++语言,所用参数传递都是按值传递。
值传递:将参数的值进行传递,而自身不受影响
引用传递:将对象的引用进行传递,可以修改被引用对象的值
Java是按值传递的,字符串也是如此,
例如:
String str1="abc";
print(str1);
String str2=str1.toUpperCase();
print(str1);
当你前后两次打印str1的时候,会发现都是"abc",也验证按值传递。
3.String与StringBuffer、StringBuilder区别
String是不可变的字符串,而Stringbuffer(安全)和StringBuilder(不安全)可以改变字符串内容,以此可以减少由不可变字符串引起的内存压力,这是他们最主要的区别。
StringBuilder的常用方法,

除此之外,Java也对String进行了优化,对于使用 "+" 进行连接字符串,
String str = "ab"+"cd"+12;
编译器会自动调用StringBuilder对象中的append()来操作字符串。但这并不意味着我们就是用 "+" 来完成开发工作,当上述代码出现在循环里时,会产生多次创建StringBuilder的烦恼,此时直接创建对象会极大地提高效率。
4.String类的常用方法(一)
在之前很长一段时间里,我都认为对于一个类中的方法只要了解一下,在实际编程过程中遇到问题去查文档就好了!这个思想一直困扰了我很长时间,因为对方法的不熟悉,当遇到难题时解决思路会受到很大的限制,编程过程中就会产生磕磕绊绊的现象。所以说,对于一些常用的类,我们需要熟记其方法,这样才能做到游刃有余。接下来,我们就来回顾String类的常用方法。
- length(),这不用我多说吧,懂的人在评论区扣1,需要注意的是字符串里的空格也计算长度。
- charAt(),取得String中该索引位置的字符char。FBI友情提示,位置范围为0至length() - 1 。 该序列的第一个char值在索引0 ,下一个索引为1 ,依此类推,与数组索引一样。
- getChars(int srcBegin,int srcEnd,char[] dst, int dstBegin),该方法将此字符串中的字符复制到目标字符数组中。
- getBytes(),获得字符串的字节码数组,常用于序列化和反序列化过程中。
- toCharArray(),该方法将字符串转换为char[]数组。
- equals(),equalsIgnoreCase(),比较两个String的内容是否相同
- compareTo(),按照字典顺序比较两个字符串
- contains(),判断字符串中是否包含某字串
- startsWith(),endsWith(),判断字符串的开头和结尾
- indexOf(),lastIndexOf(),具体用法如下
public class test {
public static void main(String[] args) {
String str = "weimob weimob";
// 0,1,2,3,4,5, 6 ,7,8,9,10,11,12
System.out.println(str.length());
System.out.println(str.indexOf('o'));
System.out.println(str.indexOf('o',5));
System.out.println(str.indexOf('o',4));
System.out.println(str.indexOf("mob"));
System.out.println(str.indexOf("mob",4));
}
}
//结果(注意,所有的下标都是从0开始计算)
13
4
11
4
3
10
5.String类的常用方法(二)
-
subString(int start, int end),返回指定下标范围的字符子串,例子(注意范围):
"hamburger".substring(4, 8) returns "urge"
"smiles".substring(1, 5) returns "mile" - concat(String str),字符串的拼接。
- replace(char old,char new),将字符串中的字符替换,注意当字符old不存在时,原字符串不变,不会抛出异常。
- toUpperCase(),toLowerCase(),大小写变化
- trim(),去除点字符串前后端的空格
- valueOf(),输入不同的数据类型,返回其字符串格式。
- intern(),将字符串存放到字符串常量池中。
6.基于Formatter的格式化输出
使用方法
Formatter formatter = new Formatter([destination]);
formatter.format(String format, Object…args);
format格式如下,%[argument_index$][flags][width][.precision]conversion
根据不同的输出需要,可以选择不同的format格式,详情请参考
