目录
1. String类的理解
(1)String 对象用于保存字符串,也就是一组字符序列。
(2)字符串常量对象是用双引号括起的字符序列。例如:"你好"、"12.97"
(3)字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉空)占用两个字节。
(4)String类常用的构造方法:
①String s1 = new String();
②String s2 = new String(String original);
③String s3 = new String(char[] a);
④String s4 = new String(char[] a, int startlndex, int count);
(5)String类实现了Serializable 和 Comparable接口。Serializable接口使String可以串行化(可以在网络传输),Comparable接口使String对象可以相互比较大小。
(6)String类是final类,不能被其他的类继承。
(7)String类底层有属性 private final char value[]; 用于存放字符内容。一定要注意:value是一个final类型,一旦被赋值了,不可以修改(不是里面的字符内容不能修改,而是value的地址不能修改,不能指向新的地址)。
2. String创建对象的解析
2.1 方式一:直接赋值
String s = "hsp";
解析:先从常量池查看是否有"hsp"的数据空间,如果有,直接指向;如果没有,则重新在常量池创建,然后指向。s最终指向的是常量池的空间地址。
2.2 方式二:调用构造器
String s2 = new String("hsp");
解析:先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间。如果常量池中没有hsp,则重新创建;如果有,直接通过value指向。s最终指向的是堆中的空间地址。
2.3 内存分布图
3. String的特性
(1)String是一个final类,代表不可变的字符序列。
(2)字符串是不可变的。一个String对象一旦被分配,其内容是不可变的。(如果再次给String对象赋值,是指向了新的常量池属性,是改变指向,没有直接改变内容,原本的内容还在常量池中)
(3)重要规则:String c1 = “ab” + “cd”; 常量相加,c1指向的是常量池。String c2 = a + b; 变量相加,c2指向的是堆。
①如果同时给String对象 赋值多个字符串常量,编译器底层会自动优化,最后只创建一个整体的常量进行指向。
②如果将多个已经创建的String对象,赋值给一个新的String对象,则这个新的String对象 会将赋值的对象指向的字符串 在常量池中依次整合为一个字符串对象。
例1:String a = “hello” + “hi”; 在编译器底层优化后,等价于 String a = “hellohi”;
例2:String a = “hello”; String b = “hi”; String c = a + b;
第三行代码执行的底层是:先创建一个StringBuilder sb = StringBuilder();。 然后执行sb.append(“hello”); 将hello添加到一个新字符串中。 然后再执行sb.append(“hi”); 将hi添加到同一个字符串中。 最后调用toString方法,让c指向堆中的对象String c = sb. toString(); 而底层的value[]数组 指向常量池中的“hellohi”。
4. String类 常用方法
4.1 介绍
String类是保存字符串常量的。每次更新都需要重新开辟空间,效率较低,因此java设计者还提供了StringBuilder和StringBuffer两个类来增强String的功能,并提高效率。但String类在配置文件、表示一些常见的值等 还是很有用。
4.2 常用方法
1)equals 区分大小写,判断内容是否相等
2)equalslgnoreCase 忽略大小写,判断内容是否相等
3)length 获取字符的个数,字符串的长度
4)indexOf 获取字符在字符串中第1次出现的索引,索引从0开始,如果找不到,返回-1
5)lastlndexOf 获取字符在字符串中最后1次出现的索引,索引从0开始,如找不到,返回-1
6)substring 截取指定范围的子串
7)trim 去前后空格
8)charAt 获取某索引处的字符,注意不能使用Str[index]这种方式
9)toUpperCase 转换成大写
10)toLowerCase 转换成小写
11)concat 拼接字符串(注意:对原本的字符串没有影响,返回的结果才是被改变的)
12)replace 替换字符串中的字符(注意:对原本的字符串没有影响,返回的结果才是被改变的)
13)split 分割字符串(对某些分割字符,我们需要转义 比如 | 、\\等)
14)compareTo 比较两个字符串的大小(解释:①如果字符串长度相同,并且每个字符也相同,就返回0。 ②如果字符串长度相同或者不相同,但是在进行比较时,其中的字符可以区分大小,就返回字符串1的第一个不同的字符 减去 字符串2的第一个不同的字符 得到的ASCII码。 ③如果前面的部分都相同,就返回 字符串1的字符长度 减去 字符串2的字符长度)
15)toCharArray 转换成char[]字符数组(char[]字符数组 转换为String类型,可以直接 new String(字符数组名) 来创建一个新的String)
16)format 格式化字符串 (占位符解释:%s 表示字符串;%d 表示整数;%.2f 表示小数,保留两位小数;%c 表示字符)
17) printf 格式化输出(占位符与上一点相同)