java中基本数据类型和引用数据类型在内存分配上有啥不同

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中基本数据类型和引用数据类型在内存分配上有啥不同相关的知识,希望对你有一定的参考价值。

Java的内存分配上,主要分4个块!
一块是用来装代码的,就是编译的东西。
一块是用来装静态变量的,例如用static关键字的变量,例如字符串常量。
一块是stack,也就是栈,是用来装变量和引用类型的!但区别在于,装了变量以后,变量上是有值的,而引用类型本身在stack上是没有值的。
一块是heap,也就是堆!堆可以一句话概括,装new出来的东西!

所以综上所述,基本数据类型都在stack中,而引用类型,变量是放在stack中,真正有内容的东西放在heap中,也就是当new了一个新的引用类型,他就会放在堆中,同时栈中的引用类型变量会指向堆中你new出来的东西!
这样说希望能帮你了解到java的内存分配问题。
参考技术A Java的内存分配上,主要分4个块,
一块是用来装代码的,就是编译的东西。
一块是用来装静态变量的,例如用static关键字的变量,例如字符串常量。
一块是stack,也就是栈,是用来装变量和引用类型的,但区别在于,装了变量以后,变量上是有值的,而引用类型本身在stack上是没有值的。
一块是heap,也就是堆,堆可以一句话概括,装new出来的东西,

所以综上所述,基本数据类型都在stack中,而引用类型,变量是放在stack中,真正有内容的东西放在heap中,也就是当new了一个新的引用类型,他就会放在堆中,同时栈中的引用类型变量会指向堆中你new出来的东西,
这样说希望能帮你了解到java的内存分配问题。
参考技术B 内存从大的方面可分为栈和堆。

java中的定义数据类型是告诉内存需要分配多少空间给某个变量使用。

java中的8种基本类型是在栈内存中开空间,其声明的基本类型变量的生命周期同变量规定的生命周期[离此定义的变量最近的大括号所对应的另一大括号之间的生命周期范围,过了范围则无效]。

java中的引用类型则分为两部分:
如Student nihility = new Student();
nihility-->为指向Student类型的句柄[这是我们特有的叫法],此句柄是定义在栈内存中,同基本类型
句柄存储的内容实质为内存地址[new 开空间返回的地址]

new -->真正的在内存中开空间[存此对象的属性值],是在堆内存中,返回内存地址,即句柄

若感觉难理解的话,给你说个生活例子吧:
栈内存的句柄就像是电视机的遥控器,而存到堆内存中的对象则是电视机,遥控器来操控电视机,就像通过句柄来操作对象的内容。所以在Java中随处可见,通过句柄来操作某对象的语法。
其实其中还有蛮多的内容需要我们慢慢体会的。。。
希望能帮到你。。。
参考技术C 这个问题复杂了,
基本数据类型都是存放在栈中。

引用数据类型基本上就是数据存放在堆中,在栈中存放一个一个引用,或者一个首地址。

你得找本关于java虚拟机的书才能看个大概。我感觉自己没有讲明白的。
参考技术D 基本数据类型都是存放在栈中。
引用数据类型一般存放在堆中,在栈中存放对其的引用,但有些优化也有可能一些对象放在栈上。

JavaScript中基本数据类型和引用数据类型的区别

参考技术A a 声明变量时不同的内存分配: 
1)原始值:存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。
这是因为这些原始类型占据的空间是固定的,所以可将他们存储在较小的内存区域 – 栈中。这样存储便于迅速查寻变量的值。
2)引用值:存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存地址。
这是因为:引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。
地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。
b 不同的内存分配机制也带来了不同的访问机制

1)在javascript中是不允许直接访问保存在堆内存中的对象的,所以在访问一个对象时,
首先得到的是这个对象在堆内存中的地址,然后再按照这个地址去获得这个对象中的值,这就是传说中的按引用访问。
2)而原始类型的值则是可以直接访问到的。

c 复制变量时的不同

1)原始值:在将一个保存着原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量是完全独立的,他们只是拥有相同的value而已。
2)引用值:在将一个保存着对象内存地址的变量复制给另一个变量时,会把这个内存地址赋值给新变量,
也就是说这两个变量都指向了堆内存中的同一个对象,他们中任何一个作出的改变都会反映在另一个身上。
(这里要理解的一点就是,复制对象时并不会在堆内存中新生成一个一模一样的对象,只是多了一个保存指向这个对象指针的变量罢了)。多了一个指针

d 参数传递的不同(把实参复制给形参的过程)

首先我们应该明确一点:ECMAScript中所有函数的参数都是按值来传递的。
但是为什么涉及到原始类型与引用类型的值时仍然有区别呢?还不就是因为内存分配时的差别。  
1)原始值:只是把变量里的值传递给参数,之后参数和这个变量互不影响。
2)引用值:对象变量它里面的值是这个对象在堆内存中的内存地址,这一点你要时刻铭记在心!
因此它传递的值也就是这个内存地址,这也就是为什么函数内部对这个参数的修改会体现在外部的原因了,因为它们都指向同一个对象。

以上是关于java中基本数据类型和引用数据类型在内存分配上有啥不同的主要内容,如果未能解决你的问题,请参考以下文章

java中的引用数据类型是啥意思?

JavaScript中基本数据类型和引用数据类型的区别

基本数据类型和引用数据类型的区别

[Java 基础]数据类型

基本数据类型介绍

基本数据类型介绍