Java温故而知新(五)

1、记录下关于String字符串在内存中的分配。

须知:

JAVA虚拟机在内存中分为5部分,最常用的应该是三大块,即堆、栈、方法区。

栈内存主要负责方法的调用和局部变量的处理。

堆内存储存引用类型的数据,即new出来的数据。

方法区(jdk7,jdk8后常量池在堆中)主要储存类的基本信息,同时有静态区和常量池。

栈内存是线程私有的,堆和方法区是线程共有的。

关于String类型字符串,可以简单的这样理解:

 从上图我们可以看出,当你直接通过String str1="abc';只有一步:先去堆中的常量池中寻找有没有"abc",如果存在,则返回地址值给str1,如果不存在,则在常量池中生成“abc”,再将地址值返回给str1。

当通过String str2=new String(“abc”);分为两步:

  ①.在堆中开辟内存,储存new出来的String数据,并将地址值返回给变量str2。

  ②.去堆中的常量池中寻找有没有"abc",如果存在,则返回地址值储存在堆中new出来的内存中,如果不存在,则在常量池中生成“abc”,再将地址值返回给堆中new出来的内存。

2.记录==和equals的区别。

①.对象类型不同,equals()是超类Object中的方法;==是操作符。

②.比较的对象不同,equals()用来检测两个对象是否相等,即两个对象的内容是否相等。==用于比较引用和比较基本数据类型时具有不同的功能,在比较基本数据类型时比较的是基本数据类型的值,在比较引用类型数据时比较的是数据的地址值。

猜你喜欢

转载自www.cnblogs.com/NiYv/p/12197453.html