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

目录

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详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第1张图片 

通过源码,我们可以看到,String构造方法是把字符数组拷贝了一份 给到str的value里面

再去看看String中的字段,可以发现String中的value其实还是一个char类型的数组

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

1.2字符串的比较

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

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

String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第2张图片

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

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

String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第3张图片

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

String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第4张图片 可以看到,在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));
    }
}

 String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第5张图片

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

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

String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第6张图片

我们可以看到,c确实是在2号位置

这里有个有意思的事情,就是我们虽然传的是字符类型,但是我们看源码String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第7张图片

可以发现,这里是用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));
    }
}

String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第8张图片

可以看到,我们的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"));
    }
}

String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第9张图片

 这个代码返回的值就是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));
    }
}

String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第10张图片

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

String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第11张图片

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

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中的数值转成了字符串,运行结果是

String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第12张图片

 

不仅如此,还可以把自定义的对象变成字符串类型的

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

String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第13张图片

你肯定会说,这有啥用啊,啥有用的数据都没有,但是别急,如果我们给自定义的对象添加一个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"));
    }
}

String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第14张图片

我们可以看到运行结果中的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"));
    }
}

 String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第15张图片

可以看到,这里只有第一个c被替换成z了,其他的都没用替换

不仅如此,我们传入的参数还可以是字符串,可以进行字符串的替换,具体看代码实现

public class Main {
    public static void main(String[] args) {
        String str1 = new String();
        str1 = "abcdecccc";
        System.out.println(str1.replaceAll("abc","c"));
    }
}

 String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第16张图片

可以看到这里的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)));
    }
}

String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第17张图片

我们可以通过','看出了,数组中存了三个数值,分别是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));

    }
}

 String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第18张图片

可以看到,当我们输入两个数值的时候,他就会从第一个数值截取到第二个数值位置

注意:这里的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());

    }
}

String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第19张图片

 

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

    }
}

String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第20张图片

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

1.10字符串常量池

1.10.1常量池的简介

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

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

我们来看一个图

String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第21张图片

 

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

1.10.2intern方法

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

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

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

1.11字符串的不可变性

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

String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第22张图片

 

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方法来转化成字符串打印

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

String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第23张图片

String详解及StringBuffer,StringBuilder常用方法简介(含字符常量池)巨详细_第24张图片 

 感谢阅读!!!

你可能感兴趣的:(java,servlet,jvm)