String类
String类的理解和创建对象
-
String对象用于保存字符串,也就是一组字符序列
-
字符串常量对象是用双引号括起来的字符序列。例如:"你好"、"12.66"、"boy"等
-
字符串的字符使用Unicode字符编码,一个字符(不区分字母还是数字)占两个字节
-
String类常用的构造器(其它看手册):
-
String s1 = new String();
-
String s2 = new String(String original);
-
String s3 = new String(char[] a);
-
String s4 = new String(char[],int startIndex,int count)
-
-
String类实现了Serializable接口,所以String可以串行化(可以在网络上传输)
-
String类实现了Comparable接口,所以String对象可以比较大小
-
String类是final类,不能被其它的类继承
-
String有属性 private final char value[]; 用于存放字符串内容
-
注意:final修饰的是value这个引用变量,所以value引用变量存放的地址不可以修改
-
String对象的两种创建方式
-
方式1:直接赋值 String s = "word";
-
先从常量池查看是否有"word"数据空间,如果有,则直接指向;如果没有则重新创建,然后指向。s最终指向的是常量池的空间地址。
-
-
方式2:调用构造器 String s = new String("word");
-
先在堆中创建空间,里面维护了value属性,指向常量池的"word"空间。如果常量池没有"word",则重新创建,如果有,则直接通过value指向。s最终指向的是堆中的空间地址。
-
String对象的特性
-
String是一个final类,代表不可变的字符序列
-
字符串是不可变的。一个字符串对象一旦被分配,其内容是不可变的
1.以下语句创建了几个对象?
String s1 = "hello";
s1 = "abc";
2.以下语句创建了几个对象?
String a = "hello"+"abc";
3.以下语句创建了几个对象?
String a = "hello";
String b = "abc";
String c = a+b;
4.以下代码输出什么?
String s1 = "abc";
String s2 = "java";
String s3 = "abcjava";
String s4 = (s1+s2).intern();
System.out.println(s3 = s4);
System.out.println(s3.eaquals(s4));
重要规则
-
String h = "ab"+"cd"; 字符串常量相加,指向常量池
-
String h= a+b; 变量相加,指向堆中
String类的常用方法
String类的常用方法1
-
equals:区分大小写,判断内容是否相等
-
equalsIgnoreCase:忽略大小写,判断内容是否相等
-
length:获取字符的个数,字符串的长度
-
indexOf:获取字符在字符串中第一次出现的索引,索引从0开始,如果找不到,返回 -1
-
lastIndexOf:获取字符在字符串中最后一次出现的索引,索引从0开始,如果找不到,返回 -1
-
subString:截取指定范围的子串
-
trim:去前后空格
-
charAt:获取某索引处的字符,注意不能使用Str[index] 这种方式
String str = "hello";
//str[0] 不对,str不是数组
//str.charAt(0) -> h,正确
String类的常用方法2
-
toUpperCase:字符串全部转换成大写
-
toLowerCase:字符串全部转换成小写
-
concat:拼接字符串
-
replace:替换字符串中的字符
public final class Demo07 {
public static void main(String[] args) {
String s1 = "宝玉 and 林黛玉";
//"宝玉 and 林黛玉"常量对象并没有被改变,只是s1的指向改变了
s1 = s1.replace("宝玉","jack");
System.out.println(s1);
System.out.println(s1.replace("jack","宝玉"));
System.out.println(s1);
}
}