JavaSE--String
分享一下我对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,可以发现,中间的空格确实无法去除
更多推荐




所有评论(0)