`
冇心人
  • 浏览: 56403 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

堆栈区别(Java 与 C++)

阅读更多
栈与堆都是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++区别

    Java 程序中所有的对象都是用 new 操作符建立在内存堆栈上,这个操作符类似于 C++ 的 new 操作符。 Java 自动进行无用内存回收操作,不需要程序员进行删除。而 C/C++ 中必须由程序员释放内存资源,增加了程序设计者...

    查找android crash堆栈中的C++代码位置的工具

    然而,由于Android系统是混合Java和C++代码运行的环境,分析这些堆栈信息并定位到具体的C++代码位置可能比较复杂。本文将详细介绍如何使用工具在Linux环境下解析Android crash堆栈,从而找到问题的源头。 首先,...

    从日志文件组件看java与c++的不同

    标题“从日志文件组件看java与c++的不同”揭示了我们要探讨的核心主题,即Java和C++在处理日志文件组件时的区别。日志文件组件是软件开发中不可或缺的一部分,用于记录程序运行过程中的信息,帮助开发者追踪错误、...

    java嵌入c,c++程序指南

    Java与C/C++的交互主要通过Java本地接口(Java Native Interface,JNI)来实现,这使得Java能够调用C或C++编写的库,反之亦然。在32位Windows环境下,Java应用程序可以调用C/C++编写的DLL动态链接库来扩展其功能。...

    C++JNI多线程回调java

    JNI是一种接口,它定义了Java虚拟机(JVM)如何与本地代码(如C++)交互。这包括加载本地库、注册本地方法、调用Java方法以及处理Java对象等。在C++中,我们通常会创建一个`.cpp`文件来实现JNI接口,同时还需要对应...

    JAVA和C++区别详解.doc

    "JAVA和C++区别详解" JAVA和C++都是面向对象语言,它们都能够实现面向对象思想(封装,继承,多态)。然而,C++为了照顾大量的C语言使用者,而兼容了C,使得自身仅仅成为了带类的C语言,多少影响了其面向对象的彻底...

    数据结构 C C++ JAVA

    C++和Java中,可以使用标准模板库(STL)的stack容器或者自定义类来实现堆栈。 在C、C++和Java中实现数据结构时,上机指导和源程序是非常重要的学习资源。它们通常包含了一系列的示例代码,帮助初学者理解各种数据...

    2022年JAVA和C++区别都有哪些.docx

    "JAVA 和 C++ 的区别" JAVA 和 C++ 都是面向对象的语言,它们都能够实现面向对象思想(封装、继承、多态)。但是,C++ 为了照顾大量的 C 语言用户,而兼容了 C,使得自身仅仅成了带类的 C 语言,多少影响了其面向...

    C++调用java jar包测试代码

    综上,这个压缩包文件的使用涉及到了Java的开发流程、jar包的打包、C++与Java的交互、JNI技术的运用以及跨平台调用的调试和环境配置等多个知识点。学习和掌握这些内容对于进行多语言混合编程和系统集成具有很高的...

    JAVA,C++面试宝典

    同时,Java的内存管理和垃圾回收机制也是面试中常被问到的话题,深入理解堆栈内存分配以及如何优化内存使用对于提高程序性能至关重要。另外,Java集合框架,如ArrayList、LinkedList、HashMap等,是面试中的热门问题...

    java堆栈的区别 -- 详解

    ### Java堆栈的区别详解 #### 一、预备知识—程序的内存分配 程序在运行时,根据不同的数据类型和用途,会被分配到不同的内存区域。这些区域包括: 1. **栈区(Stack)**:这部分内存由编译器自动管理,主要用于...

    C++、JAVA+、C+++、软件测试面试题

    在IT行业中,C++、Java++(这里可能是Java的误写,通常我们只说Java)、C++以及软件测试是至关重要的领域,它们构成了现代软件开发的基石。面试题集是评估求职者技能的重要工具,因此深入理解这些领域的关键概念和...

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

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

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

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

    2019年最新牛客校招面试全集(含Java和C++和 前端和测试).zip

    面试中,你需要掌握C++的基础语法,包括指针、引用、模板、STL(标准模板库)、运算符重载、内存管理(堆栈与堆的区别)、命名空间以及C++11/14/17新特性等。此外,面向对象编程的三大特性(封装、继承、多态)及其...

    C/C++,Java面试题汇总

    2. **内存管理**:了解堆栈与堆的区别,掌握动态内存分配(malloc, free)和静态内存分配。 3. **预处理器**:宏定义、条件编译等预处理指令的理解与应用。 4. **函数**:函数指针、递归、匿名函数、重载函数等特性...

    面试笔试题库(JAVA\C\C++\数据库)

    对于性能优化,C++的内存管理,包括堆栈、静态存储区、自由存储区的使用,以及如何避免内存泄漏也是常见问题。 【数据库知识点】 数据库是数据存储和管理的核心工具,面试中会涉及到SQL语言,包括DML(数据操纵...

    java堆栈常量池笔记

    这类似于C/C++中的指针,但Java的引用更安全,因为它们不会直接操作内存地址,而是通过虚拟机进行管理。 Java的内存分配策略有助于优化程序性能和内存使用,但同时也可能导致内存泄漏和性能问题,尤其是当对象生命...

    中兴计算面试题目pdf C++ java

    作为一门静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化编程,也支持面向对象编程的程序设计语言,C++面试通常会考察基础语法、类与对象、模板、STL(标准模板库)、内存管理(堆栈与堆的区别)、异常...

    IT类 各类 大中小 公司 面试 笔试题 java c c++

    C和C++是底层编程的基石,面试中会测试对指针的理解、内存管理(堆栈、动态内存分配)、函数指针、预处理器、模板、STL库的运用、面向对象编程(C++特有)、异常处理、C++11/14/17新特性等。同时,面试官可能还会...

Global site tag (gtag.js) - Google Analytics