String类
定义
-
String对象用于保存字符串,也就是一组字符序列
-
字符串常量对象是用双引号括起的字符序列。例如:“你好”、“12.97”."boy"等
-
字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节
-
String类较常用构造器(其它看手册):
String s1 = new String0);1l
String s2 = new String(String original);String s3 = new String(char[ a);
String s4 = new String(charla,int startlndex,int count);
-
String 类实现了接口 Serializable【String 可以串行化:可以在网络传输
-
String 是 final 类,不能被其他的类继承
-
String 有属性 private final char value[]; 用于存放字符串内容
-
一定要注意:value 是一个 final 类型, 不可以修改(需要功力):即 value 不能指向新的地址,但是单个字符内容是可以变化
package string;
public class String01 {
public static void main(String[] args) {
String name = "jack";
name = "tom";
final char[] value = {'a','b','c'};
char[] v2 = {'t','o','m'};
value[0] = 'H';
//value = v2; 不可以修改 value 地址
}
}
测试
package string;
public class String01 {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
System.out.println(a == b);//T
System.out.println(a.equals(b));//T
String c = new String("abc");
String d = new String("abc");
String e = "abc";
System.out.println(c.equals(d));//T
System.out.println(c == d);//F
System.out.println(c.equals(e));//T
System.out.println(c == e);//F
}
}
编译结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w1KIjSkI-1682307938162)(C:\Users\22014\AppData\Roaming\Typora\typora-user-images\image-20230424104117219.png)]
-
String是一个final类,代表不可变的字符序列
2)字符串是不可变的。一个字符串对象一旦被分配,其内容是不可变的.1.以下语句创建了几个对象?画出内存布局图。
String s1 = “hello”;
s1=“haha”; l/1min//创建了2个对象.内存图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rRO6aK1F-1682307938163)(C:\Users\22014\AppData\Roaming\Tencent\QQ\Temp\D375E21A02C70606BBE3895072C5B807.jpg)]
题1
String a = “hello” +“abc”;
创建了几个对象?只有1个对象.
解读:String a = “hello”+“abc”; //==>优化等价 String a =“helloabc”;
分析
1.编译器不傻,做一个优化,判断创建的常量池对象,是否有引用指向2. String a = “hello” + “abc”; =》 String a = “helloabc”;
String a = “hello”;1/创建a对象
String b =“abc”;//创建b对象
String c=a+b;创建了几个对象?画出内存图?
1/关键就是要分析 String c =a + b;到底是如何执行的
/一共有3对象,如图。
小结:底层是StringBuilder sb = new StringBuilder();
sb.append(a);
sb.append (b);
sb是在堆中,并且append是在原来字符串的基础上追加的.重要规则,
String c1 = “ab” + “cd”;常量相加,看的是池。String c1 =a+b;变量相加,是在堆中
String常用方法
package string;
public class String01 {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
String c = "Abc";
String d = "AbAc";
//System.out.println(a.equals(b));//区分大小写 T
//System.out.println(a.equals(c));F
System.out.println(a.equalsIgnoreCase(c));//T
System.out.println("a的长度" + a.length());
System.out.println(a.indexOf('c'));//indexOf获取字符串对象第一次出现的索引
System.out.println(d.lastIndexOf('A'));//indexOf获取字符串对象最后一次次出现的索引
System.out.println(a.substring(1));//截取指定范围1~2
System.out.println(a.substring(0, 2));//截取指定范围0~2
System.out.println(a.toUpperCase());//转成大写
System.out.println(d.toLowerCase());//转成小写
System.out.println(a.concat("def").concat("xyz"));//concat拼接字符
System.out.println(a.replace("abc", "xyz"));//替换字符
//split 分割字符串, 对于某些分割字符,我们需要 转义比如 | \\等
String poem = "锄禾日当午,汗滴禾下土,谁知盘中餐,粒粒皆辛苦";
// 1. 以 , 为标准对 poem 进行分割 , 返回一个数组
// 2. 在对字符串进行分割时,如果有特殊字符,需要加入 转义符 \
String[] split = poem.split(",");
System.out.println(poem);
poem = "E:\\aaa\\bbb";
System.out.println(poem);
split = poem.split("\\\\");
System.out.println("==分割后内容===");
for (int i = 0; i < split.length; i++) {
System.out.println(split[i]);
}
//toCharArray 转换成字符数组
char[] f = a.toCharArray();
for (int i = 0; i < f.length; i++) {
System.out.println(f[i]);
}
System.out.println(a.compareTo(d));//比较字符串大小 后者大返回正数 后者小返回负数
System.out.println(String.format(a,"%c"));//格式化字符串
}
}