String:
final两层含义,1-不可以被继承,2-不可变。
最经典的比较:
String s1 = new String(“myString”); //编译期间不能确定,运行去堆中开辟空间。
String s2 = “myString”;
String s3 = “my” + “String;
System.out.println(s2 == s3);--->true,都取自常量池
System.out.println(s1 == s2); --->false,不是说String数据存储在常量池中么?切常量池中的内容不重复.....
此处要补充一个常量池特点:
常量池(constant pool)指的是String在编译期被确定的,就会放到常量池中一份。
此处有两个点:1-编译期间,也就是说new这个创建对象是在运行期间才能执行的代码,在编译期间是不能被确定的。2-被确定,是说在编译期间就能确定变量是不是常量(eg:String a = "my"+new String("123") 此处new的就是不能被确定的)。
编译期间:将.java--->.class .class文件是jvm能直接运行的文件。 .class文件结构:魔数、版本号、常量池、访问符、类-超类-接口、字段、方法、属性等。其中常量池
内存分配图:
疑问:图中红色线是否存在?String堆和常量池的关系?
String中有个intern()方法,取的是常量池中的字符串。