String
String存储结构改变?
有char改为byte,String再也不用char[]来存储,改为byte[]加上编码标记,节约了一些空间
String s1 = "a"; String s2 = "b"; String s3 = “ab”;
String s4 = s1+s2;
等价于StringBuilder s = new StringBuilder();
s.append("a");
s.append("b");
此时S3不等于S4,它先是通过StringBuilder的tostring方法,然后是new String()重新创建了一个对象,而s3是常量池中的,s4是堆中的。
final String s1 = "a"; final String s2 = "b"; String s3 = "ab"; String s4 = s1+s2;
用final修饰,此时s3==s4
String s1 = new String(“ab”)创建了2个对象,一个在堆中,一个在常量池中。此时s1的引用是指向堆中的,堆中的那个引用才是指向字符串常量池。
String s1 = new String(“a”) + new String(“b”)创建了6个对象。
对象1:“变量+变量”,所以创建了一个StringBuilder
对象2 3 : new String(“a”),这边创建了2个,一个堆中,一个字符串常量池
对象4 5: new String(“b”),同理创建了2个
对象6:在上面创建了StringBuilder之后,它是调用他的toString方法,创建出new String(char[a,b]),参数是字符数组,对应的构造方法不同,所以不用在字符串常量池创建ab

intern()的作用?
判断改字符是否在常量池中存在,没有则创建字符并返回该地址引用。
String a1 = new String("1") + new String("1"); a1.intern(); String a2 = "11"; System.out.println(a1 == a2);
在jdk1.6中,a1不等于a2;在jdk1.7之后,a1等于a2.
在jdk1.6之前,字符串常量池是在永久代中,不存在于堆中,当调用intern时,他会重新创造一个对象“11”,也有新的地址。
在jdk1.7及以后,字符串常量池是存放在堆中,当调用intern时,我们堆中此时已经有了对象“11”,所以字符串常量池会直接拷贝堆中“11”的地址,所以此时a1等于a2.
浙公网安备 33010602011771号