本篇对String结合源码和常量池进行总结
String是java中一个常用的引用类型。
先看String源码:
所以String底层是由char[]数组存储数据的。那么String的最大长度应该是多少呢?
由于String底层是char[]数组,所以其允许的长度是固定的, 由于char[]数组的元素是由下标来定位的,而下标的类型为int,所以char最多只能表示2^31 - 1(2G-1),也就是说string可以表示的长度为2^31 - 1,由于char占用两个字节,所以所占空间还要*2,既4G以内。
常量池
String a = "hello"; 其中a指向常量池中的"hello";
String a1 = "he"+"llo"; 其中a1指向常量池中的"he"和"llo"相加合并后的地址"hello",由于常量池中都是静态常量,hello字符串只有一个既a所以a1==a;
1.1,
String a = "hello";
String a1 = "he"+"llo";
System.out.println(a==a1);//true
String a2 = "he"+new String("llo");
System.out.println(a1==a2);//false
System.err.println(a1==a2);//false
System.err.println(a==a2);//false
a,a1都是在常量池中的,a2就是生成llo对象合并之后生成a2对象放在堆中的,所以用==判断内存地址时结果如上
1.2
publicstatic void main(String[] args) {
Stringstr01 = "AB";
Stringstr02 = "AB";
StringBufferstr03 = new StringBuffer("AB");
StringBufferstr04 = new StringBuffer("AB");
testStr01(str01);
testStr02(str02);
testStr03(str03);
testStr04(str04);
System.out.println(str01);//AB
System.out.println(str02);//AB
System.out.println(str03);//ABCD
System.out.println(str04);//AB
}
privatestatic void testStr01(String str){
str = str+"CD";
}
privatestatic void testStr02(String str){
str = "CD";
}
privatestatic void testStr03(StringBuffer str){
str.append("CD");
}
privatestatic void testStr04(StringBuffer str){
str=new StringBuffer("CD");
}