JAVA常用类——String类概述
String类:代表字符串
String是一个final类,代表不可变的字符序列,也不可被继承
String对象的字符内容是存储在一个字符数组value[]中的
String类实现了Serializable接口,表示字符串是支持可序列化的
实现了Comparable接口,表示String可以比较大小
String字符串不可变的体现
- 当对字符串重新赋值时,需要重新指定赋值区域,不能使用原有的字符数组赋值
- 当对现有的字符串进行连接操作时,也需要重新指定赋值区域,不能使用原有的字符数组value赋值
- 当对现有的字符串的某个位置上的内容进行操作时,也需要重新指定赋值区域,不能使用原有的字符数组value赋值
package String;
import org.junit.Test;
//String类的使用
public class StringTest01 {
@Test
public void Test(){
String s1 = "abc";//字面量的定义方式
//通过字面量的定义方式给字符串赋值,此时的字符串值声明在字符串常量池中(字符串常量池在方法区中)
// 字符串常量池
String s2 = "abc";
//s1 = "hello";当对字符串重新赋值时,需要重新指定赋值区域,不能使用原有的字符数组赋值
// 字符串常量池不会存储相同内容的字符串
System.out.println(s1==s2);//比较s1,s2的地址值 true
System.out.println(s1);//abc
System.out.println(s2);//abc
System.out.println("**********************************");
String s3 = "abc";
s3 +="def";
//当对现有的字符串进行连接操作时,也需要重新指定赋值区域,不能使用原有的字符数组value赋值
System.out.println(s3);//abcdef
System.out.println("**********************************");
//当对现有的字符串的某个位置上的内容进行操作时,也需要重新指定赋值区域,不能使用原有的字符数组value赋值
String s4 = "abc";
String s5 = s4.replace("a","b");
System.out.println(s4);//abc
System.out.println(s5);//bbc
}
public static void main(String[] args) {
}
}
String不同拼接操作的对比
总结
- 常量与常量 的拼接结果在常量池中,且常量池中不会存在相同内容的常量
- 只要其中一个是变量,结果就在堆中
- 如果拼接的结果调用intern()方法,返回值就在常量池中
package String;
import org.junit.Test;
/*
* String不同拼接操作的对比
* 总结
* 常量与常量的拼接结果在常量池中,且常量池中不会存在相同内容的常量
* 只要其中一个是变量,结果就在堆中
* 如果拼接的结果调用intern()方法,返回值就在常量池中
* 补充:如果变量前面加了final修饰,就变成了常量
* */
public class StringTest03 {
@Test
public void Test() {
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 == s6);//false
System.out.println(s5 == s7);//false
System.out.println(s6 == s7);//false
String s8 = s5.intern();//返回得到的s8使用的常量值是已经存在的"JAVAEEhadoop"
System.out.println(s3==s8);//true
}
}
String类与其他结构的转换
package String;
import org.junit.Test;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Array;
import java.util.Arrays;
public class StringTest05 {
/*
* 测试String类与其他结构的转换
* String-->基本数据类型,包装类 调用包装类的静态方法:parseXxx(str)
*基本数据类型,包装类-->String 调用String重载的valueOf(xxx)方法
* */
@Test
public void test1(){
String str1= "123";
int i = Integer.parseInt(str1);//转化为int类型
System.out.println(i);
String s = String.valueOf(i);//转化为String类型
System.out.println(s);
}
/*
* String用char[]的转换
* String-->char[] :调用String的toCharArray()方法
* char[]-->String :调用String的构造器
* */
@Test
public void test2(){
String str1 = "acc123";
char[] charArray = str1.toCharArray();//转化为char[]类型
for (int i = 0; i <charArray.length ; i++) {
System.out.println(charArray[i]);
}
char[] arr = new char[]{
'h','e','l','l','o'};
//调用String类的构造器
String s = new String(arr);//转化为String类型
System.out.println(s);
}
/*
*String与byte[]之间的转换
* String-->byte[] :调用getBytes()方法
* byte[]-->String :调用String的构造器
* */
@Test
public void test3() throws UnsupportedEncodingException {
String s1 = "123abc中国";
//编码 字符串--》字节
//解码 字节--》字符串
//编码集和解码集要一致,不然会出现乱码
byte[] bytes = s1.getBytes();//使用utf-8字符集进行编码
System.out.println(Arrays.toString(bytes));
byte[] gbks = s1.getBytes("gbk");//使用gdk进行编码
System.out.println(Arrays.toString(gbks));
String s = new String(bytes);//转化为String类型 解码
System.out.println(s);
}
}