Java的内存分配

初学Java语言的人总是声称Java中没有指针。每次听到这种说法,我都是不做过多争辩。Java语言只是表面上没有了C/C++中的指针符号“*”。而其这种机制依然是存在的,只是换了个表现形式而已。其目的都是为了操作内存。还有些人经常说Java语言多么优秀,程序员不用关心底层的内存云云……。我们的语言还没有到那种程度,只是对于内存等细节的处理比以前更优秀了而已。下面整理了Java中内存的分配问题。

(1)寄存器。特点:快,处理器内部。程序中控制不到。可以忽略。

(2)栈空间。大家最熟悉。通常的局部变量都存储在这里。注意这些局部变量包括基本类型的数据以及引用!而真正的Java对象是不存在于其中的。

(3)堆空间。 用于存放所有的Java对象。都是被new出来的。但是指向这个对象的引用却是存储在栈空间的。如果出现堆中的某个对象没有被哪个引用指向的话,那么这个对象所占空间将会被垃圾收集器回收销毁。

(5)常量存储区。例如常量字符串等等。

例子1:

String a = new String("1234");//a是一个引用,存储在栈空间。 String对象"1234"存储在堆空间,因为他是被new出来的。
String b = new String("1234");//同上。
if(a == b){ //a指向的内存空间和b指向的内存空间虽然都在堆空间, 但不是同一块内存地址。所以肯定不相等了。
	System.out.println("YES");  //当真正要比较这两个字符串对象是否相等,就要用到equals方法了。刚好String对象实现了这个方法。
}

例子2:

String a = "1234";	//a是引用,栈空间。但他这次指向的是常量区,而不是堆空间。
String b = "1234";//b是引用,栈空间。他也是指向常量区。由于"1234"字符串常量已经在常量区存在了。所以a,b指向的都是常量区的同一块内存。
if(a == b){
	System.out.println("YES");
}

 

理解浅显,错误难免,大家交流下。
 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值