`

[转]Java堆和栈的区别 经典总结

阅读更多
栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
Java的堆是一个运行时数据区,类的对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。

栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。
栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:
int a = 3;
int b = 3;
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。
这时,如果再令a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。
要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。
String是一个特殊的包装类数据。可以用:
String str = new String("abc");
String str = "abc";
两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。
比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用例子说明上面的理论。
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
可以看出str1和str2是指向同一个对象的。
String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false
用new的方式是生成不同的对象。每一次生成一个。
因此用第二种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。
另一方面, 要注意: 我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象。
由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。
分享到:
评论

相关推荐

    堆和栈详解

    堆和栈详解 学习的一些总结,希望可以帮助大家。

    堆和栈总结

    堆栈(stack),堆(heap) Java堆栈 jvm为每个新创建的线程都分配一个堆栈。堆栈以帧为单位保存线程的状态。jvm对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。

    java中堆(heap)和堆栈(stack)有什么区别

    "Java 中堆(heap)和堆栈(stack)的区别" Java 中堆(heap)和堆栈(stack)是两个不同的内存区域,分别用于存储不同的数据类型和对象。堆栈(stack)是 Java 中的一种内存区域,用于存储基本类型的变量和对象的...

    java 内存中 堆、栈、常量池、方法区的总结

    详细的总结了java中在内存中创建的堆、栈、方法区、常量池的区别和用途

    java面试笔试题库java软件设计java笔试题大集合及答案文档资料合集300MB.zip

    关于堆和栈的那些事.docx 写好Java代码的30条经验总结.docx 华为java笔试面试题2014.doc 多态的理解.docx 大公司最喜欢问的Java集合类面试题.docx 大公司的Java面试题集.doc 就业相关java 广州传智播客JavaEE工程师...

    java面试笔试资料java笔试题大集合及答案题库java笔试题汇总资料188个合集.zip

    关于堆和栈的那些事.docx 写好Java代码的30条经验总结.docx 华为java笔试面试题2014.doc 多态的理解.docx 大公司最喜欢问的Java集合类面试题.docx 大公司的Java面试题集.doc 就业相关java 广州传智播客JavaEE工程师...

    java面试笔试题库java学习笔记开发教程互联网公司面试资料大全合集.zip

    关于堆和栈的那些事.docx 写好Java代码的30条经验总结.docx 华为java笔试面试题2014.doc 多态的理解.docx 大公司最喜欢问的Java集合类面试题.docx 大公司的Java面试题集.doc 就业相关java 广州传智播客JavaEE工程师...

    字节大佬总结的Java面试资料

    字节大佬总结的Java面试资料 JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接 的交互。 ...

    Java 数据类型常见面试题总结 · .pdf

    基本数据类型和包装类型的主要区别是,基本数据类型直接存放在 Java 虚拟机栈中的局部变量表中,而包装类型属于对象类型,存在于堆中。基本数据类型占用空间非常小,而包装类型占用空间较大。 包装类型是对基本数据...

    字节大佬总结的Java面试资料.pdf

    * 虚拟机栈(Java Virtual Machine Stack):每个线程都有一个虚拟机栈,用于存储当前方法调用的参数和局部变量。 * 本地方法区(Native Method Area):用于存储 native 方法的信息。 * 堆(Heap):用于存储Java...

    java 面试题 总结

    堆是栈的一个组成元素 19、forward 和redirect的区别 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从...

    Java虚拟机(JVM)面试题(总结最全面的面试题!!!)

    你能给我详细的介绍Java堆吗?(重点理解)能不能解释一下本地方法栈?能不能解释一下方法区(重点理解)什么是JVM字节码执行引擎你听过直接内存吗?知道垃圾收集系统吗?堆栈的区别是什么?深拷贝和浅拷贝Java会存在...

    最新版JAVA核心知识点.pdf

    JVM内存区域是JAVA中的一种重要概念,分为程序计数器、虚拟机栈、本地方法区、堆和方法区五个部分。 * 程序计数器(线程私有):用于存储当前执行的字节码指令的地址。 * 虚拟机栈(线程私有):用于存储方法的...

    2022年Java面试题个人总结答案.docx

    2. 堆和栈的区别 栈存储基本数据类型和对象的引用,堆存储对象和数组。 二、String、StringBuffer、StringBuilder的区别 1. String是不可变对象,每次修改String都会新建一个对象并赋值。 2. StringBuffer是字符...

    的Java工程师面试题.doc

    2. 堆和栈:堆和栈是两种不同的内存空间,堆用来存储对象,栈用来存储方法的调用信息。 3. 排序算法:快速排序是最快的排序算法,可以用于排序大规模的数据。例如,给阿里2万多名员工按年龄排序,可以使用快速排序...

    Java面试基础知识.docx

    本文总结了Java面试基础知识的重要概念和技术点,涵盖了异常处理机制、接口和虚类、垃圾回收机制、线程同步、析构函数和虚函数、Error和Exception的区别、final类型的类、编程风格、堆和栈的区别、超大整数的存储和...

    经典Java面试题.pdf

    "Java面试题知识点总结" Java 中的异常处理机制的简单原理和应用:Java 程序违反了 Java 的语义规则时,Java 虚拟机就会将发生的错误表示为一个异常。违反语义规则包括两种情况。一种是 Java 类库内置的语义检查,...

    农业银行Java基础面试题.pdf

    Java基础面试题知识点总结 在这篇文章中,我们将总结Java基础面试题中的...这篇文章总结了Java基础面试题中的知识点,从final、finally、finalize的区别到GC的作用等,涵盖了Java的基本语法和集合框架等方面的知识。

    牛客网经典120道Java面试常见题.docx

    Java 基础知识点总结 Java 是一门跨平台的编程语言,它的核心是 Java 虚拟机(JVM)。Java 虚拟机是一个可以执行字节码(.class)的虚拟机进程。Java 源文件(.java)被编译成能被 Java 虚拟机执行的字节码文件。...

    阿里大佬总结的Java面试资料.pdf

    一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接 的交互。 (2) 运行过程: 13/04/2018 Page 20 of 283 我们都知道 Java 源文件,通过编译器,能够生产相应的.Class 文件,也就是...

Global site tag (gtag.js) - Google Analytics