String:用于保存字符串,即一组字符序列。
String类分别实现了Serializable、Comparable、CharSequence和Object接口
1.实现了Serializable接口,表明String可以串行化(在网络上进行传输)
2.实现了Comparable接口,表明String创建的对象实例可以相互比较
3.实现了CharSequence接口,即字符序列接口
字符串中的字符都采用的是Unicode字符编码,一个字符(无论是汉字还是字母)都占用两个字节
JVM中为减少字符串对象的重复创建,维护了一块特殊的内存空间,即字符串常量池。
Java中创建字符串对象存在两种形式:
1.利用字面量形式:String str = "abc";
使用字面量形式创建字符串时,JVM会在字符串常量池中进行检查,是否存在相同内容的字符串对象的引用。如果存在,则将该引用返回。如果不存在,则创建字符串对象,并将引用放在字符串常量池中,返回常量池中的引用。
所以,使用字面值创建对象时,str直接指向字符串常量池中的某块空间(引用)
2.利用new对象实例:String str = new String();
使用new对象实例的方式创建字符串时,不管字符串常量池中是否有相同内容的对象引用,都会在堆上创建String对象的引用。引用中维护了value属性,其指向String字符串对象。
// String中重写了equals方法,比较的是两个字符串内容是否相等
// ==,运算符,比较判断的是两个字符串地址是否相等
String str1 = "kxg";
String str2 = new String("kxg");
System.out.println(str1.equals(str2)); // true
System.out.println(str1 == str2); // false
String a = "abc";
String b = "abc";
System.out.println(a.equals(b)); // true
System.out.println(a == b); // true
String类通过final修饰,代表不可变的字符序列。即:字符串是不可变的。
字符串常量池形成的条件就是String不可变。当多个变量共享一个字符串对象时,如果String对象可变,则一个引用操作改变了字符串变量的值,其他的变量也会受到影响。
所以改变变量的值,需要改变其所指向的引用,而不是改变字符串的值。
String s1 = "hello" + "kxg";
// 编译器会对该语句进行优化:String s1 = "hellokxg";所以仅仅创建了一个对象
String s2 = "hello"; // 创建字符串对象"hello"
String s3 = "kxg"; // 创建字符串对象"kxg"
String s4 = s2 + s3;
// StringBuilder str = new StringBuilder(); str.append("hello"); str.append("kxg");
// s4=str.toString();
// s1指向的是常量池中的引用;而s4指向的是堆上的引用
System.out.println(s1.equals(s4)); // true
System.out.println(s1 == s4); // false
// 当两个字符串常量相加时,池中相加,结果指向的是常量池中的地址
// 当存在字符串变量相加时,堆上通过StringBuilder的append相加,结果指向堆上的地址
String类中的常用方法:
(1)equals方法:判断两个字符串的内容是否相等,区分大小写
(2)equalsIgnoreCase方法:判断两个字符串内容是否相等,忽略大小写
(3)length方法:获取字符串的长度(字符的个数)
(4)indexOf方法:获取某个字符在字符串中第一次出现时的索引位置
(5)lastIndexOf方法:获取某个字符在字符串中最后一次出现的索引位置
indexOf方法、lastIndexOf方法不仅仅可以是单个字符,也可以是某部分子串
(6)subString方法:截取某部分子串
subString(int index):从索引为index的位置开始截取
subString(int start, int end):从start位置开始截取,截取到(end-1)的位置
(7)toUpperCase方法:将字符串中全部字符转为大写
(8)toLowerCase方法:将字符串中全部字符转为小写
(9)concat方法:拼接字符串
(10)replace方法:替换字符串中的字符
replace(XXX, YYY):将字符串中所有的XXX替换成YYY
(11)split方法:对字符串进行分割
(12)toCharArray方法:字符串转为字符数组
(13)compareTo方法:比较两个字符串的大小
两个字符串挨个字符比较。前者大,返回正数;后者大,返回负数;相等,返回0
(14)format方法:格式化字符串
%s、%d、%f、%c都是占位符,分别表示字符串、整数、小数、字符来替换
%.2f表示小数仅仅保留两位(四舍五入)