Java中堆、栈、常量池以及==和equals的区别

堆、栈、常量池

Java中把内存分为两种:堆内存和栈内存。
栈内存中存放基本类型的变量和对象的引用变量。
堆内存中存放new创建的数组和对象。
常量池中存放常量(字符串常量等)。

栈的优势是存取速度快,但存在栈里的数据的生存周期是确定的, 局部变量存放在栈里,当超出作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。当正因为在运行时动态分配内存,存取速度较慢。

常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。

==和equals的区别

例如:
int a = 3; int b = 3;
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找有没有值为3的地址,没找到,就开辟一个存放3这个值的地址,然后将a指向3的地址。接着处理int b = 3;在创建完b的引用变量后,由于在栈中已经有3这个值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况。但如果再来一个语句:b = 4; 则编译器会重新创建一个值为4的空间,将b指向4的地址,而a指向的地址的值还是3。

String a = "abc";
String b = "abc";
System.out.println(str1==str2);

结果为true。
因为在栈中查找有没有存放值为"abc"的地址,如果没有,则开辟一个存放字面值为"abc"的地址,接着创建一个新的String类的对象a,并将a的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象a。如果已经有了值为"abc"的地址,则查找对象a,并返回a的地址。所以引用变量a和b指向的是同一个地址。

	String s3 = "11";
	String s1 = new String("11");
	String s2 = new String("11");
	if(s1.equals(s2)) System.out.println("Yes");
	else System.out.println("No");
	if(s1 == s2) System.out.println("Yes");
	else System.out.println("No");
	if(s1.equals(s3)) System.out.println("Yes");
	else System.out.println("No");
	if("11" == s3) System.out.println("Yes");
	else System.out.println("No");
	String s4 = "11";
	if(s3 == s4) System.out.println("Yes");
	else System.out.println("No");

结果为:
Yes
No
Yes
Yes
Yes

equals()方法比较的是两个引用变量指向的两个对象内部的值是否相同。

== 则是比较两个引用变量是否指向同一个内存地址。

首先创建一个字符串s3指向一个字符串常量,栈中没有指向"11"的引用变量,所以编译器会分配一个字符串常量"11"的字符串内存空间。用new创建字符串s1,s2,编译器对所有的new操作,不管初始化的值存不存在,都会分配内存,也就是s1,s2,s3指向的内存地址都不一样,所以s1.equals(s2)的值为true,而s1 == s2的值为false。因为s3指向的就是常量"11"的内存地址,所以"11" == s3也是true。创建引用变量s4的时候,因为栈中已经存在了指向字符串常量"11"的变量了,所以之间让s4指向那个内存地址。所以s3 == s4的值为true。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值