理解JVM对象内存分配相关知识

标题起的很大,但是我只想讲一个比较容易令我困惑的问题。

今天在刷一道简单的链表题目时,又产生了困惑,这次结合之前的JVM知识希望把这个问题彻底解决。

先上代码

    public static Node reverse(Node head){

        if(head == null || head.next == null){
            return head;
        }


        Node next = null;
        Node pre = null;

        while (head != null){

            next = head.next;
            head.next = pre;

            pre = head;
            head = next;

        }


        return pre;
    }

代码很简单,就是一个反转链表,Node是一个普通的类。

首先我们知道,JVM中,声明的对象引用存储在栈中,它所代表的实际对象存储在堆中。

Node a = new Node();

a这个对象引用存储在栈中,JVM同时也在堆中开辟了一块真实的内存存储这个Node对象,
栈中存储的实际上是地址,这个地址指向堆中的内存

那么我上面的代码中

        Node next = null;
        Node pre = null;

把它们声明为null, 这时其实在堆中并没有开辟内存,但是在栈中,占用了栈的空间,只不过里面存储的是null 值。

同时在java里对象传递的时候,传递的都是引用(也就是对象的地址),这比传递整个对象高效的多。而基础类型,int,double等传递的才是值。

       Node next = null;
        Node pre = null;

        while (head != null){

            next = head.next;
            head.next = pre;

            pre = head;
            head = next;

        }

所以在这个循环中,一开始head.next被赋值为pre (也就是null)

紧接着 pre=head , pre在栈中原本是null,现在变成了一个地址,这个地址指向了堆中的head实际对象。而head.next并没有改变,在栈中暂时还是null。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,641评论 25 708
  • 在Web开发中,HTML提供了下拉列表的实现,就是使用 元素实现一个下拉列表,在其中每个下拉列表项使用 表示即可。...
    AiPuff阅读 430评论 0 1
  • 一个人要有足够的气度, 才能容下生活中的酸甜苦辣。 一个人要有长远的眼光, 才能看开人生里的风吹雨打。 生活中,不...
    山东女子学院阅读 228评论 0 0
  • 创作背景:2016年上海市普陀区举办的世界无烟日征文比赛。 历史的巨轮滚滚向前,回首清朝末年钦差大臣林则徐虎门销烟...
    Tulip晓阅读 400评论 0 0
  • 文/白草 橘生南则为橘,生于北则为枳。那时年少,读到屈原在《橘颂》中写到“受命不迁”,便忍不住反复地去念这个词“受...
    零落霜结阅读 349评论 0 0