java中的基本数据类型和引用数据类型以及它们的存储方式堆内存和栈内存

  一直对java中的基本数据类型和引用数据类型之间的关系搞不太清楚,今天做leetcode的一道题目,总算弄清楚了关系。写下来和大家一起分享一下。


  一 基本数据类型

  数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式。基本类型:简单数据类型是不能简化的、内置的数据类型、由编程语言本身定义,它表示了真实的数字、字符和整数。在java中基本数据类型一共有8种,包括

byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0;

short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0;

int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0;

long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L;

float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数字(与double的区别在于float类型有效小数点只有6~7位),默认值0;

double:双精度浮点型,用于存储带有小数点的数字,在内存中占64位,即8个字节,默认值0;

char:字符型,用于存储单个字符,占16位,即2个字节,取值范围0~65535,默认值为空;

boolean:布尔类型,占1个字节,用于判断真或假(仅有两个值,即true、false),默认值false;


  二 引用数据类型

  引用数据类型:Java语言本身不支持C++中的结构(struct)或联合(union)数据类型,它的复合数据类型一般都是通过类或接口进行构造,类提供了捆绑数据和方法的方式,同时可以针对程序外部进行信息隐藏。引用数据类型分3种:类,接口,数组;

 三 数据类型与内存的关系

  java把内存分为两种,一种是堆内存,一种是栈内存。

  基本类型类型以及对象的引用变量是存储在栈内存中, 当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。

  而对象本身的值或者说new创建的对象和数组是存储在堆内存中。 在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量(对象的引用变量),这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。

  数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!

  找了一个图,可以更形象的描述它们之间的关系。
java中的基本数据类型和引用数据类型以及它们的存储方式堆内存和栈内存_第1张图片
  


  四 java中内存分配策略

  按照编译原理的观点,程序运行时的内存分配有三种策略:静态的,栈式的,堆式的。
  
  静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配特定的存储空间。静态存储分配要求程序中不允许有可变数据结构的存在(比如数组,链表),也不允许有嵌套或者递归的结构出现,因为它们会导致编译程序无法计算准确的存储空间需求。

  栈式分配(动态存储分配)是由一个类似于堆栈的运行栈来实现的。在栈式存储方案中, 程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存.和我们在数据结构所熟知的栈一样,栈式存储分配按照先进后出的原则进行分配。 

  静态存储分配要求在编译时能知道所有变量的存储要求,栈式存储分配要求在过程的入口处必须知道所有的存储要求,而堆式存储分配则专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配,比如可变长度串和对象实例.堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释放. 


  五 java中的堆和栈  

  栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 

  Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。 

  栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。 

你可能感兴趣的:(JAVA学习)