通过内存解析String的基本原理

来源:互联网 发布:python自学 编辑:程序博客网 时间:2024/05/29 12:55

1.java中String类型有两种赋值方式:直接赋值,如:String s = "a";     通过new赋值     如String s = new String("a");

2.String类型是引用类型,其内存地址开辟在堆取。但是在堆区有一块区间称为字符串常量池。这块区间是用来干嘛的呢?当直接赋值时,要看值在编译期能不能确定,若能就会在常量池中创建对象,若不能就会在运行期时在堆区(字符串常量池外)创建对象。

3.哪些情况是在编译器能过确定值得呢。(1).直接附明确的值 如:String s ="a";(2). 通过final关键字   如:final String s = "a"; String s1 = s +1;   不确定的情况有  (1)没有使用关键字final  如:String s = "a"; String s1 = s+1;  此时s是变量在编译的时候不能确定其值,故s1在编译器不能确定值,会在运行期在堆中创建对象。(2)String s = getString()+1; 这里的getString会返回一个字符串,无论有没有fianl关键字,都会在堆中开辟空间。

4.直接赋值时,是至多只创建一个对象。如何理解呢?String s ="a";此时会在字符串常量池中常见一个对象,存储"a",如果再有String s1 = "a";那么就不会再创建对象了,因为字符串常量池中已经有了“a” .此时s1只是只想这个“a”即可。

5.用new关键,是至少创建一个对象。String s = new String("a");  它会先检查在字符串常量池中是否有对象“a”.如果没有,则会先在字符串常量池中创建“a”对象,然后再在堆中创建"a"对象,s指向这个对象。如果常量池中已经有了这个对象,则只在堆中创建即可。

0 0
原创粉丝点击