分享一下我对String这个类的认识:

  当我们按住Ctrl 点击String时,我们发现String这个类里有很多很多内容,比如

private final byte[] value;

虽然逻辑上来说,我们可以认为字符串本质上是一个char类型数组,我们可以把它当做一个数组,当然这是逻辑上,物理上,在JDK 9 之前,底层的这个 value还是 char[ ]类型的,在JDK 9 之后成了现在的byte[ ]类型,因为这涉及内存浪费问题,我们不深究,重点讲String的各种方法以及String的不可变性。

一、String的核心特性:不可变性(Immutability)

  String类最显著的特点就是不可变,我们发现这个字符串 byte[ ] value 是被 private  final 所修饰

1.private

首先先说private,被private修饰的成员,只能在当前这个类中进行访问,除非有getter或者setter方法,这意味着假设我写下了一行  String s1 = "hello"; 那么就有一个String类型的对象被创建了,这个引用s1指向的对象里存着 hello 这一字符串,而其被 private 所修饰,我们无法访问,更无法修改 hello 中的内容。

2.final

我们都知道,被 final 修饰过的变量,都无法再被修改,相当于被定死了,所以被 final 修饰的变量里的地址无法被修改,我们无法通过引用访问到指向 hello 的这个对象的地址

所以说在private和final的双重保护下,才有了字符串的不可变性,而我们看到的这串代码:

String s1 = "hello";
 s1 = "world";

其实是创建了一个新的对象,里面存着world,然后将这个新的对象的地址赋值给了 s1 这个引用,这就是String类的不可变性。

二、String中的各种方法

1..compareTo   compareToIgnoreCase

在我们按住Ctrl后点击String后发现:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence,
               Constable, ConstantDesc {

发现有一行: Comparable<String>这说明字符串之间可以进行比较

s1.compareTo(s2)的规则:从头开始,上下对应,逐个字符以字符其对应的ASCII码值进行一一比较,若双方上下对应字符ASCII码值相同,则双方从下一位开始比较,直到遇到上下对应ASCII码值更大一方,若前者更大,则打印出一个正数,反之则为负数

实例:

String s1 = "aef";
String s2 = "aec";
String s3 = "ao";
String s4 = "aeF";

(1). s1.compareTo(s2)

我们发现上下同为a的ASCII码值,则上下都来到自己的下一位,发现上下同为e,则继续下一位,发现f的ASCII码值大于c的,则s1更大,打印出一个正数

(2). s2.compareTo(s3)

我们发现上下同为a,双方来到各自的下一位,我们发现s3的o的ASCII码值比e的大,则s3更大,判定结束,不再关心s2是否更长,打印出负数

(3). compareToIgnoreCase

意思就是忽视双方字符大小写,比如 s1.compareToIgnoreCase(s4),正常来说双方来到 f 和 F 时,肯定 f 的ASCII码值更大,s1更大,但此时忽视了大小写的问题,所以双方一样大,打印得0

2.indexOf  lastindexOf

    String s  = "abbcca";
System.out.println(s.indexOf('a'));
System.out.println(s.indexOf("bb", 1));
System.out.println(s.indexOf('b',3));

System.out.println(s.lastIndexOf('c', 4));

(1.)indexOf

规则:我们通过创建对象,使用引用调用indexOf这一方法,该方法的作用是从左往右,找到第一个出现指定字符的位置下标然后打印出来,当然indexOf存在重载,我们还可以指定从哪个小标开始从左往右找。

System.out.println(s.indexOf('a'));

这一行的意思就是从左往右,在这个字符串中找到字符a第一次出现的位置下标,我们发现

String s = "abbcca";

a第一次出现的位置就是0下标对应的位置,所以打印出0

System.out.println(s.indexOf("bb", 1));

我们还可以查找第一次出现字符串bb的位置,且从下标1也就是b这个字符开始,我们发现bb这一字符串在下标1对应的位置出现了,跟我从下标1位置开始查找并不冲突,所以成功打印出了字符串bb第一次出现的位置下标--1

(2.)lastIndexOf

规则:从右往左,找到这个字符或字符串第一次出现的位置,这句话如果用在从左往右意思就是:从左往右,找到这个字符或字符串最后一次出现的位置下标并打印出来

String s = "abbcca";
System.out.println(s.lastIndexOf('c', 4));

我们截止到下标4--第2个c的位置,从右往左找,找到第一个字符c出现的位置,也就是我们可以从5下标访问到4下标,找到字符c第一次出现的位置,此时我们打印出了4

3. toUpperCase    toLowerCase

同样的通过引用调用这两个方法

String s1 = "HEllo111";
   System.out.println(s1.toUpperCase()); //HELLO111
   System.out.println(s1.toLowerCase()); //hello111

toUpperCase使得字符串内的所有字符都转为大写并输出(数字不管)

toLowerCase使得字符串内的所有字符都转为小写并输出(数字不管)

 4.String.format

类似于C语言内的printf,可以输入占位符并以指定形式输出,实例:

String str = String.format("%d,%d-%d", 9, 22, 33);//9,22-33
 System.out.println(str);

输出为9,22-33   这里不做过多讨论

5. replace replaceAll replaceFirst

规则:输入两个字符或者两个字符串,将字符串内的全部前者替换为后者:

String str = "abbabkkk1";
System.out.println(str.replace('a','e'));//我们成功将所有的a替换成了k
System.out.println(str.replace("ab","oo"));//成功将字符串内的所有ab都替换成了cc
System.out.println(str.replaceAll("ab", "cc"));//将字符串内所有的ab替换成cc
System.out.println(str.replaceFirst("ab", "9"));//将字符串内出现的第一个ab替换成9

记住,字符和字符串之间无法替换

6. split

split--分割,指定一个字符,使这个字符串中这个字符左右的两串字符串分割成两个字符串

实例:

String s = "name=zhangsan&age=10";
String[] str = s.split("&");

我们以&作为分割标准,将字符&左右的字符串分割,变成了两串字符串name=zhangsan和age=10

当然我们还可以同时以多个字符串为标准进行切割,例如:

String[] str = s.split("&|="); 

我想以= 和 & 作为标准将name=zhangsan&age=10进行分割,就可以在两个指定字符间加一个 |

此时,name=zhangsan&age=10被分割成了地段字符串:

name

zhangsan

age

10

这些分割后的多段字符串我们都需要用字符串数组String[ ] 进行接收的

7.trim()

作用:去除字符串左右的所有空格(中间的不行)并输出,实例:

String s = "  abc d f g  e          ";

String s2 = s.trim();   //trim  只能去掉字符串最左和最右边的所有空格,中间不行
System.out.println(s2);

此时我们输出的是:  abc d f g e,可以发现,中间的空格确实无法去除

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐