`
primer_2004
  • 浏览: 127968 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

栈(stack)与堆(heap)区别以及Java的string变量赋值的内部工作机制(精典转载贴)

    博客分类:
  • Java
阅读更多
 

1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。
2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
3. Java中的数据类型有两种。基本类型(primitive types), 共有8种,即int, short, long, byte, float, double, boolean, char。存在于栈中。另一种是包装类数据,如Integer, String, Double等将相应的基本数据类型包装起来的类。这些类数据全部存在于堆中.

String str = "abc";和String str = new String("abc");和char[] c = {'a','b','c'};String str=new String(c);都采用堆存储

String str = "abc";在栈中如果没有存放值为"abc"的地址,等同于:
String temp=new String("abc");
String str=temp;

关于String str = "abc"的内部工作。Java内部将此语句转化为以下几个步骤:
(1)先定义一个名为str的对String类的对象引用变量:String str;
(2)在栈中查找有没有存放值为"abc"的地址,如果没有,则开辟一个存放字面值为"abc"的地址,接着创建一个新的String类的对象o,并将o的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为"abc"的地址,则查找对象o,并返回o的地址。
(3)将str指向对象o的地址。

使用String str = "abc";的方式,可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。

char[] c = {'a','b','c'};String str=new String(c);等同于:
String str = new String('a'+'b'+'c');
***********************************************************************************
*转贴:http://community.csdn.net/Expert/topic/4848/4848360.xml?*temp=9.325808E-02
*看完之后真正的明白了,感谢!  和大家一起分享!!
***********************************************************************************


分享到:
评论
2 楼 hanyuanbo 2010-09-16  
多谢啦
不过你这里有关于字符串的连接机制么?
比如:
String first = "abc";
String second = "def";
String third = first + second;
这其中是怎么工作的呢?? 多谢多谢啦
1 楼 lvwz2008 2009-01-13  
比较简单,学习了也受益不少!

相关推荐

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

    "Java 中堆(heap)和堆栈(stack)的区别" Java 中堆(heap)和堆栈(stack)是两个不同的内存区域,...了解堆栈(stack)和堆(heap)的区别对于 Java 编程非常重要,可以帮助我们更好地理解 Java 的内存管理机制。

    堆(heap)与栈(stack)的区别

    堆(heap)与栈(stack)是计算机内存管理中的两种基本数据结构,用于存储程序运行时产生的临时变量。在C语言中,这两种内存区域有非常明确的区分,对于理解程序的内存分配和回收具有重要意义。 首先,栈是一种特殊...

    c语言stack(栈)和heap(堆)的使用详解

    1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据...

    堆(heap)和栈(stack)的区别

    堆(heap)和栈(stack)的区别 堆(heap)和栈(stack)是计算机科学中两个基本的内存分配概念,它们之间的区别是非常重要的。本文将详细介绍堆和栈的概念、差异、特点和应用场景。 一、预备知识—程序的内存分配 一个由...

    深入堆与栈 堆与栈的区别

    ### 深入理解堆与栈:堆与栈的区别 #### 一、基本概念与区别 在编程领域,特别是对于Java这种广泛使用的语言而言,理解内存管理中的“堆”与“栈”的概念及其区别至关重要。这不仅有助于我们更高效地编写代码,还...

    关于Java栈与堆的思考

    理解和掌握Java中栈与堆的工作原理,以及不同数据类型在其中的存储机制,对于编写高效、健壮的Java应用程序至关重要。通过合理利用栈和堆的特性,程序员可以更好地控制程序的性能和资源使用,避免常见的内存泄漏等...

    Java中堆内存与栈内存分配浅析

    本文将深入探讨Java中堆内存与栈内存的分配机制,并通过对比分析它们之间的差异,帮助读者更好地掌握Java内存管理的核心概念。 #### 二、堆内存与栈内存概述 ##### 1. 堆内存 堆内存是Java虚拟机(JVM)用于存储...

    用java实现的栈Stack类

    用java实现的栈Stack类,不继承任何集合类,用对象数组实现

    stack&heap

    理解堆和栈的区别和用法对于优化程序性能和避免内存问题至关重要。 1. **栈区(Stack)** 栈是程序运行时由编译器自动分配和释放的内存区域。它遵循“先进后出”(LIFO,Last In First Out)的原则,主要用于存储...

    详解java堆和栈

    在Java编程中,理解堆(Heap)和栈(Stack)的概念及其区别对于程序员来说至关重要。本文将深入剖析这两个概念,并探讨它们之间的差异以及如何影响程序的运行。 #### 二、Java中的栈(Stack) Java中的栈主要用于...

    C语言stack和heap

    在C/C++编程中,内存管理是至关重要的一个部分,主要分为栈(stack)和堆(heap)两个区域。理解这两个概念以及它们的区别对于优化程序性能、避免内存泄漏至关重要。 栈是程序运行时系统自动分配的一块内存区域,...

    变量在Java栈、堆内存中的运用管理分析.pdf

    Java内存主要分为两个核心区域:栈(Stack)和堆(Heap)。本文将详细解析这两个区域中变量的分配与管理。 1. 栈内存 栈内存主要用于存储基本数据类型变量和对象引用。当在方法内部声明一个变量时,Java会在栈中为...

    区别Java中的堆与栈

    标题:“区别Java中的堆与栈” 描述:本文深入探讨了Java中堆和栈的基本概念、工作原理以及它们之间的显著差异,特别关注了它们在资源管理、性能表现和内存分配策略上的不同。 ### Java中的堆(Heap) Java的堆是...

    关于Java栈与堆的思考-

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

    java内存机制,分析堆和栈的存储特点.pdf

    Java内存机制主要包括堆内存(Heap)和栈内存(Stack)两个主要部分,它们各自具有不同的特点和作用。栈内存主要用于存储基本类型变量和对象的引用,而堆内存则用于存储对象实例。 首先,栈内存的分配是线性的,...

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

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

    Java中堆内存和栈内存详解

    本文将深入探讨Java中的两种主要内存区域:堆内存(Heap Memory)和栈内存(Stack Memory)。这两种内存分别承担着不同的角色,对于程序员理解和优化Java程序至关重要。 #### 二、栈内存 栈内存主要用于存储方法的...

    Java中堆与栈的区别.pdf

    在Java编程语言中,堆和栈是两种不同的内存区域,它们各自有着特定的功能和使用场景。理解这两者的区别对于优化代码性能和避免内存泄漏至关重要。 首先,栈(Stack)是用于存储基本类型变量(如int、float等)和...

Global site tag (gtag.js) - Google Analytics