首先我们知道在C语言中没有字符串类型只能通过字符数组或者字符指针使用字符串,但是在Java中是有字符串类型的也就是今天要说的String类,好我们一起来看

目录

字符串构造

字符串对象的比较

1. ==比较是否引用同一个对象

2. boolean equals(Object anObject) 方法:按照字典序比较

3. int compareTo(String s) 方法: 按照字典序进行比较

 4. int compareToIgnoreCase(String str) 方法

字符串查找

charAt

 indexOf

 lastIndexOf

 转换

数字转字符串 valueOf

 字符串转数字 valueOf 或 parseInt

小写转大写 toUpperCase

 大写转小写 toLowerCase

字符串转数组 toCharArray

 格式化形式转化为字符串 format

 字符串替换

replace

replaceAll

 replaceFirst

字符串拆分 

split

 字符串截取

subString

  trim 去除字符串左右空格

 字符串常量池

 常量池

注意

intern方法

 字符串的不可变性

字符串拼接

StringBuffer和StringBuilder

append

 toString

注意

面试题


字符串构造

String str1="hello";

 String str2=new String("haha");

 char[] arr={'a','b','c'};
 String str3=new String(arr);

以上三种就是在Java中最常见的三种字符串构造的方式

注意:

1.在Java中字符串不以‘\0’结尾,所以就需要使用字符串长度来判断结尾

2. String是引用类型,内部并不存储字符串本身

String类型的数字在排序的时候 java java string sort_常量池

可以看到字符串是存在char类型的数组中的

可能还是不好理解这里我画图介绍一下

String类型的数字在排序的时候 java java string sort_常量池_02

String类型的数字在排序的时候 java java string sort_常量池_03

 注意这里没有涉及到字符串常量池,只是为了理解String类中的value和hash以及上面的三行代码

字符串对象的比较

1. ==比较是否引用同一个对象

 这里要知道==比较基本数据类型时是比较值,但是在引用数据类型中是比较地址是否相同

2. boolean equals(Object anObject) 方法:按照字典序比较

String类型的数字在排序的时候 java java string sort_java_04

 这里String类重写了父类Object中equals方法,Object中equals默认按照==比较,但此时的equals方法是比较对象的内容,字典序是字符大小顺序

3. int compareTo(String s) 方法: 按照字典序进行比较

compareTo与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型,返回字符的差值

String类型的数字在排序的时候 java java string sort_字符串常量池_05

 4. int compareToIgnoreCase(String str) 方法

compareToIgnoreCase方法与compareTo方式相同,但是忽略大小写比较

String类型的数字在排序的时候 java java string sort_字符串常量池_06

 好的以上就是Java中四种字符串比较方式,具体使用哪个看自己代码需求

字符串查找

字符串查找也是字符串中非常常见的操作,String类提供的常用查找的方法:

charAt

char charAt(int index) 返回index下标对应的字符,注意不要越界访问

String类型的数字在排序的时候 java java string sort_字符串常量池_07

 indexOf

int indexOf(int ch) 返回字符ch(第一次出现)对应的下标,没有返回-1

String类型的数字在排序的时候 java java string sort_常量池_08

 

String类型的数字在排序的时候 java java string sort_字符串常量池_09

indexOf方法有多个构成重载具体使用看场景

 lastIndexOf

int lastIndexOf(int ch) 从后到前找返回字符ch第一次出现的下标,没有返回-1

String类型的数字在排序的时候 java java string sort_字符串_10

 

String类型的数字在排序的时候 java java string sort_常量池_11

lastIndexOf方法有多个构成重载具体使用看场景

 转换

数字转字符串 valueOf

String类型的数字在排序的时候 java java string sort_字符串常量池_12

 字符串转数字 valueOf 或 parseInt

String类型的数字在排序的时候 java java string sort_字符串_13

小写转大写 toUpperCase

String类型的数字在排序的时候 java java string sort_java_14

 大写转小写 toLowerCase

 

String类型的数字在排序的时候 java java string sort_字符串_15

 注意:这里大小写转换只涉及到字母转换,非字母字符不会转换

字符串转数组 toCharArray

String类型的数字在排序的时候 java java string sort_字符串_16

 格式化形式转化为字符串 format

 

String类型的数字在排序的时候 java java string sort_常量池_17

 字符串替换

使用一个指定的新的字符串替换掉已有的字符串数据

replace

替换字符

String replace(char oldChar,char newChar)

String类型的数字在排序的时候 java java string sort_字符串_18

replaceAll

替换所有指定的内容

String replaceAll(String regex, String replacement)

String类型的数字在排序的时候 java java string sort_java_19

 replaceFirst

替换首个指定的内容

String replaceFirst(String regex, String replacement)

String类型的数字在排序的时候 java java string sort_常量池_20

注意:由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串 ,这个在后面会详细说

字符串拆分 

可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串

split

String[] split(String regex)  拆分字符串按照传参方式分割

String类型的数字在排序的时候 java java string sort_java_21

 我们还可以多传一个参数来限制分隔次数

String类型的数字在排序的时候 java java string sort_java_22

 注意:

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

这里我举个例子加深理解,能看懂这个代码应该就掌握了

String类型的数字在排序的时候 java java string sort_常量池_23

 字符串截取

subString

String subString(int beginIndex) 从下标开始截取到末尾,下标从0开始

String类型的数字在排序的时候 java java string sort_常量池_24

 String subString(int beginIndex,int endIndex) 截取指定区间字符(左闭右开)

String类型的数字在排序的时候 java java string sort_常量池_25

  trim 去除字符串左右空格

trim 会去掉字符串开头和结尾的空白字符(空格, 换行, 制表符等)

String类型的数字在排序的时候 java java string sort_常量池_26

 好的以上就是Java中操作字符串常用的方法,每个方法都有代码介绍,希望对你有帮助,但是有关String类的知识还没介绍完我们接着来看

 字符串常量池

在了解字符串常量池的知识前我们先看一段代码

String类型的数字在排序的时候 java java string sort_java_27

 想想输出结果是什么呢,都是字符串“hello”结果应该相同吧我们来看

String类型的数字在排序的时候 java java string sort_java_28

结果不同这是为什么呢这就有关常量池的概念了看完博客相信你就懂了

 

字符串常量池其实就是一个StringTable的东西,StringTable其实就是一个哈希表

String类型的数字在排序的时候 java java string sort_字符串常量池_29

当然我画的图也不是最完整的在String对象与字符串常量池之前还会有一块空间记录对象的地址

 这里要知道只要双引号引起来的元素,全部存放到常量池中且只有一份,在存放的时候会先去常量池中检查是否存在这个常量

 常量池

1.Class文件常量池:每个.Java源文件编译后生成.Class文件中会保存当前类中的字面常量以及符号信息
2. 运行时常量池:在.Class文件被加载时,.Class文件中的常量池被加载到内存中称为运行时常量池,运行时常
量池每个类都有一份
3. 字符串常量池:在堆中

注意

1. 在JVM中字符串常量池只有一份,是全局共享的
2. 刚开始字符串常量池是空的,随着程序不断运行,字符串常量池中元素会越来越多
3. 当类加载时,字节码文件中的常量池也被加载到JVM中,称为运行时常量池,同时会将其中的字符串常量保存在字符串常量池中
4. 字符创常量池中的内容:一部分来自运行时常量池,一部分来自程序动态添加

intern方法

intern 是一个native方法 该方法的作用是手动将创建的String对象添加到常量池中

我们来看代码

String类型的数字在排序的时候 java java string sort_字符串_30

可以看到自是多了一行代码结果就发生了改变,这是为什么请看图解

String类型的数字在排序的时候 java java string sort_常量池_31

 字符串的不可变性

 String是一种不可变对象. 字符串中的内容是不可改变,字符串不可被修改

String类型的数字在排序的时候 java java string sort_字符串常量池_32

 可以看到在源码中value数组是final修饰的,被final修饰表示指向对象不能改变,但指向的内容可以修改 

String类型的数字在排序的时候 java java string sort_常量池_33

String类型的数字在排序的时候 java java string sort_字符串常量池_34

但是字符串的不可变性并不是final影响而是private,并且String类中并没有提供关于数组getset方法所以字符串的内容是不可改变的

final修饰类表明该类不想被继承,final修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内容是可以修改的

字符串拼接

String类型的数字在排序的时候 java java string sort_常量池_35

上述代码中有多少对象呢?

String类型的数字在排序的时候 java java string sort_常量池_36

 不太好看我来试着写一下代码来表示

public static void main(String[] args) {
        String str=new String("hello");
       // str=str+"world";

        StringBuilder sb=new StringBuilder();
        sb.append(str);
        sb.append("world");
        str=sb.toString();
        System.out.println(str);
    }

 由于字符串不可变所以尽量避免对String的直接使用,如果要修改建议尽量使用StringBuffer或者StringBuilder

StringBuffer和StringBuilder

由上述字符串拼接我们知道使用String拼接会产生大量临时字符串所以要使用StringBuffer或者StringBuilder所以我们就来介绍一下这两个类

Java中又提供StringBuilder和StringBuffer类,这两个类大部分功能是相同的我简单介绍

append


StringBuff append(String str) 在尾部追加,相当于String+= 作为拼接字符串使用


String类型的数字在排序的时候 java java string sort_字符串_37

 toString

String toString() 将所有字符按照String返回

String类型的数字在排序的时候 java java string sort_常量池_38

好的还有很多方法可以自己下去实践使用这里只列举两个方法的使用

String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可
以修改,频繁修改字符串的情况考虑使用StringBuilder

注意

String和StringBuilder类不能直接转换,如果要想互相转换,可以采用如下原则
1)String变为StringBuilder: 利用StringBuilder的构造方法或append()方法
2)StringBuilder变为String: 调用toString()方法

面试题

1)String、StringBuffer、StringBuilder的区别
1.String的内容不可修改,StringBuffer与StringBuilder的内容可以修改
2.StringBuffer与StringBuilder大部分功能是相似的,但是StringBuilder是线程不安全的,StringBuffer是线程安全的

String类型的数字在排序的时候 java java string sort_常量池_39

 2)String str = new String("a") + new String("b"); // 会创建多少个对象

String类型的数字在排序的时候 java java string sort_字符串常量池_40

看到这里String语法相关知识就总结完成了,当然可能也有我总结有误的地方还请大佬提醒一下,希望对你有帮助,觉得有用还请点赞评论会回关的,一起努力共同进步!!