String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细

发布于:2022-12-25 ⋅ 阅读:(296) ⋅ 点赞:(0)

目录

1.String类

1.1构造方法

         1.1.1使用常量字符串构造

        1.1.2.创建对象,在带参的构造方法中传入一个字符串构造

       1.1.3.通过字符数组进行构造

1.2字符串的比较

1.3字符串的查找操作

1.3.1charAt()方法

1.3.2indexOf()方法

1.4字符串转换操作 

1.4.1字符串转数值

1.4.2数值转字符串

 1.5字符串的替换

1.5.1replaceAll(String regex, String replacement)

1.5.2replaceFirst(String regex, String replacement)

1.6字符串拆分

1.7字符串截取

 1.8字符串修剪方法

1.9大小写转换方法

1.10字符串常量池

1.10.1常量池的简介

1.10.2intern方法

1.11字符串的不可变性

2.StringBuilder 和 StringBuffer


1.String类

在JAVA中String是字符串类,String是相当的重要的

1.1构造方法

        String有很多构造方法,我们简单介绍一些:

         1.1.1使用常量字符串构造

       

public class Main {
    public static void main(String[] args) {
        String str = "abcdef";
        System.out.println(str);
    }
}

        1.1.2.创建对象,在带参的构造方法中传入一个字符串构造

public class Main {
    public static void main(String[] args) {
        String str = new String("abcdef");
        System.out.println(str);
    }
}

       1.1.3.通过字符数组进行构造

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类型的数组

注意:其实我们上面的第一种写法是第二种的简化,并没有孰优孰劣

1.2字符串的比较

我们都知道,String类是引用变量,是无法进行比较内容的,所以我们String类中重写了Object中的equals方法,进行字符串比较

先看如果是用== 进行比较的结果

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

但是我们如果用equals方法来比较的话,再看结果

可以看到,这个结果是我们想要得到的,为什么呢?其实我们前面提过,因为String类重写了equals方法,我们可以去源码里面看一眼

 可以看到,在String中重写了equals方法

1.3字符串的查找操作

在JAVA中,还提供了一些字符串的查找函数,我这里就不一一演示,调几个比较重要的演示一下,感兴趣的可以去试一下

1.3.1charAt()方法

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));
    }
}

 

这里可以看到我们得到的结果就是字符串对应的下标

1.3.2indexOf()方法

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));
    }
}

1.4字符串转换操作 

1.4.1字符串转数值

字符串转数值是通过就是把字符串转换成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));
    }
}

我们可以看到,这里的字符串转成数值类型之后是可以计算的

1.4.2数值转字符串

数值也可以反过来转成字符串,通常使用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来设置自己想要的输出

 1.5字符串的替换

在java中字符串的替换也封装成了方法

1.5.1replaceAll(String regex, String replacement)

这个方法是把字符串中的没一个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,这里需要注意,替换是重新开了一个字符串来替换,并不是替换原来的字符串中的内容

1.5.2replaceFirst(String regex, String replacement)

这个方法是把字符串中第一次出现的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

1.6字符串拆分

在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,正好三组

注意:这里的拆分涉及到转义字符

1. 字符"|","*","+"都得加上转义字符,前面加上 "\\" .
2. 而如果是 "\" ,那么就得写成 "\\\\" .
3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符.

1.7字符串截取

在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中大多数都是左闭右开区间的

 1.8字符串修剪方法

在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());

    }
}

 

1.9大小写转换方法

这个方法也是一个特别常用的方法,我们使用一些方法对其进行修改

大写转小写是: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());

    }
}

可见这个方法只会对字母进行处理,不会处理其他类型的字符

1.10字符串常量池

1.10.1常量池的简介

Java 程,一些 字面类型的常量经常频繁使用, 为了使程序的运行速度更快、 更节省内存 Java 8 种基本数据类型和 String 类都提供了常量池。

 所以当我们用复制创建字符串的时候,对其进行比较,会发现结果是true,因为他俩引用的是同一块地址

我们来看一个图

 

 这个图里面详细的解释了字符串的常量池

1.10.2intern方法

inter方法是我们主动将一些字符串添加到常量池中,这个是人为的添加进去,具体用法如下

这里没办法去验证,所以我们只是实现一下就好了

public class Main {
    public static void main(String[] args) {
        String str = new String();
        str += "123456";
        str.intern();
    }
}

1.11字符串的不可变性

在Java中字符串是不可变的,原因的话,我们直接去看源码,即可知道

 

1. String 类被 fifinal 修饰,表明该类不能被继承
2. value 被修饰被 fifinal 修饰,表明 value 自身的值不能改变
所以字符串是不可变的

2.StringBuilder 和 StringBuffer

这个两个类中的方法的大部分功能是相同的,但是也是有区别的,StringBuffer是线程安全的,StringBuilder 是线程不安全的
我们String的字符串拼接是非常浪费资源的,所以我们可以用StringBuilder或者StringBuffer来的append()方法进行字符串的拼接,具体方法如下
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方法来转化成字符串打印

这里列举一些方法,需要的可以看一下

 

 感谢阅读!!!

本文含有隐藏内容,请 开通VIP 后查看