public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
}
1、声明: final:String是不可被继承的 Serializable :可以被序列话的接口 凡是实现此接口的对象可以通过网络或者本地流进行传输 Comparable<String>:凡是实现此接口的类 此对象可以比较大小 CharSequence:字符序列
1.2、内部声明的属性 jdk8中: private final char value[]; 存储字符串的容器 final:此处一旦指明,表示此value数组一旦初始化,其地址不可变 jdk9及以后: private final byte[] value; 从char数组变成byte数组为了节省内存空间
2、字符串量存储位置 字符串常量都存储在字符串常量池中(StringTable) 字符串常量池不允许存两个相同的常量 字符串常量池在不同的jdk版本中 存放的地址不同 jdk7之前 存储在方法区 jdk7存放在堆中 原因是基于jdk基于gc考虑
3、String的不可变性理解 1、当需要重新赋值时 需要重新指定一个字符串常量的位置进行赋值,不能在原有的位置修改 2、当对现有的字符串进行拼接操作时 需要重新开辟空间保存拼接后的字符串不能在原有位置修改 3、当调用replace替换某个字符时,需要重新开辟新的空间保存修改后的字符
4、连接操作 (1)常量+常量 结果仍然在字符串常量池中 此时的常量有可能是常量 也有可能是final修饰的变量(有final修饰的属性就变成了常量了) (2)变量+变量 或者 常量+变量 都会通过new Stringbulider tostring 返回的是新对象的地址 在堆中 (3)调用字符串的intern() 调用此方法 返回的是字符串常量池中的地址 如果常量池中没有就进行创建 concat 拼接字符串 不管是参数调用还是常量调用 返回的都是新new的对象
@Test
public void test02(){
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
String s4 = new String("hello");
System.out.println(s1==s2);//true
System.out.println(s1==s3);//f
System.out.println(s1==s4); //f
System.out.println(s3==s4); //f
System.out.println(s1.equals(s4)); //只比较值 是相等的 其他的都是相等的
System.out.println();
/**
* String s3=new String("hello");
* 内存解析 或者是 此代码在内存中创建了几个对象 2个 一个堆中的对象new String 堆中的对象指向”hello“
*/
}
@Test
public void test03(){
String s1="hello";
final String s11="hello";
String s2="world";
String s3="helloworld";
String s4="hello"+"world";
//s5 底层实际操作是 1、new StringBulider() 2、用StringBulider.Append(s1)利用append方法将s1加进去 再将”world“字符串加进去 3、调用tostring方法再将其返回给s5
String s5=s1+"world";
String s55=s11+"world";
String s6="hello"+s2;
String s7=s1+s2;
System.out.println(s3==s4);//true
System.out.println(s3==s5);//f
System.out.println(s3==s6);//f
System.out.println(s3==s7);//f
System.out.println(s5==s6);//f
System.out.println(s5==s7);//f
String s8=s5.intern();//intern返回的是字符串常量池中的值
System.out.println(s8==s3);
System.out.println(s55==s3); //final修饰的变量 可以看做是常量
}
5、String的常用方法
@Test
public void test01(){
/**
* String与char相互转换
*/
String s1="qwer";
char[] chars = s1.toCharArray();
System.out.println(chars);
for (int i = 0; i < chars.length; i++) {
System.out.println(chars[i]);
}
/**
* char转换数组 直接调用String方法构造器
*/
String s = new String(chars);
System.out.println(s);
}
@Test
public void test03(){
//isEmpty()
String s1 ="";
String s2=new String();
String s3=new String("");
System.out.println(
s1+s2+s3
);//都是true,使用时必须是实例
int length = s1.length();
System.out.println(length);
String s4="中国人民解放军";
boolean china = s4.startsWith("中国");
System.out.println(china);//以什么开始
}