Java温故而知新(五)

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

在这里要永远记住一点:String对象一旦被创建就是固定不变的了,对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象

须知:

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出来的内存。

  https://www.cnblogs.com/xiaoxi/p/6036701.html 这个大神说的很详细,可以学习。

 

关于String,Stringbuilder和Stringbuffer的区别:

主要是理解三个对象在内存中的变化,String的值一旦确定在内存中不会改变,而buffer(线程安全,效率慢)和build(线程不安全,效率快)的在内存中的值允许改变。

https://www.cnblogs.com/wskb/p/10959642.html

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

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

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

posted @ 2020-01-15 17:07  灰灰灰灰灰  阅读(138)  评论(0)    收藏  举报