美文网首页java自学
Java之内存分析和String对象

Java之内存分析和String对象

作者: 孙浩j | 来源:发表于2017-11-21 19:45 被阅读4次

    内存分区:

    注:不是所有基本类型都存在栈中

    heap:堆,动态申请内存(new出来的)成员变量(实例变量),当新建一个对象的时候,,JVM为类分配空间,这个空间的大小就是实例变量的大小,当实例变量带一个对象引用变量的时候,引用的这个对象并不占原对象的空间

    三种方法释放对象的引用:

    (1)引用在方法结束后消失

    (2)引用被赋值到其他对象上

    (3)直接将引用设定为null   //类似拿到一个没有电视的遥控器,使用null. 会报空指针错

    stack:栈(先进先出),存局部变量,引用变量,对象句柄,基本类型(方法中),调用时的对象的方法,当方法调用时位于栈顶,直到方法被使用完,当方法1内调用方法2,这时方法2位于方法1的上边,先执行方法2再执行方法1

    方法区:静态成员,构造函数,常量池,线程池。方法

    String对象

    String a = "abc";①

    String b = "abc";②

    分析:

    ①代码执行后在常量池(constant pool)中创建了一个值为abc的String对象,②执行时,因为常量池中存在"abc"所以就不再创建新的String对象了。所以只创建了一个对象

    2)

    String  c  =newString("xyz");①  String  d  =newString("xyz");②

    分析:①Class被加载时,"xyz"被作为常量读入,在常量池里创建了一个共享的值为"xyz"的String对象;然后当调用到new String("xyz")的时候,会在堆(heap)里创建这个new   String("xyz")对象;②由于常量池(constant pool)中存在"xyz"所以不再创建"xyz",然后创建新的new String("xyz")。

    ②String  s1  =newString("xyz");//创建1个对象(常量池已经有“xyz”了, 堆 中创建一个),

    字符串创建对象后不可以改变

    Person[] p=new Person[5]  这句话的意思就是建立一个5个空间大小的数组,然后将引用赋给p

    p[0]=new Person()     建立一个Person对象,将它的引用赋给了数组里的第一个位置,P[0]指向的是数组的第一个位置,所以p[0]引用了这个建立的Person对象

    数组里装的其实是对象的地址,从而数组的每一个位置获得了对象的引用

    Integer t1=12;

    int t2=12;

    t1等于t2么?       将12赋值给t1的时候进行了自动打包,返回的是一个Integer类型,t1,t2比较的时候t1进行了自动解包返回的是一个int型的12,这时候,变量t1和变量t2都指向常量池中的一个12,所以它俩相等

    Integer t1=128;

    Integer t2=128;

    这时候t1,t2相等么??不相等,可以理解为当数大于128的时候,他们不会自动转换为int型比较,而是直接通过对象比较

    相关文章

      网友评论

        本文标题:Java之内存分析和String对象

        本文链接:https://www.haomeiwen.com/subject/qsybyxtx.html