Java复习笔记11--Stack&Heap

stack 栈 & heap 堆

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

2.栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。

  1. Java中的数据类型有两种。

一种是基本类型(primitive types), 共有8种,即int, short, long, byte, float, double, boolean, char(注意, 并没有string的基本类型)。这种类型的定义是通过诸如int a = 3; long b = 255L;的形式来定义的,称为自动变量。值得注意的是, 自动变量存的是字面值,不是类的实例,即不是类的引用,这里并没有类的存在。如int a = 3; 这里的a是一个指向int类型的引用, 指向3这个字面值。这些字面值的数据,由于大小可知,生存期可知(这些字面值固定定义在某个程序块里面,程序块退出后,字段值就消失了), 出于追求速度的原因,就存在于栈中。 另一种是包装类数据,如Integer, String, Double等将相应的基本数据类型包装起来的类。这些类数据全部存在于堆中,Java用new() 语句来显示地告诉编译器,在运行时才根据需要动态创建,因此比较灵活,但缺点是要占用更多的时间。

即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!

1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.

  1. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
  2. 堆:存放所有new出来的对象。
  3. 静态域:存放静态成员(static定义的)
  4. 常量池:存放字符串常量和基本类型常量(public static final)。
  5. 非RAM存储:硬盘等永久存储空间
时间: 2024-12-25 07:47:40

Java复习笔记11--Stack&Heap的相关文章

JAVA复习笔记:内存结构和类加载

Part1:JVM内存结构 JVM定义了若干个程序执行期间使用的数据区域.这个区域里的一些数据在JVM启动的时候创建,在JVM退出的时候销毁.而其他的数据依赖于每一个线程,在线程创建时创建,在线程退出时销毁 可以把JVM内存结构为2个部分: 线程私有部分: 1. Program Counter Register(程序计数器):一块较小的内存空间, 作用是当前线程所执行字节码的行号指示器(类似于传统CPU模型中的PC), PC在每次指令执行后自增, 维护下一个将要执行指令的地址. 在JVM模型中,

Java复习笔记1--抽象类和接口

这一系列是今年7月份至8月份为实习面试所复习的Java功课~ 抽象类和接口 是Java 对抽象概念进行定义的2种机制. 抽象类 一个类没有足够的信息来描述一个具体的对象,需要其他具体的类才支撑它. 抽象类体现了数据抽象的四小,是实现多态的一种机制. 它定义了一组抽象的方法,至于这组抽象方法的具体表现形式有派生类来实现.同时抽象类提供了继承的概念,它的出发点就是为了继承,否则它没有存在的任何意义.所以说定义的抽象类一定是用来继承的,同时在一个以抽象类为节点的继承关系等级链中,叶子节点一定是具体的实

Java学习笔记 11/15:一个简单的JAVA例子

首先来看一个简单的 Java 程序. 来看下面这个程序,试试看是否看得出它是在做哪些事情! 范例:TestJava.java // TestJava.java,java 的简单范例 public class TestJava { public static void main(String args[]) { int num ; // 声明一个整型变量 num num = 3 ; // 将整型变量赋值为 3 // 输出字符串,这里用"+" 号连接变量 System.out.printl

大四Java复习笔记之Java基础

一.static和final 学习Java那么久,好像自己就没有怎么用过final,所以对fianl的理解不够.final不但出现在变量的修饰里面,还可以出现在方法和类的修饰.final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的.final方法锁定方法,子类不能覆盖修改方法,同时方法会高效.final变量final修饰的成员变量表示常量,只能被赋值一次,赋值后值无法改变,final是指引用的变量不能不能变,但是引用所指向的对象中的内容可以变,同时如果是null的

JAVA复习笔记分布式篇:zookeeper

前言:终于到分布式篇,前面把JAVA的一些核心知识复习了一遍,也是一个JAVA程序员最基本要掌握的知识点,接下来分布式的知识点算是互联网行业的JAVA程序员必备的技能: 概念:ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是谷歌的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护.域名服务.分布式同步.组服务等 关键词:分布式,一致性服务 讲得通俗一点,zookeeper的诞生就是为了解决分布

Java基础笔记11

异常: 即java程序在运行时出现的意外情况.  java如何处理异常. try{ //可能发生异常的地方 }catch(异常类型 对象){  //异常处理处 }catch(异常类型 对象){ }......finally{ //不管有没有异常都会执行. 关闭资源. }下面的catch的异常类型范围不得小于上面catch异常类型的范围. 常见的异常,以及如何排除一些常见的异常. ArithmeticException:算术异常  例:运算遇到10/0是 NumberFormatException

Java学习笔记11

Object类是所有类.数组.枚举类的父类,是类层次结构的根类.每个类都使用Object作为超类.所有对象(包括 数组)都实现这个类的方法. Object类实现了以下方法: 我们来看看在源码中registerNatives()方法: private static native void registerNatives(); static { registerNatives(); } 从上面的代码中看到Object类定义了一个静态初始化块,我们知道当创建Java对象时,系统总是先调用静态初始化块

Java复习笔记8--内部类

Java内部类 在<Think in java>中有这样一句话:使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响.接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整. 其实使用内部类最大的优点就在于它能够非常好的解决多重继承的问题,但是如果我们不需要解决多重继承问题,那么我们自然可以使用其他的编码方式,但是使用内部类还能够为我们带来如下特性(摘自<Think in java>

Java复习笔记7--Java封装

Java封装 getter() & setter() 使用封装有三大好处: 1.良好的封装能够减少耦合. 2.类内部的结构可以自由修改. 3.可以对成员进行更精确的控制. 4.隐藏信息,实现细节. Java继承 继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类.通过使用继承我们能够非常方便地复用以前的代码,能够大大的提高开发的效率. 实际上继承者是被继承者的特殊化,它除了拥有被继承者的特性外,还拥有自己独有得特性.