JAVA基础知识|堆和栈
一、java六个存储数据的地方
1)寄存器(register):这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。
2)栈(stack):位于通用RAM中,这是一种快速有效的分配存储方法,仅次于寄存器。用于存放基本数据类型的变量和对象、数组的引用。
3)堆(heap):也位于通用RAM中,用于存放new出来的对象,用堆进行存储比用栈进行存储需要更多的时间。
4)静态存储(static storage):这里的“静态”是指“在固定的位置”。静态存储里存放程序运行时一直存在的数据,即关键字static标识的属性,但JAVA对象不会存放在静态存储空间里。
*为什么非静态方法,不可以使用静态属性?
因为静态方法和静态属性的编译要在非静态方法之后,当非静态方法编译使用的时候,静态属性还没生成,会导致报错!
5)常量存储(constant storage):常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时在嵌入式系统中,常量本身会和其他部分分割离开,所以在这种情况下,可以选择将其放在ROM中。所以常量存储用于存放final关键字修饰的字符串常量和基本类型常量。
6)非RAM存储:如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。
二、堆和栈
相同点:都用于存储数据
不同点:
1)栈用于存放基本数据类型的变量和对象、数组的引用,堆用于存放new出来的对象
2)栈中存放的数据,大小和生存期必须确定,灵活性不足。堆中存放的数据,不必知道数据大小,也不必知道生命周期,灵活性较高,导致速度较慢
3)生命周期
当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法中定义的变量将会放到这块栈内存里,随着方法的结束而销毁(不需要使用GC)。
当执行new对象的时候,数据才会在堆中生成,只有当一个对象没有任何引用变量去引用它时,系统的垃圾回收器(GC)才会在合适的时候回收它。
4)栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么放、放在哪儿。
/**
* 汽车类
*/
public class Car { //编号
private int id;
//车名
private String name;
//车速
private double speed; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public double getSpeed() {
return speed;
} public void setSpeed(double speed) {
this.speed = speed;
} public Car(int id, String name, double speed) {
this.id = id;
this.name = name;
this.speed = speed;
} public Car() {
} @Override
public String toString() {
return "Car{" +
"id=" + id +
", name='" + name + '\'' +
", speed=" + speed +
'}';
}
}
int i = 1;
Car car = new Car(1, "bmw", 200);
图形化分析:

继续看下面代码,并思考输出值
int i = 1;
Car car = new Car(1, "bmw", 200);
Car newCar = car;
newCar.setSpeed(300);
System.out.println(car.toString());
System.out.println(newCar.toString());
图形化分析:

代码中Car newCar = car;只是将引用的地址给了newCar,他们指向堆中同一个对象,所以当newCar对对象做出改变的时候,car所指向的对象也同样发生了变化。
有时候在代码中,我们不希望两个变量指向同一个对象,可以使用clone的方式,重新在堆中生成一个相同的对象。
JAVA基础知识|堆和栈的更多相关文章
- 十六、JAVA基础(堆和栈)
一.堆和栈 堆和栈都是JAVA中的存储结构,也就是说,都是内存中存放数据的地方. 1.堆:(存放由new创建的对象和数组) 引用类型的变量,内存分配一般在堆上或者常量池(字符串常量,基本数据类型常量) ...
- Java基础-JVM堆与栈
首先看一个解析列子 JVM的内存空间: (1). Heap 堆空间:分配对象 new Student() (2). Stack 栈空间:临时变量 Student stu (3).Code 代码区 :类 ...
- JAVA基础知识|java虚拟机(JVM)
一.JVM简介 java语言是跨平台的,兼容各种操作系统.实现跨平台的基石就是虚拟机(JVM),虚拟机不是跨平台的,所以不同的操作系统需要安装不同的jdk版本(jre=jvm+类库:jdk=jre+开 ...
- Java 基础知识总结
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.数据类型: 数据类型:1>.基本数据类型:1).数值型: 1}.整型类型(byte 8位 (by ...
- Java基础知识总结(超级经典)
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
- 毕向东—Java基础知识总结(超级经典)
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
- Java 基础知识总结1
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.数据类型: 数据类型:1>.基本数据类型:1).数值型: 1}.整型类型(byte 8位 (by ...
- 沉淀,再出发:Java基础知识汇总
沉淀,再出发:Java基础知识汇总 一.前言 不管走得多远,基础知识是最重要的,这些知识就是建造一座座高楼大厦的基石和钢筋水泥.对于Java这门包含了编程方方面面的语言,有着太多的基础知识了,从最初的 ...
- java基础知识一览(二)
一.java基础知识 1.一个文件中只能有一个public的类,因为他的类名要求和文件名相同. 2.classpath变量可以设置其它目录下的类. 例如:类文件所在目录是:F:\Javajdk,那么没 ...
随机推荐
- React/事件系统
React基于虚拟DOM实现了一个合成事件层,我们所定义的事件处理器会接收到一个合成事件对象的实例事件处理. 并且所有事件都自动绑定在最外层上.如果需要访问原生事件对象,可以使用nativeEvent ...
- 装机篇:ubuntu 14.04 在英文环境下安装中文输入法(转载)
ubuntu默认的输入法是ibus,综合网上评论,fcitx的支持者更多,而且个人感觉fcitx也的确不错,可以满足日常输入. STEP1: 在Ubuntu Software Center 搜索fci ...
- XML文件解析之JDOM解析
1.JDOM介绍 JDOM的官方网站是http://www.jdom.org/,JDOM解析用到的jar包可以在http://www.jdom.org/dist/binary/中下载,最新的JDOM2 ...
- sql注入原理,利用与防护
一.sql注入原理 注入攻击的本质就是把用户输入的数据当作代码来执行.所以注入攻击有两个必要条件 1.用户能够控制的输入. 2.原本程序要执行的代码,拼接了用户输入的数据. 二.sql注入分类 按照请 ...
- C++---初识《通过g++ / makefile 编译和调用动态库so文件》(ubuntu)
C++---初识<通过g++ / makefile 编译和调用动态库so文件>(ubuntu) ------------------------目录------------------- ...
- python:pycharm中使用pandas读取中文路径报错问题的解决方案
假如你的文件路径名是这样的,例如:test.csv 只要它是小文件(大文件采用分块读取,后续会补上文件分块读取的相关博客),你的内存扛得住,那就直接 import pandas as pd test ...
- Beyond Compare 4提示已经过了30天试用期
打开Beyond Compare 4,提示已经超出30天试用期限制,解决方法:1.修改C:\Program Files\Beyond Compare 4\BCUnrar.dll ,这个文件重命名或者直 ...
- ubuntu 18.04 enp8s0更改网口名称为eth0
尝试各种方法均不成功,后参考如下方法终于成功: 方法一:单纯改网卡名,重启后显示原网卡名. 如我的网卡名是enp8s0 >> ip link set enp8s0 down //关闭网卡 ...
- 详解es6中Proxy代理对象的作用
在es6中新添加了Proxy,那么它有什么作用啊?Proxy本意为代理,而es6中的Proxy也就是代理对象,那么代理对象感觉听起来很模糊,在这里就解释一下Proxy代理对象的作用. Proxy的主要 ...
- 第六章 Flask数据库(二)
Flask-SQLALchemy Flask-SQLALchemy 是一个给你的应用添加 SQLALchemy 支持的 Flask 扩展. 它需要 SQLAlchemy 0.6 或更高的版本.它致力于 ...