再回顾堆栈

1.数据类型

Java虚拟机中,数据类型有两种,基本类型和引用类型。

基本类型变量保存的是值本身,引用类型保存的是值的引用。

基本类型:byte,char,short,int,long,float,double,Boolean,returnAddress。

引用类型:类类型,接口类型和数组。

2.栈(stack)与堆(heap)


在Java中,一个线程就会有一个线程栈与之对应,而堆则是所有线程共享的。栈因为是运行单位,存储的信息都是与当前线程相关的,包括局部变量,程序运行状态,方法返回值等,而堆只负责存储对象信息。

问题,为什么要把栈和堆区分开,栈中不是也可以存储数据么?

第一, 从软件设计的角度来看,栈代表的是逻辑处理,堆代表的是数据,分而治之。

第二, 堆和栈的分离,使得堆中的内容可以被多个栈共享(也可以理解为多个线程访问同一个对象),这提供了一种有效的数据交互方式,如共享内存,堆中的共享常量和缓存可以被所有栈访问,节省了空间。

第三, 栈因为运行的需要,比如保存系统运行的上下文,需要对地址段进行划分。由于栈只能向上增长,所以限制了栈存储内容的能力。而堆不同,堆中的对象可以根据需要动态增长,因此把栈和堆区分开,使得动态增长成为可能,栈中只需要记录堆中的一个地址即可。

第四, 面向对象就是栈和堆的完美结合。当我们把对象拆分开来看,对象的属性就是数据,存放在堆中,对象的方法就是运行逻辑,存放在栈中。我们在编写对象的时候,既编写了数据结构,也编写了处理数据的逻辑。

问题,堆中存什么,栈中存什么?

堆中存的是对象,栈中存的是数据类型和堆中对象的引用,一个对象的大小是不可估计的,因为是动态变化的,但是在栈中,一个对象只对应了4byte的引用

问题,Java中参数的传递是传值呢,还是传引用?

先明确两点,Java中没有指针,程序运行永远是在栈中的,所以参数传递时,只存在传递基本类型和对象引用的问题,不存在直接传对象本身。容易产生传引用的错觉,是由于在运行栈中,基本类型和引用的处理是一样的,都是传值。栈是程序中最根本的东西,程序运行可以没有堆,但不能没有栈。

3.Java对象的大小

Objectobj=new Object();

在Java中完成了一个对象的生命,它所占的空间为8byte+4byte,4byte表示Java栈中保存引用所需的空间。

ClassNewObject{

    Int count; boolean isTrue; Object obj;

}

其大小分别为4byte,1byte,8byte+4byte=17byte,Java对象大小是8的倍数,因此此对象的大小是24byte。

4.引用类型

对象引用类型有强引用,弱引用,软引用,虚引用

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值