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")创建了几个对象?

    答曰:一个或两个。

  • 相关阅读:
    【MySQL】悲观锁&乐观锁
    选盘秘籍:用户如何选择SSD/SATA/SAS?
    【MySQL】分页优化
    【MySQL】锁问题最佳实践
    【MySQL】锁入门
    【MySQL】SQL优化系列之 in与range 查询
    【DNS】简单聊聊DNS如何工作
    【MySQL】排序原理与案例分析
    git的使用
    关于fastjson与jackson在反序列化bool型时的区别
  • 原文地址:https://www.cnblogs.com/yuxiuyan/p/5656447.html
Copyright © 2011-2022 走看看