前言:
作者简介:我是阿柽,一名热爱技术的在校学生。
系列专栏:JAVA专栏
如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步
如果感觉博主的文章还不错的话,点赞 + 关注 + 收藏
目录
一、String类的常用方法
1、String类概述
2、String创建对象
3、String类的常用方法
4、String的注意事项
二、StringBuilder、StringBuffer
三、StringJoiner
总结
我们学习String这个类,也就是学对字符串进行处理。为什么要学习字符串处理呢?因为在开发中对于字符串的处理还是非常常见的。
比如:在用户登录时,用户输入的用户名和密码送到后台,需要和正确的用户名和密码进行校验,这就需要用到String类提供的比较功能。
再比如:同学们在直播留言时,有些小伙伴可能不太文明说了一些脏话,后台检测到你输入的是脏话,就会用`***`把脏话屏蔽掉。这也需要用到String类提供的替换功能。
Java为了方便我们处理字符串,所以给我们提供了一个String类来代表字符串,这个类就是java.lang
包下。
按照面向对象的编程思想,对于字符串的操作,只需要创建字符串对象,用字符串对象封装字符串数据,然后调用String类的方法就可以了。
接下来我们打开String类的API,看一下String类的对象如何创建。如下图所示
意思就是:所有Java的字符串字面值,都是字符串对象。
所以创建String对象的第一种方式就有了
String s1 = "abc"; //这里"abc"就是一个字符串对象,用s1变量接收
String s2 = "哈喽,java"; //这里的“黑马程序员”也是一个字符串对象,用s2变量接收
创建String对象还有第二种方式,就是利用String类的构造方法创建String类的对象。
执行构造方法需要用到new关键字。`new String(参数)`就是在执行String类的构造方法。
下面我们演示通过String类的构造方法,创建String类的对象
// 1、直接双引号得到字符串对象,封装字符串数据
String name = "JAVA666";
System.out.println(name);
// 2、new String创建字符串对象,并调用构造器初始化字符串
String rs1 = new String();
System.out.println(rs1); // ""
String rs2 = new String("itheima");
System.out.println(rs2);
char[] chars = {'a', 'b', 'c'};
String rs3 = new String(chars);
System.out.println(rs3);
byte[] bytes = {97, 98, 99};
String rs4 = new String(bytes);
System.out.println(rs4);
API真正的作用是来解决业务需求的,如果不解决业务需求,只是记API是很难记住的。
所以API的正确打开方式是,先找到这个类,把这个类中的方法先用代码快速过一遍,有一个大概印象就行。然后再具体的案例中,选择你需要的方法来用就行。
public class StringDemo {
public static void main(String[] args) {
//目标:快速熟悉String提供的处理字符串的常用方法。
String s = "Java";
// 1、获取字符串的长度
System.out.println(s.length());
// 2、提取字符串中某个索引位置处的字符
char c = s.charAt(1);
System.out.println(c);
// 字符串的遍历
for (int i = 0; i < s.length(); i++) {
// i = 0 1 2 3 4 5
char ch = s.charAt(i);
System.out.println(ch);
}
System.out.println("-------------------");
// 3、把字符串转换成字符数组,再进行遍历
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
System.out.println(chars[i]);
}
// 4、判断字符串内容,内容一样就返回true
String s1 = new String("哈喽");
String s2 = new String("哈喽");
System.out.println(s1 == s2); // false
System.out.println(s1.equals(s2)); // true
// 5、忽略大小写比较字符串内容
String c1 = "34AeFG";
String c2 = "34aEfg";
System.out.println(c1.equals(c2)); // false
System.out.println(c1.equalsIgnoreCase(c2)); // true
// 6、截取字符串内容 (包前不包后的)
String s3 = "Java是最好的编程语言之一";
String rs = s3.substring(0, 8);
System.out.println(rs);
// 7、从当前索引位置一直截取到字符串的末尾
String rs2 = s3.substring(5);
System.out.println(rs2);
// 8、把字符串中的某个内容替换成新内容,并返回新的字符串对象给我们
String info = "这个电影简直是个垃圾,垃圾电影!!";
String rs3 = info.replace("垃圾", "**");
System.out.println(rs3);
// 9、判断字符串中是否包含某个关键字
String info2 = "Java是最好的编程语言之一,我爱Java,Java不爱我!";
System.out.println(info2.contains("Java"));
System.out.println(info2.contains("java"));
System.out.println(info2.contains("Java2"));
// 10、判断字符串是否以某个字符串开头。
String rs4 = "张三丰";
System.out.println(rs4.startsWith("张"));
System.out.println(rs4.startsWith("张三"));
System.out.println(rs4.startsWith("张三2"));
// 11、把字符串按照某个指定内容分割成多个字符串,放到一个字符串数组中返回给我们
String rs5 = "张无忌,周芷若,殷素素,赵敏";
String[] names = rs5.split(",");
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}
}
}
我们学习了字符串的一些常用方法,在实际工作中用这些方法解决字符串的常见问题是完全足够的,但是在面试时可能会问一些原理性的东西。
**注意事项1:String类的对象是不可变的对象**
我们先看一段代码,分析这段代码的结果
public static void main(String[] args) {
String name = "哈喽";
name += "世界";
name += "爱你";
System.out.println(name);
}
以上代码中,先定义了一个String变量 name第一次赋值为`“哈喽”;` 然后对`name`变量记录的字符串进行两次拼接,第一次拼接`“世界”`,第二次拼接`“爱你”`;我们发现得到的结果是:`哈喽世界爱你`
这里问题就来了,你不是是说:**String类的对象是不可变的字符串对象吗?
下面我们就解释一下,String是不可变对象到底是什么含义。
需要注意的是:只要是以“”
方式写出的字符串对象,会在堆内存中的字符串常量池中存储。
执行第一句话时,会在堆内存的常量池中,创建一个字符串对象“哈喽”
,然后把“哈喽”
的地址赋值给String name
**注意事项2:字符串字面量和new出来字符串的区别**
(1)只要是以`“...”`方式写出的字符串对象,会存储到字符串常量池,且相同内容的字符串只存储一份。如下图所示
(2)但通过`new`方式创建字符串对象,每new一次都会产生一个新的对象放在堆内存中。如下图所示
总结一下,字符串的注意事项。
1. String是不可变字符串对象
2. 只要是以“...”方式写出的字符串对象,会存储到字符串常量池,且相同内容的字符串只存储一份;
3. 但通过new方式创建字符串对象,每new一次都会产生一个新的对象放在堆内存中。
StringBuilder代表可变字符串对象,相当于是一个容器,它里面的字符串是可以改变的,就是用来操作字符串的。
好处:StringBuilder比String更合适做字符串的修改操作,效率更高,代码也更加简洁。
接下来我们用代码演示一下StringBuilder的用法
public class Test{
public static void main(String[] args){
StringBuilder sb = new StringBuilder("itehima");
//1.拼接内容
sb.append(12);
sb.append("哈喽");
sb.append(true);
//2.append方法,支持临时编程
sb.append(666).append("哈喽2").append(666);
System.out.println(sb); //打印:12哈喽666哈喽2666
//3.反转操作
sb.reverse();
System.out.println(sb); //打印:6662喽哈666喽哈21
//4.返回字符串的长度
System.out.println(sb.length());
//5.StringBuilder还可以转换为字符串
String s = sb.toString();
System.out.println(s); //打印:6662喽哈666喽哈21
}
}
为啥操作字符串建议使用StringBuilder,而不用原来学过的String?
对于字符串相关的操作,如频繁的拼接、修改等,建议用StringBuidler,效率更高!
注意:如果操作字符串较少,或者不需要操作,以及定义字符串变量,还是建议用String。
StringBuffer与StringBuilder
注意:StringBuffer的用法与StringBuilder是一模一样的但 StringBuilder是线程不安全的 StringBuffer是线程安全的
接下来,我们学习一个类叫做StringJoiner,学习这个类干嘛用呢?是因为我们前面使用StringBuilder拼接字符串的时,代码写起来还是有一点麻烦,而StringJoiner号称是拼接神器,不仅效率高,而且代码简洁。
JDK8开始才有的,跟StringBuilder一样,也是用来操作字符串的,也可以看成是一个容器,创建之后里面的内容是可变的
好处:不仅能提高字符串的操作效率,并且在有些场景下使用它操作字符串,代码会更简洁
下面演示一下StringJoiner的基本使用
public class Test{
public static void main(String[] args){
StringJoiner s = new StringJoiner(",");
s.add("java1");
s.add("java2");
s.add("java3");
System.out.println(s); //结果为: java1,java2,java3
//参数1:间隔符
//参数2:开头
//参数3:结尾
StringJoiner s1 = new StringJoiner(",","[","]");
s1.add("java1");
s1.add("java2");
s1.add("java3");
System.out.println(s1); //结果为: [java1,java2,java3]
}
以上就是今天要分享的内容,本文仅仅详细介绍了String类常用API的使用。