Java.lang.String类的使用
1.概述:
String:字符串,使用 一对 “”引起来表示
- String声明为final的,不可被继承
- String实现了Serializable接口:表示字符串是支持序列化的
- String实现了Comparable接口:表示String可以比较大小
- String 内部定义了final char[] value用于存储字符串数据
- 通过字面量的 方式(区别于new给一个字符串赋值,此时的字符串值声明在字符串常量池中。)
- 字符串常量池中是不会存储相同内容(使用String类的equals()比较,返回true)的字符串的
说明:
在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation)。几乎所有计算机编程语言都具有对基本值的字面量表示,诸如:整数、浮点数以及字符串;而有很多也对布尔类型和字符类型的值也支持字面量表示;还有一些甚至对枚举类型的元素以及像数组、记录和对象等复合类型的值也支持字面量表示法。
--百度百科
有个不太好,但是足以说明问题的解释,那就是 对象字面量就是引号引起来的部分,必须是等号右边的部分。虽然这样的解释不太好,但是确实如此,这就是字面量。
2.String的不可变性
说明:
- 当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值
- 当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
- 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
代码举例:
String s1 = "abc";字面量的定义方式
String s2 = "abc";
s1 = "hello";
System.out.println(s1 == s2);//比较s1和s2的地址值
System.out.println(s1);//hello
System.out.println(s2);//abc
System.out.println("******************");
String s3 = "abc";
s3 += "def";
System.out.println(s3);//abcdef
System.out.println(s2);
System.out.println("******************");
String s4 = "abc";
String s5 = s4.replace(oldChar:'a',newChar'm');
System.out.println(s4);//abc
System.out.println(s5);//mbc
图示:
3.String实例化的不同方式
方式说明:
方式一:通过字面量定义的方式
方式二:通过new + 构造器的方式
代码举例:
//通常字面量定义的方式:此时的s1和s2的数据JavaEE声明在方法区中的字符串常量池中
String s1 = "javaEE";
String s2 = "javaEE";
//通过new + 构造器的方式:此时的s3和s4保存的地址值,是数据在堆空间中开辟空间以后对应的地址值
String s3 = new String ("javaEE");
String s4 = new String ("javaEE");
System.out.println(s1 == s2);//true
System.out.println(s1 == s3);//false
System.out.println(s1 == s4);//false
System.out.println(s3 == s4);//false
面试题 :
String s = new String("abc");方式 创建对象,在内存中创建了几个 对象?
两个:一个 是对空间中new结构,另外一个是 char【】对应的常量池中的 数据:"abc"
图示:
4.字符串拼接方式赋值的对比
说明:
- 常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量
- 只要其中一个是变量,结果就在堆中
- 如果拼接的 结果调用intern()方法 ,返回值就在常量池中
代码举例:
String s1 = "javaEE";
String s2 = "Hadoop";
String s3 = "javaEEHadoop";
String s4 = "javaEE" + "Hadoop";
String s5 = s1 + "Hadoop";
String s6 = "javaEE" + s2;
String s7 = s1 + s2;
System.out.println(s3 == s4);//true
System.out.println(s3 == s5);//false
System.out.println(s3 == s6);//false
System.out.println(s3 == s7);//false
System.out.println(s5 == 6);//false
System.out.println(s5 == s7);//false
System.out.println(s6 == s7);//false
String s8 = s6.inter();//返回值得到的s8使用的 常量值中已经存在的"javaEEhadoop"
System.out.println(s3 == s8);true
************************************
String s1 = "javaEEHadoop";
String s2 = "javaEE";
String s3 = s2 + "Hadoop";
System.out.println(s1 == s3);//false
final String s4 = "javaEE";//s4:常量
String s5 = s4 + "hadoop";
system.out.println(s1 = s5);//true
常用方法:
int length():返回字符串的长度:return value.length
char charAt(int index):返回某 索引处的 字符串return value【index】
boolean isEmpty():判断是否是空 字符串:return value.length == 0
String toLowerCase():使用默认语言环境,将String中的所有字符转换为小写
String toUpperCase():使用默认语言黄金,将String中的所有字符转换为大写
String trim():返回字符串的副本,忽略前导空白和尾部空白
boolean equals(Object obj): 比较字符串的内容是否相同
boolean equalsIgnoreCase(String anotherString): 与equals方法类似,忽略大小写
String concat(String str):将指定的字符串连接到此字符串的结尾。等价于 "+