字符串相关的类
String类
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:字符串,使用一对""引起来表示
- 1.String声明为final的,不可被继承
- 2.String实现Serializable接口:表示字符串是支持序列化的
实现Comparable接口:表示字符串可以比较大小 - 3.String内部定义了final char[] value用于存储字符串数据
- 4.String代表不可变的字符序列。简称:不可变性
体现:1.当对字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的value进行赋值。//见内存解析
2.当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。s1+="def";则内存地址已经变了
3.当调用String的replace()方法修改指定的字符或字符串时,也需要重新指定内存区域赋值。String s3="abc"; String s4=s3.replace('a', 'm');
- 5.通过字面量的方式(如String s1=“abc”;)(区别于new的方式)给一个字符串赋值,此时的字符串值声明在方法区的字符串常量池中
- 6.字符串常量池中是不会存储相同内容的字符串的
面试题
面试题:String s=new String(“abc”);方式创建对象,在内存中创建了几个对象?
2个:1个是堆空间中new的String的结构value,另一个是char[]对应的字符串常量池中的数据,即"abc"
内存解析1
内存解析2
内存解析3
内存解析4
小结论
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"的地址值
解析: