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

原创 2007年09月22日 17:12:00
 

HTML Tags and JavaScript tutorial



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





栈(stack)与堆(heap)区别以及Java的string变量赋值的内部工作机制(精典转载贴)
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
*看完之后真正的明白了,感谢!  和大家一起分享!!
***********************************************************************************
 


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

堆栈存放用户自己用malloc分配的空间,用free来释放;由用户自己管理,而栈存放函数的局部变量,由编译器来负责分配和回收管理,速度快,但容量有限, 简单的可以理解为:  heap:是由ma...
  • ly0303521
  • ly0303521
  • 2015年04月09日 19:40
  • 1661

c++中堆和栈的的区别(stack vs heap)

 堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操...
  • hyqsong
  • hyqsong
  • 2014年12月18日 15:57
  • 2692

JAVA面试、进阶必备——堆内存与栈内存

IT小修 2017-05-09 14:51 java堆栈 java面试过程中经常会被问到关于堆栈的问题,这里我稍微总结一下,供大家参考一下。 java的内存分为堆内存和栈内存 栈内存是指程序进...
  • u011277123
  • u011277123
  • 2017年05月10日 18:21
  • 546

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

堆和栈的区别
  • shanshanhi
  • shanshanhi
  • 2016年03月16日 14:15
  • 2216

堆(heap)和栈(stack)、内存泄漏(memory leak)和内存溢出

简单的可以理解为: heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。 stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。 一、预...
  • Acceptyly
  • Acceptyly
  • 2015年08月22日 11:01
  • 1428

堆内存(Heap)和栈内存(Stack)详解

原文地址:http://blog.csdn.net/abcjennifer/article/details/39780819 堆:顺序随意  栈:先进后出  堆和栈的...
  • Meta_Cpp
  • Meta_Cpp
  • 2015年01月09日 14:02
  • 2511

操作系统中堆和栈的区别

我们都知道数据结构中也有堆栈的概念,但他们与操作系统中的不同。 栈(操作系统):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈,栈使用的是一级缓...
  • Al_xin
  • Al_xin
  • 2014年08月19日 17:33
  • 861

C#中堆和栈的区别分析

一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈...
  • Andeewu
  • Andeewu
  • 2013年08月07日 19:06
  • 2018

编程基本一:变量在内存里的区别以及栈与堆的区别

全集变量、局部变量、静态全局变量、静态局部变量在内存中如何存储,有什么区别,栈和堆的区别? 一、先由程序的内存分配说起,一个完整的C/C++程序在运行时会占用的内存分为几个部分。 栈(stack...
  • heanyu
  • heanyu
  • 2013年08月20日 23:57
  • 2379

stack与heap的关系与区别

stack:         具体地说,现代计算机(串行执行机制),都直接在代码底层支持栈的数据结构。这体现在,有专门的寄存器指向栈所在的地址,有专门的机器指令完成数据入栈出栈的操作。这种机制的特点...
  • ydonghao2
  • ydonghao2
  • 2013年10月25日 19:24
  • 2629
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:栈(stack)与堆(heap)区别以及Java的string变量赋值的内部工作机制(精典转载贴)
举报原因:
原因补充:

(最多只允许输入30个字)