字符串是常量,它们可以显示任何文本信息,字符串的值在创建之后不能更改。在Java中,单引号的内容表示字符,例如: ‘S’,而双引号的内容则表示字符串。例如: “我是小阿giao哈哈”。
String类
在不给字符串变量赋值的情况下,其默认值为null,如果此时调用String的方法,则会发生空指针异常。
三种实例化方式
String a = "时间就是金钱,我的朋友。"; // 直接引用字符串常量
System.out.println("a = " + a);
String b = new String("我爱清汤小肥羊"); // 利用构造方法实例化
String c = new String(b); // 利用已有字符串变量实例化
System.out.println("b = " + b);
System.out.println("c = " + c);
char[] d = {'t','i','m','e'};
String e = new String(d); // 利用字符数组实例化
System.out.println("e = " + e);
运行截图:
提取数组中的一部分创建字符串对象
char[] d = {'t','i','m','e'};
String f = new String(d,2,2); // 提取字符数组部分内容,从下标为2的元素开始,截取2个字符
System.out.println("f = " + f);
运行截图:
字符串的链接
链接字符串是比较简单的一种操作字符串的方式,可以连接任意多个字符串,也可以链接其他数据类型的变量或者常量。除了“+”运算符,"+="同样可以实现字符串的连接。
连接字符串
![](https://img-blog.csdnimg.cn/20210222224556264.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEwMTgzOQ==,size_16,color_FFFFFF,t_70)
连接其他数据类型
当它们与字符串相连时会自动调用toString()方法,将其转换成字符串,然后参与连接。
![](https://img-blog.csdnimg.cn/20210222225305257.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEwMTgzOQ==,size_16,color_FFFFFF,t_70)
提取字符串信息
字符串作为对象,可以通过相应的方法获取其有效信息。
获取字符串长度
长度是按1开始的,一般索引都是从0开始的。
![](https://img-blog.csdnimg.cn/20210222225928254.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEwMTgzOQ==,size_16,color_FFFFFF,t_70)
获取指定位置的字符
![](https://img-blog.csdnimg.cn/20210222230239587.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEwMTgzOQ==,size_16,color_FFFFFF,t_70)
获取字符串索引位置
![](https://img-blog.csdnimg.cn/20210222230516120.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEwMTgzOQ==,size_16,color_FFFFFF,t_70)
判断字符串首尾内容
startsWith()方法和endsWith()方法分别用于判断字符串是否以指定的内容开始或结束。
![](https://img-blog.csdnimg.cn/20210222231524935.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEwMTgzOQ==,size_16,color_FFFFFF,t_70)
获取字符数组
toCharArray()方法可以将字符串转换为一个字符数组。
![](https://img-blog.csdnimg.cn/20210222231950475.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEwMTgzOQ==,size_16,color_FFFFFF,t_70)
判断字符串是否存在
contains( )方法可以判断字符串是否包含指定内容。
![](https://img-blog.csdnimg.cn/2021022223215920.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEwMTgzOQ==,size_16,color_FFFFFF,t_70)
字符串的操作
截取字符串
substring()方法返回一个新字符串,他是此字符串的一个子字符串。从子字符串指定的begin处字符开始,直到所有end-1处的字符串。
![](https://img-blog.csdnimg.cn/20210222233252308.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEwMTgzOQ==,size_16,color_FFFFFF,t_70)
字符串替换
replace()方法可以实现指定字符序列替换新的字符序列。
![](https://img-blog.csdnimg.cn/20210222233618922.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEwMTgzOQ==,size_16,color_FFFFFF,t_70)
字符串分割
split()方法可根据给定的分隔符对字符串进行拆分。
![](https://img-blog.csdnimg.cn/20210222235242146.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEwMTgzOQ==,size_16,color_FFFFFF,t_70)
大小写转换
toUpperCase:按大写输入
toLowerCase:按小写输入
![](https://img-blog.csdnimg.cn/20210222235529953.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEwMTgzOQ==,size_16,color_FFFFFF,t_70)
去除空白内容
trim()方法去掉字符串首尾处的空白内容。
![](https://img-blog.csdnimg.cn/20210222235941555.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEwMTgzOQ==,size_16,color_FFFFFF,t_70)
比较字符串是否相等
比较字符串对象的内容是否相同,就需要用equals()方法。并且进行比较的字符串不为null,内容相同返回true。
切记比较时候前者不允许为null,否则直接报错,后者可以为null。
![](https://img-blog.csdnimg.cn/20210223002619667.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEwMTgzOQ==,size_16,color_FFFFFF,t_70)
注意:以下示例经常面试的时候笔试经常出现!
![](https://img-blog.csdnimg.cn/20210223003609512.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEwMTgzOQ==,size_16,color_FFFFFF,t_70)
String str = null;和String str = “”;是两个不同的概念。前者是空对象,没有指向任何引用地址,调用string相关方法都会报空指针,""是一个字符串,分配了内存空间,可以调用String相关方法,只是没有显示而已。
可变字符串StringBuffer类
StringBuffer类是线程安全的可变字符序列,一个类似于String类的字符串缓冲区,两者本质上是一样的,但StringBuffer比String效率快很多。
创建StringBuffer类
创建StringBuffer对象必须用关键字new,而不能像String对象那样直接引用字符串常量。
StringBuffer a = new StringBuffer(); // 创建一个对象,无初始值
StringBuffer b = new StringBuffer("abc"); // 创建一个对象,初始值为abc
StringBuffer c = new StringBuffer(32); // 创建一个对象,初始容量为32
append()方法
append()方法可将任意数据类型的对象转换成字符串,然后追加到此序列中。
![](https://img-blog.csdnimg.cn/2021022300510347.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEwMTgzOQ==,size_16,color_FFFFFF,t_70)
setCharAt(int index,char ch)方法
指定索引位置修改字符。
![](https://img-blog.csdnimg.cn/20210223005357639.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEwMTgzOQ==,size_16,color_FFFFFF,t_70)
insert(int offset,String str)方法
指定索引位置添加字符。
![](https://img-blog.csdnimg.cn/20210223005441671.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEwMTgzOQ==,size_16,color_FFFFFF,t_70)
delete(int start,int end)方法
delete()方法可移除字符串中的字符,从指定索引start开始,一直到索引end-1处。
![](https://img-blog.csdnimg.cn/20210223005627737.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEwMTgzOQ==,size_16,color_FFFFFF,t_70)
其他方法
![](https://img-blog.csdnimg.cn/20210223010051415.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjEwMTgzOQ==,size_16,color_FFFFFF,t_70)
难点解答
字符串与String类
字符串是常量,这句话说得是双引号之内的文字内容是常量,单String声明的变量则是String的对象,也就是说在如下代码中:
String s = "123";
"123"才是真正的常量,而s只是保存字符串内容的变量,s有着所有类对象共有的特点。
StringBuffer与String不同之处
String只能赋值一次,每一次内容发生改变都生成了一个新的对象,然后原有的对象引用新的对象,所以说String本身是不可改变的。每一次改变String字符串内容都是创建新的对象。每次新生成对象会降低虚拟机的工作效率。
而StringBuffer不同,每次都是操作自身对象,而不是新生成对象,其所占用空间会随着字符内容增加而扩充,做大量修改的操作时候,不会因生成大量匿名对象而影响系统性能。