String源码
public final class String implements java.io.Serializable, Comparable<String>, CharSequence{
private final char value[];
private int hash;
...
}
String的实例化
String s1="hello";//字面量实例化
String s2=new String();//本质是this.value=new char[0];
String s3=new String(String original);//本质是this.value=original.value;
String s4=new String(char[] a);//this.value=Arrays.copyOf(value, value.length);
String s5=new String(char[] a, int startIndex, int count);
总体来说:
String的实例化方式:
* 方式1:通过字面量定义的方式:存放到方法区中的字符串常量池中
* 方式2:通过new + 构造器的方式:存放到堆中
String:字符串,使用一对""引起来表示
s1+="def";则内存地址已经变了
String s3="abc"; String s4=s3.replace('a', 'm');
面试题:String s=new String(“abc”);方式创建对象,在内存中创建了几个对象?
2个:1个是堆空间中new的String的结构value,另一个是char[]对应的字符串常量池中的数据,即"abc"
1.常量与常量的拼接结果在常量池中,且常量池中不会存在相同内容的常量
2.只要其中有一个是变量,结果就在堆中
3.intern()方法可以返回字符串常量池中的地址值
String s1="hello";
String s2="world";
String S3="helloworld";
String s4="hello"+"world";
String s5=s1+"world";
String s6=s1+s2;
String s7=s5.intern();//此时返回的s7是常量池中已经存在的"helloworld"的地址值
解析: