一、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基础知识|堆和栈的更多相关文章

  1. 十六、JAVA基础(堆和栈)

    一.堆和栈 堆和栈都是JAVA中的存储结构,也就是说,都是内存中存放数据的地方. 1.堆:(存放由new创建的对象和数组) 引用类型的变量,内存分配一般在堆上或者常量池(字符串常量,基本数据类型常量) ...

  2. Java基础-JVM堆与栈

    首先看一个解析列子 JVM的内存空间: (1). Heap 堆空间:分配对象 new Student() (2). Stack 栈空间:临时变量 Student stu (3).Code 代码区 :类 ...

  3. JAVA基础知识|java虚拟机(JVM)

    一.JVM简介 java语言是跨平台的,兼容各种操作系统.实现跨平台的基石就是虚拟机(JVM),虚拟机不是跨平台的,所以不同的操作系统需要安装不同的jdk版本(jre=jvm+类库:jdk=jre+开 ...

  4. Java 基础知识总结

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.数据类型:  数据类型:1>.基本数据类型:1).数值型: 1}.整型类型(byte  8位   (by ...

  5. Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  6. 毕向东—Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  7. Java 基础知识总结1

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.数据类型:  数据类型:1>.基本数据类型:1).数值型: 1}.整型类型(byte  8位   (by ...

  8. 沉淀,再出发:Java基础知识汇总

    沉淀,再出发:Java基础知识汇总 一.前言 不管走得多远,基础知识是最重要的,这些知识就是建造一座座高楼大厦的基石和钢筋水泥.对于Java这门包含了编程方方面面的语言,有着太多的基础知识了,从最初的 ...

  9. java基础知识一览(二)

    一.java基础知识 1.一个文件中只能有一个public的类,因为他的类名要求和文件名相同. 2.classpath变量可以设置其它目录下的类. 例如:类文件所在目录是:F:\Javajdk,那么没 ...

随机推荐

  1. 普通选项卡+自动播放功能+向前/向后按钮 原生js

    今天做了幻灯片,主要功能包括:普通选项卡,向前/向后播放按钮,向前?向后播放功能,自动播放功能 要实现简单选项卡功能是没有问题的,但是添加功能就出现各种各样的问题了 遇到的问题:1 下标问题 2普通选 ...

  2. vscode 使用ESLint 自动检查,保存时自动格式化

    1:全局安装eslint `npm install -g eslint`2: 打开vscode 点击 “文件”----->“首选项”---->“设置”,在右侧“用户设置/settings. ...

  3. 台式机电脑u盘启动识别不到U盘设置

    U盘作为一个引导盘,在装机过程中显得十分的方便,有时候我们可以将U盘做成一个PE启动盘,有时我们也可以直接将U盘做成一个操作系统光盘的镜像. 但是有时候我们辛辛苦苦将U盘做成了引导盘了,关机---&g ...

  4. Django drf:序列化增删改查、局部与全局钩子源码流程、认证源码分析、执行流程

    一.序列化类的增.删.改.查 用drf的序列化组件   -定义一个类继承class BookSerializer(serializers.Serializer):   -写字段,如果不指定source ...

  5. YOLO---多个版本的简单认识

    YOLO---多个版本的简单认识 YOLOv3 有好几个经典版本了:一.YOLOv3 (Darknet)官网 @ https://github.com/pjreddie/darknet二.YOLOv3 ...

  6. replace函数实现

    ##replace函数,跟split函数处理类似,比split简单 #coding=gbk ss='** *axx* *bv** *ctt** **dff***' print(ss) result=[ ...

  7. curl、fopen和file_get_contents区别

    curl多用于互联网网页之间的抓取,fopen多用于读取文件,而file_get_contents多用于获取静态页面的内容. 1. fopen /file_get_contents 每次请求都会重新做 ...

  8. FFT/FWT

    最近舟游疯狂出货,心情很好~ FFT FWT 快速傅里叶变换(FFT) 具体的推导见这篇:胡小兔 - 小学生都能看懂的FFT!!! (写的很好,不过本小学生第一次没看懂0.0) 总结下关键内容 ~ P ...

  9. 关于Python中正则使用findall和分组的一个坑

    版权声明:本文为sam的原创文章,转载请添加出处:http://blog.csdn.net/samed https://blog.csdn.net/samed/article/details/5055 ...

  10. 捕获错误并处理try-catch

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...