`
gatusso52
  • 浏览: 109650 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

堆栈区别(Java 与 C++)

    博客分类:
  • java
阅读更多

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类,以提高程序效率。
 
分享到:
评论

相关推荐

    java堆栈的区别 -- 详解

    堆和栈是两个不同的概念 堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个...虽然堆栈,堆栈的说法是连起来叫,但是他们还是有很大区别的,连着叫只是由于历史的原因。

    数据结构 C C++ JAVA

    C C++ 数据结构 链表 堆栈 C C C C C C C C C C C C C C

    java JGL标准程序库,类似C++的STL

    JGL实现了许多功能,可满足对一个集合库的大多数常规需求,它与C++的模板机制非常相似。JGL包括相互链接起来的列表、设置、队列、映射、堆栈、序列以及反复器,它们的功能比Enumeration(枚举)强多了。同时提供了...

    【免费题库】华为OD机试 - 堆栈中的剩余数字(Java & JS & Python & C & C++).html

    【免费题库】华为OD机试 - 堆栈中的剩余数字(Java & JS & Python & C & C++).html付费专栏内容,免费下载,多种语言解法

    Java问题定位技术.pdf

    如果您是从C++/C转到Java上的程序员,那么线程堆栈应该不是陌生的技术,但对于原 生的Java程序员来说, 很多人不清楚还有这个这个密门绝技。 什么是线程堆栈1? 线程堆栈也称 作线程调用堆栈。Java线程堆栈是虚拟机...

    java 栈和堆,Java自动管理栈和堆

    栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

    Thrift之C++初体验

    它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。

    堆栈的区别

    堆栈在操作系统 和编程中的区别详解,里面涵盖c,C++,java等编程时堆栈的注意的问题

    数据结构代码例题 堆栈 树 连表 字符串 基本操作程序员笔试必备的东西

    大量的数据结构代码例题 堆栈 树 连表 字符串 基本操作 程序员笔试必备的东西

    [java]读书笔记整理:一切都是对象

    用堆进行存储分配比用堆栈进行存储分配需要更多的时间(如果确实可以在java中向在C++中一样在栈中创建对象)。 4) 静态存储 这里的“静态”是指“在固定的位置”(尽管也在RAM里)。静态存储里存放程序运行时一直...

    Java虚拟机中冷对象的研究_骆凡.caj

    c/c++ 程序员一样去进 行内存空间回收的处理。但也正是因为这样的原因,虚拟机扮演如此重要的角色,所 以虚拟机的优化变成了一个很重要的问题。 许多 Java 应用程序在 Java 堆中实例化的对象是持久的,但几乎...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 301 11.3.2 公共子表达式消除 / 305 11.3.3 数组边界检查消除 / 307 11.3.4 方法内联 / 307 11.3.5 逃逸分析 / 309 11.4 Java与C/C++的编译器对比 / 311 11.5 本章小结 / 313 第五部分 高效并发 第12章 ...

    基于堆栈运算的科学计算器(可解方程)

    进入程序后,键入"1" 选择进入计算器,然后出现">" 输入表达式或者方程 表达式可以是题目所要求的任意式子比如以下的输入是合法的 1+1 +1+1 -1+3 -1*4 (1-5.8)*(4+3.7) sin(sin(1*6+8)) sin(sqr(4)-9)等等都是合法的...

    堆栈实现骑士漫游,包含详细注释,可编译通过

    使用自定义堆栈进行骑士漫游,包括完整的尝试过程,可编译通过。

    数据结构 Java版

    对于以前接触过C或C++的程序员而言,使用C或C++开发诸如队列、堆栈、链表和树等数据结构并非难事。遗憾的是,现在介绍Java数据结构和算法的好书却较少,使大家在进一步学习、使用Java的过程中遇到了一些困难。本书...

    clock.java

    这是我本人写的一个时钟窗口化代码文件,也就是GUI代码,运行环境为jetbrain idea 编译器,语言为Java语言

    eclipse 开发c/c++

    遗憾的是,即使 CDT 是用 Java 编写的,它也不是与平台无关的。 接着,将归档文件解压到临时目录中,从临时目录将所有插件目录内容都移到 Eclipse plugins 子目录。还需要将 features 目录内容移到 Eclipse features...

    java 面试题 总结

    20、EJB与JAVA BEAN的区别? Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有...

    rewolf-jvm-operand-stack-viewer:Java VM Operand堆栈查看器

    rewolf-jvm-operand-stack-viewer Java VM Operand堆栈查看器 可以在这里找到更多信息: :

Global site tag (gtag.js) - Google Analytics