Java之内存分析和String对象

内存分区:

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

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型比较,而是直接通过对象比较



©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,764评论 18 399
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,518评论 0 3
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 7,141评论 0 62
  • 1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?答:可以有多个类,但只能有一个publ...
    岳小川阅读 960评论 0 2
  • 身体感觉被掏空了 每天好像行尸走肉一样 做的自己不喜欢的事儿 每个人的泪点不一样 工作谈不上喜欢 就是感觉那是我不...
    一只笨乌龟的日更日读阅读 101评论 0 0