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");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担
分享到:
相关推荐
java中堆和栈的区别.pdf
JAVA中堆和栈的区别 - 路人浅笑 - 博客园,网上摘取学习java的资料,介绍了JAVA中堆和栈的区别 ,希望对大家有所帮助!
Java中堆和栈的区别在哪?.pdf
声明变量是在栈空间开辟了一个位置,实例化之后才会开辟一个堆空间 被赋予空值的话则是将栈空间地址指向一个新的堆空间位置
java中堆与栈的真谛 Java把内存划分成两种:一种是栈内存,一种是堆内存。 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配...
Java 中的堆和栈 java 中内存分配策略及堆和栈的比较
Java堆和栈的区别Java堆和栈的区别Java堆和栈的区别Java堆和栈的区别Java堆和栈的区别Java堆和栈的区别
主要介绍了java中堆和栈的区别,分析了Java中堆和栈的原理及使用时的注意事项,需要的朋友可以参考下
主要介绍了Java中堆和栈的区别详解,所有的Java程序都运行在JVM虚拟机内部,我们这里介绍的自然是JVM(虚拟)内存中的堆和栈,需要的朋友可以参考下
详细讲解Java中的堆和栈,教你如何让画内存模型图
Java 中的堆和栈.docJava 中的堆和栈.doc
本文分析了Java中堆内存与栈内存分配的异同
详细介绍java堆和栈的区别,对初学者 是 好处
关于Java中堆和栈的对比介绍,中文且有实例...
Java的堆是一个运行时数据区,类的对象从...栈中主要存放一些基本数据类型的变量(byte,short,int,long,float,double,boolean,char)和对象的引用,这篇文章给大家详细介绍java 堆和栈的概念和区别,一起看看吧
堆和栈详解 学习的一些总结,希望可以帮助大家。
Java中的堆和栈.pdf