目录
1.5.1replaceAll(String regex, String replacement)
1.5.2replaceFirst(String regex, String replacement)
2.StringBuilder 和 StringBuffer
在JAVA中String是字符串类,String是相当的重要的
String有很多构造方法,我们简单介绍一些:
- public class Main {
- public static void main(String[] args) {
- String str = "abcdef";
- System.out.println(str);
- }
- }
- public class Main {
- public static void main(String[] args) {
- String str = new String("abcdef");
- System.out.println(str);
- }
- }
- public class Main {
- public static void main(String[] args) {
- char[] arr = new char[]{'a', 'b', 'c', 'd', 'e', 'f'};
- String str = new String(arr);
- System.out.println(str);
- }
- }
这里需要注意,我们是给构造方法传了一个字符数组,然后String类帮我们把数组构造成字符串
通过源码,我们可以看到,String构造方法是把字符数组拷贝了一份 给到str的value里面

再去看看String中的字段,可以发现String中的value其实还是一个char类型的数组
注意:其实我们上面的第一种写法是第二种的简化,并没有孰优孰劣
我们都知道,String类是引用变量,是无法进行比较内容的,所以我们String类中重写了Object中的equals方法,进行字符串比较
先看如果是用== 进行比较的结果

这里我们用两个内容相同的字符串用等号比较,但是结果却不是我们预期的那样,因为这个其实是在比较地址,两个字符串,创建了两个对象,所指向的地址当然不同了,所以结果是false
但是我们如果用equals方法来比较的话,再看结果

可以看到,这个结果是我们想要得到的,为什么呢?其实我们前面提过,因为String类重写了equals方法,我们可以去源码里面看一眼
可以看到,在String中重写了equals方法
在JAVA中,还提供了一些字符串的查找函数,我这里就不一一演示,调几个比较重要的演示一下,感兴趣的可以去试一下
charAt在我们的刷题和工作中都是特别常用的方法,非常重要
这个方法的作用是获取到字符串的第n个字符,因为我们前面看到java的String内部value其实是一个数组,所以下标也是从0开始的,看下面的代码
- public class Main {
- public static void main(String[] args) {
- String str1 = new String();
- str1 += "abcdef";
- String str2 = new String();
- str2 += "abcdef";
- System.out.println(str1.charAt(0));
- System.out.println(str1.charAt(1));
- System.out.println(str1.charAt(2));
- }
- }

这里可以看到我们得到的结果就是字符串对应的下标
indexOf()方法其实是有重载方法的 :
1.indexOf(char ch)这个是去寻找字符串中ch第一次出现的位置,如果没有就返回-1,这个是从头开始的
- public class Main {
- public static void main(String[] args) {
- String str1 = new String();
- str1 += "abcdef";
- String str2 = new String();
- str2 += "abcdef";
- System.out.println(str1.indexOf('c'));
- }
- }

我们可以看到,c确实是在2号位置
这里有个有意思的事情,就是我们虽然传的是字符类型,但是我们看源码
可以发现,这里是用int类型来接收的,从而也就证明了我们刚开始学C的时候的一句话:字符类型也属于整形家族
2.indexOf(char ch,int fromIndex)
这个重载是从fromIndex下标开始找ch第一次出现的位置
- public class Main {
- public static void main(String[] args) {
- String str1 = new String();
- str1 += "abcdefc";
- System.out.println(str1.indexOf('c',5));
- }
- }

可以看到,我们的c出现了两次,分别是2号位和6号位,但是我们使用这个重载方法要求从5号位开始找,所以得到的结果是6
3. indexOf(String s)
这个就有意思了,我们这个方法不仅能够找字符,还能找字符串,所以,是很方便的方法,使用方法和上面一样
- public class Main {
- public static void main(String[] args) {
- String str1 = new String();
- str1 += "abcdefc";
- System.out.println(str1.indexOf("def"));
- }
- }

这个代码返回的值就是3,很好理解把
4.indexOf(String s,int fromIndex)
这个和上面的类似,就不再演示了
1.3.lastIndexOf()方法
lastIndexOf方法和上面的其实是一样的,只不过是从后面开始找,找到那个符合条件的位置
我们这里直接演示四种重载方法
注意:这里后面的int类型的数据是从后往前第几个开始
- public class Main {
- public static void main(String[] args) {
- String str1 = new String();
- str1 += "abcdefbc";
- System.out.println(str1.lastIndexOf('c'));
- System.out.println(str1.lastIndexOf('c',5));
- System.out.println(str1.lastIndexOf("bc"));
- System.out.println(str1.lastIndexOf("bc",5));
- }
- }

字符串转数值是通过就是把字符串转换成int,double等数值类型
常用的方法是parse**具体看代码
-
- public class Main {
- public static void main(String[] args) {
- String str1 = new String();
- str1 += "123";
- System.out.println((Integer.parseInt(str1) + 1));
- System.out.println((Double.parseDouble(str1) + 1));
- }
- }

我们可以看到,这里的字符串转成数值类型之后是可以计算的
数值也可以反过来转成字符串,通常使用String中的静态方法valuOf(),具体看代码实现
- public class Main {
- public static void main(String[] args) {
- String str1 = new String();
- str1 = "hello";
- str1 += String.valueOf(123);
- System.out.println(str1);
- }
- }
这里就是把value中的数值转成了字符串,运行结果是

不仅如此,还可以把自定义的对象变成字符串类型的
- class Student{
- public int age;
- public Student(int age){
- this.age = age;
- }
- }
-
- public class Main {
- public static void main(String[] args) {
- String str1 = new String();
- Student student = new Student(10);
- str1 += String.valueOf(student);
- System.out.println(str1);
- }
- }

你肯定会说,这有啥用啊,啥有用的数据都没有,但是别急,如果我们给自定义的对象添加一个toString方法之后会怎么样呢?
- /**
- *
- */
-
- class Student{
- public int age;
- public Student(int age){
- this.age = age;
- }
-
- @Override
- public String toString() {
- return "Student{" +
- "age=" + age +
- '}';
- }
- }
-
- public class Main {
- public static void main(String[] args) {
- String str1 = new String();
- Student student = new Student(10);
- str1 += String.valueOf(student);
- System.out.println(str1);
- }
- }

可以看到,数据变得有用了,我们可以通过toString来设置自己想要的输出
在java中字符串的替换也封装成了方法
这个方法是把字符串中的没一个regex都替换成replacement,具体看代码实现
- public class Main {
- public static void main(String[] args) {
- String str1 = new String();
- str1 = "abcdecccc";
- System.out.println(str1.replaceAll("c","z"));
- }
- }

我们可以看到运行结果中的c全部变成了z,这里需要注意,替换是重新开了一个字符串来替换,并不是替换原来的字符串中的内容
这个方法是把字符串中第一次出现的regex给替换成replaceme,具体看代码实现
- public class Main {
- public static void main(String[] args) {
- String str1 = new String();
- str1 = "abcdecccc";
- System.out.println(str1.replaceFirst("c","z"));
- }
- }

可以看到,这里只有第一个c被替换成z了,其他的都没用替换
不仅如此,我们传入的参数还可以是字符串,可以进行字符串的替换,具体看代码实现
- public class Main {
- public static void main(String[] args) {
- String str1 = new String();
- str1 = "abcdecccc";
- System.out.println(str1.replaceAll("abc","c"));
- }
- }

可以看到这里的abc都被替换成了 c
在Java中,有字符串拆分方法,即把字符串按照某个字符进行拆分,使用的是split方法具体看代码实现
- public class Main {
- public static void main(String[] args) {
- String str1 = new String();
- str1 = "ab c de cc cc";
- System.out.println(Arrays.toString(str1.split(" ")));
- }
- }
注意,这里返回的是一个字符串数组,我们想要打印数组中的内容,需要用Arrays的toString方法或者使用循环或迭代器
这个方法还可以在后面再传一个数值参数,表示最多分成几组,具体看代码实现
- public class Main {
- public static void main(String[] args) {
- String str1 = new String();
- str1 = "ab c de cc cc";
- System.out.println(Arrays.toString(str1.split(" ",3)));
- }
- }

我们可以通过','看出了,数组中存了三个数值,分别是ab,c,de cc cc,正好三组
注意:这里的拆分涉及到转义字符
在JAVA中提供了字符串截取方法substring 注意这里的sub和string都是小写字母开头的,这个方法是把传进来一个数值,从数值位截取到结尾,或者另一个数值位,具体看代码实现
- public class Main {
- public static void main(String[] args) {
- String str1 = new String();
- str1 = "abcdefghijklmn";
- System.out.println(str1.substring(5));
- System.out.println(str1.substring(5,10));
-
- }
- }

可以看到,当我们输入两个数值的时候,他就会从第一个数值截取到第二个数值位置
注意:这里的10是不会截取的,因为Java中大多数都是左闭右开区间的
在java中是可以对字符串进行修建的,比如我们一个字符串,前面有很多空格,后面也有很多空格,我们就可以用trim()方法对其进行修剪,具体看代码实现
- public class Main {
- public static void main(String[] args) {
- String str1 = new String();
- str1 = " abcdefghijklmn ";
- System.out.println("未修剪" + str1);
- System.out.println("修剪后 " + str1.trim());
-
- }
- }

这个方法也是一个特别常用的方法,我们使用一些方法对其进行修改
大写转小写是:toLowerCase()
小写转大写是:toUpperCase()
具体看代码实现
- public class Main {
- public static void main(String[] args) {
- String str1 = "123456abcdefghijklmn";
- String str2 = "123456ABCDEFascasc";
- System.out.println(str1.toUpperCase());
- System.out.println(str2.toLowerCase());
-
- }
- }

可见这个方法只会对字母进行处理,不会处理其他类型的字符
所以当我们用复制创建字符串的时候,对其进行比较,会发现结果是true,因为他俩引用的是同一块地址
我们来看一个图

这个图里面详细的解释了字符串的常量池
inter方法是我们主动将一些字符串添加到常量池中,这个是人为的添加进去,具体用法如下
这里没办法去验证,所以我们只是实现一下就好了
- public class Main {
- public static void main(String[] args) {
- String str = new String();
- str += "123456";
- str.intern();
- }
- }
在Java中字符串是不可变的,原因的话,我们直接去看源码,即可知道

- public class Main {
- public static void main(String[] args) {
- String s = new String();
- s = " 123 ";
- StringBuffer str1 = new StringBuffer();
- str1.append(s);
- str1.append("asdasdasd");
- System.out.println(str1.toString());
- }
- }
可以看到,这里我们使用append方法来进行拼接,但是打印的时候因为是StringBuffer类无法打印,所以要用toString方法来转化成字符串打印
这里列举一些方法,需要的可以看一下

感谢阅读!!!