Java进阶之路 - 基本数据类型与引用数据类型

基础知识整理,首次用XMind写Blog > <
现有知识储备 + 五篇左右Blog综合而成

目录

  • 数据类型结构图
  • 数据类型概念
  • 存储区域(目前不详细,后续会单独写一篇补全)
  • 堆与栈
数据类型结构图

Java进阶之路 - 基本数据类型与引用数据类型


数据类型概念
  • 基本数据类型

简单数据类型是不能简化的、内置的数据类型、由编程语言本身定义,它表示了真实的数字、字符和整数

存储区域 → 基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上

存储原理 → 所有的简单数据类型不存在“引用”的概念,基本数据类型都是直接存储在内存中的内存栈上的,数据本身的值就是存储在栈空间里面,而Java语言里面八种数据类型是这种存储模型

  • 引用数据类型

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

存储区域 → 引用数据类型在被创建时,首先要在栈上给其引用(句柄)分配一块内存,而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆中对象的地址

存储原理 → 引用类型继承于Object类(也是引用类型)都是按照Java里面存储对象的内存模型来进行数据存储的,使用Java内存堆和内存栈来进行这种类型的数据存储,简单地讲,“引用”是存储在有序的内存栈上的,而对象本身的值存储在内存堆上的

  • 俩者区别

基本数据类型和引用类型的区别主要在于基本数据类型是分配在栈上的,而引用类型是分配在堆上的(需要java中的栈、堆概念,下面就有讲到 ~)


存储区域
静态区

保存自动全局变量和 static 变量(包括 static 全局和局部变量)。静态区的内容在总个程序的生命周期内都存在,由编译器在编译的时候分配

常量区

常量字符串就是放在这里的。 程序结束后由系统释放

非RAM存储

硬盘等永久存储空间


堆与栈

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

回收场景 (只有堆中类没有对应的引用,GC才可自动进行回收)

Java进阶之路 - 基本数据类型与引用数据类型

堆区

一般由程序员分配释放,由 malloc 系列函数或 new 操作符分配的内存,其生命周期由 free 或 delete 决定。在没有释放之前一直存在,直到程序结束,由OS释放。其特点是使用灵活,空间比较大,但容易出错

  • 优势
    堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据
  • 劣势
    由于要在运行时动态分配内存,存取速度较慢
栈区

由编译器自动分配释放,保存局部变量,栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁,其特点是效率高,但空间大小有限

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