java虚拟机系列之一些重要的概念(数据类型以及栈和堆)

时间:2022-12-27 13:05:59

  这几天,总听见我的朋友们在面试或者是笔试的时候总会遇到一些跟java虚拟机有关的一些题目,而我又恰巧在深入的理解java的虚拟机这部分,所以就来谈谈有关java虚拟机的一些概念。

1.我觉得首先就是要理解好java虚拟机的数据类型

可能很多人都会说,java的数据类型不也就是两个吗?(1)基本数据类型 (2)引用类型      是的,确实是这样的,但是我觉得我们在使用的时候会很少的去思考,我们每写一行代码,运行或者是编译的时候,java虚拟机为我们做了什么事,我们大多数时候都是不知道的,或者说不关心,很长时间下来就会形成一个习惯,遇到一些我们没有遇到的问题就是慌,反正我前段时间就是吃了这部分的亏。好了,回到这里来,那么什么是基本数据类型呢?什么又是引用类型呢?

(1)基本类型:byte,char,int,double,float,short,long,boolean,returnAddress.

(2)引用类型:类类型,接口类型还有数组。

平常我们用的很多,但是基本数据类型是什么呢?我觉得可以理解为,基本类型的变量保存他的原始值,也就是他所代表的数值就是本身。而引用类型的话,可以理解为他就是声明了一个对象的引用,引用的是其他的对象(指向它的内存地址)。

举个简单的例子来说吧:

(1)比如我们定义一个:int i = 5;这个是属于基本类型的,我们就可以认为i的值就是等于5,他存在于栈中。

(2)比如我们定义一个:String str = "hello world";这就是引用类型,str 代表的就是引用后面那个String对象的内存地址,放在堆内存中

明白了这些,对于一个关键字的使用,也会有很大的理解,比如final 修饰一个对象,final Object object = new Object();这就说明了这个对象的引用是不可变的,我们不能再让他指向另一个对象的地址。

2.一个看似很简单的问题,里面的门道确是很多的,比如:"=="和"equals"的区别?

我相信很多人可能会这么说,==比较的是两个对象是否相等,equals比较的是对象的内容是否一致。这样的回答或许是正确的,但是我觉得没有说到点里面去,我觉得这最好是从上面我们谈到的引用类型来说,==比较的使两个对象的引用是否相等,这就是说引用对象的内存地址是否一致,就是比较对象的hashCode,而equals这个方法使我们自己定义里面的值是否相等,如果我们想,可以自己去重写equals方法。比如我们经常会遇到的就是比较一些包装类型equals值是否一致,其实就是java他本身帮我们重写了equals方法。

包装类型有:Byte,Character,Integer,Double,Float,Boolean,Short,Long。这些因为重写equals的方法。

3.理解了数据类型,那接下来就是另外两个更重要的概念Stack(栈)和 Heap(堆)

堆和栈式程序运行时的两个重要的概念,栈是运行时的单位,堆是存储时的单位。

如果了解上面所说的类型,那么这两个概念就会简单的多,比如说基本数据类型,引用类型其实在运行的时候都是存在栈中的,而我们所定义的对象,即new一个对象是申请一个内存地址,而这个内存地址在java虚拟机中叫做堆。,可以通过一幅图来了解:

java虚拟机系列之一些重要的概念(数据类型以及栈和堆)

这两个的关系,用一句话就是,他们负责的职责不一样,在java程序中,每个线程都会有一个线程栈对应着,这就说明了在栈的数据是私有的,但是我们可以引用了堆中的数据,所以堆是可以共享的,就是可以线程共享的。因此栈里面存储的信息都是跟当前 线程(或程序)相关。比如说局部变量、程序运行状态、方法返回值等等;而堆只负责存储对象信息。用一句清晰的话来所就是:"我是栈,是负责处理逻辑的,运行时的,然后我是堆,我只是负责生产数据的"。换而言之,就是栈相当于工人,把产品组装起来。

好了,今天就先谈到这,我觉得对于堆和栈的理解是认知java虚拟机的关键,还有为什么要堆和栈分离,这些我打算在下一篇中深入的介绍。