细谈java中的堆和栈
2016-05-27 18:48
267 查看
由于"堆"和"栈"这两个概念是看不见摸不着的东西,让很多程序员都整不明白是怎么回事, 其实这两个概念也没有什么好研究的,因为堆和栈程序员根本没有办法控制其具体内容 。 我们只需要了解一点,栈与堆都是 Java 用来在内存中存放数据的地方就行了。 然后再弄清楚这两个概念分别对应这程序开发的什么操作,以及堆和栈的区别即可。
一、堆 ——new 出来的,垃圾自动回
4000
收负责回收
1. 堆是一个"运行时"数据区,类实例化的对象就是从堆上去分配空间的; 2. 在堆上分配空间是通过"new"等指令建立的; 3. Java 针对堆的操作和 C++的区别就是,Java 不需要在空间不用的时候来显式的释放 ; 4. Java 的堆是由 Java 的垃圾回收机制来负责处理的,堆是动态分配内存大小,垃圾收集器可以自动回收不再使用的内存空间; 5. 但缺点是,因为在运行时动态分配内存,所以内存的存取速度较慢。
例如:
String str = new String("I love java");//在堆上开辟的空间来存放 String 的对象。
二、栈——存放基本数据类型,速度快
6. 栈中主要存放一些基本类型的变量(int, short, long, byte, float, double,boolean, char)和对象句柄; 7. 栈的存取速度比堆要快; 8. 栈数据可以共享; 9. 栈的数据大小与生存期必须是确定的,缺乏灵活性。
例如:
String str = "I love java";//在栈上开辟的空间来存放 String 的对象
三、栈的‘数据共享‘
栈其中一个特性就是"数据共享",那么什么是"数据共享"呢? 我们这里面所说的数据共享,并不是由程序员来控制的,而是 JVM 来控制的,指的是是系统自动处理的方式。 比如定义两个变量:
int a = 5; int b = 5;
这两个变量所指向的栈上的空间地址是同一个,这就是所谓的"数据共享"。它的工作方式是这样的: JVM 处理 int a = 5,首先在栈上创建一个变量为 a 的引用,然后去查找栈上是否还有5这个值, 如果没有找到,那么就将5存放进来,然后将 a 指向5。 接着处理 int b = 5,在创建完 b 的引用后,因为在栈中已经有5这个值,便将 b 直接指向5。 于是,就出现了 a 与 b 同时指向5的内存地址的情况。
四、实例化对象的两种方法
对于 String 这个类来说它可以用两种方法进行建立:
String str = new String("abc");
和
String str = "abc";
用这两个形式创建的对象是不同的,第一种是用 new()来创建对象的,它是在堆上开辟空间, 每调用一次都会在堆上创建一个新的对象。 **而第二种的创建方法则是先在栈上创建一个 String 类的对象引用,然后再去查找栈中 有没有存放"abc",如果没有,则将"abc"存放进栈,并让 str 指向"abc",如果已经有 "abc" 则直接把 str 指向"abc"。** 我们在比较两个 String 是否相等时,一定是用"equals()"方法,而当测试两个包装类 的引用是否指向同一个对象时,我们应该用"= ="。因此,我们可以通过"= ="判断是否相等 来验证栈上面的数据共享的问题。 例1:
String s1 = "asdf"; String s2 = "asdf"; System.out.println(s1==s2);
该程序的运行结果是,"true",那么这说明"s1"和"s2"都是指向同一个对象的。 例2:
String s1 =new String ("asdf"); String s2 =new String ("asdf"); System.out.println(s1==s2);
该程序的运行结果是,"false",这说明用 new 的方式是生成的对象,每个对象都指向不的地方。
内容部分摘自《Java程序员+上班那点事》
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树