java.lang.String类的使用
一、概述
1.声明为final的,不可被继承
2.实现了Serializable接口:表示字符串是支持序列化的;
实现了Comparable接口:表示String可以比较大小
3.String内部定义了final char[ ] value用于存储字符串
4.通过字面量的方式(区别于new给了应该字符串赋值,此时的字符串值声明在字符串常量池中)
5.字符串常量池不会存储相同内容的字符串的。
二、String的不可变性
1.当字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值
2.当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
3.当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
三、String实例化的两种方式
1、通过字面量定义的方式
String s1 = "Ruki";
String s2 = "Ruki";
2、通过new加构造器的方式
String s3 = new String("Ruki");
String s4 = new String("Ruki");
//此时s3和s4保存的地址值,是数据在堆空间中开辟空间以后对应的地址值
System.out.println(s1 == s2);//true
System.out.println(s1 == s3);//false
System.out.println(s1 == s4);//false
System.out.println(s3 == s4);//false
3.比较示例
String s1 = "Ruki";
String s2 = "Koji";
String s3 = "RukiKoji";
String s4 = "Ruki" + "Koji";
String s5 = s1 + "Koji";
String s6 = "Ruki" + 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 == s6);//false
System.out.println(s5 == s7);//false
System.out.println(s6 == s7);//false
String s1 = "RukiKoji";
String s2 = "Ruki";
String s3 = s2 + "Koji";
System.out.println(s1 == s3);//false
final String s4 = "Ruki";//被final修饰后相当于常量
String s5 = s4 + "Koji";
System.out.println(s1 == s5);//true,相当于"Ruki+Koji"
4.String调用包装类的静态方法
例如:parseInt(str)
String str1 = "123";
int num = Integer.parseInt(str1);
String str2 = String.valueOf(num);//"123",调用String重载用valueOf()
String str3 = num + "";
System.out.println(str1 == str3);
5.String与字符数组之间的转换
public void test(){
String str1 = "abc123";
char[] charArray = str1.toCharArray();//将String转换成字符串数组
for(int i = 0; i < charArray.length; i++){
System.out.println(charArray[i]);
}
char[] arr = new char[]{'h','e','l','l','o'};
String str2 = new String(arr);//将字符串数组转化成string,调用String的构造器
System.out.println(str2);
}
6.与字节数组之间的转换
将String转化成byte[ ] 属于编码过程,反之属于解码过程
解码时,要求解码使用的字符集必须与编码时使用的字符集一致,否则乱码
public void test() throws UnsupportedEncodingException{
String str1 = "abc123中国";
byte[] bytes = str1.getBytes();//使用默认的字符集,进行编码
System.out.println(Arrays.toString(bytes));
byte[] gbks = str1.getBytes("gbk");//使用gbk字符集进行编码
System.ot.println(Array.toString(gbks));
System.out.println("*********************");
String str2 = new String(bytes);//使用默认的字符集进行编码
System.out.println(str2);
String str3 = new String(gbks);
System.out.println(str3);//出现乱码,因为编码和解码的字符集不一致
String str4 = new Stirng(gbk,"gbk")
System.out.println(str4);//没出现乱码,因为编码和解码的字符集一致
}
7.与StringBuffer、StringBuilder之间的转化
String转化成StringBuffer、StringBuilder:调用StringBuffer、StringBuilder构造器
反之:调用String构造器或StringBuffer、StringBuilder的toString()
8.JVM中字符串常量池存放位置
jdk1.8中字符串常量池存储在方法区(元空间)