zoukankan      html  css  js  c++  java
  • JAVA变量存储

    1.java变量存储域

    java变量的存储区域主要放在以下几个地方:

    (1)寄存器:可以说是最快的存储区,在C/C++中可以声明寄存器变量,但是在java中不能声明寄存器变量,只是编译器在编译时确定。

    (2)栈:存放关于基本类型数据和对象的引用,但是对象本身并不在栈里,(通过new出来的)对象放在堆里或者常量池中(字符串的常量对象就放在常量池中)。

    (3)堆:用于存放new出来的对象。

    (4)常量池:存放字符串常量和基本类型数据的常量(通过 public static final修饰)。

    (5)静态域:用于存放静态的成员(static)。

    (6)非RAM存储:比如硬盘等。

    在这里主要说说堆、栈和常量池。存放在栈里的数据的大小和生命周期是确定的,当所引用的数据消失时,该栈数据就会被JVM回收。存放在堆里的数据具有不确定性,当满足一定条件时,会被JVM的垃圾回收机制回收。

    2.例子

    比如以下代码:

    1 String s1 = "example";
    2 String s2 = "example";
    3 String s3 = new String("example");
    4 String s4 = new String("example");

    对于s1、s2将会存放在常量池中,对于s3(new出来的对象),会先去常量池中查找有没有"example"的对象,如果有,就会在堆里创建一个"example"的拷贝对象;如果没有,就会先在常量池中创建一个"example"的对象,然后再在堆里创建拷贝对象。

    所以有道题:String str = new String("abc")创建了几个对象?

    答曰:一个或两个。

  • 相关阅读:
    为什么 PCB 生产时推荐出 Gerber 给工厂?
    Fedora Redhat Centos 有什么区别和关系?
    【KiCad】 如何给元件给元件的管脚加上划线?
    MCU ADC 进入 PD 模式后出现错误的值?
    FastAdmin 生产环境升级注意
    EMC EMI 自行评估记录
    如何让你的 KiCad 在缩放时不眩晕?
    KiCad 5.1.0 正式版终于发布
    一次单片机 SFR 页引发的“事故”
    java基础之集合
  • 原文地址:https://www.cnblogs.com/the-wang/p/6915073.html
Copyright © 2011-2022 走看看