String 本身不属于引用性数据类型,但是它却可以像基本数据类型那样赋值。
一、 String的两种对象实例化方式
方式一:采用直接赋值字符串的形式;
方式二:采用String类的构造方法的形式;(pubic String (str))
二、两种对象实例化的区别:
直接赋值的方式,只开辟了一块栈内存空间(存放变量名)和一块堆内存空间(存放字符串),字符串内容可以入池,以供下次使用。
构造方法赋值的方式,开辟一块栈内存空间,而在对内存中开辟一块空间保存字符串“Hello”,而后又使用了关键字new,开辟了另一块堆内存空间,不过真正使用 的是new创建的堆内存空间,而之前定义的字符串常量的堆内存空间将不会有任何的栈内存指向,成为垃圾,等待被GC回收。
重要:在String类进行设计时采用了一种称为共享设计模式的概念,在每一个运行的JVM底层存在一个字符串的对象池(Object Pool),如果对象采用了直接赋值的方式,会将字符串的内容放入池中,以供其他继续使用直接赋值方式的String对象使用,如果新声明的字符串内容不在翅中,则会开辟一个新的,继续放入池中,以供下次使用。
三、常见面试题一
请解释equals() 和 == 的区别?
==:比较的是两个字符内存地址的数值是否相等,属于数值比较。
equals(): 比较的是两个字符串的内容,属于内容比较。
常见面试题二、
请解释String类的两种对象实例化方式的区别?
直接赋值:只开辟一块堆内存空间,字符串的内容可以自动入池,以供下次使用;
构造方法:开辟两块堆内存空间,有一块成为垃圾,并且不能自动入池,需要使用intern()手工入池。
在日后的开发中都是采用直接赋值方式。
常见面试题三、
代码“String s = new String("mldn");”创建了几个String类的实例化对象?
创建了两个实例化对象,一个是String类的匿名对象“mldn”,另一个是使用关键字new 实例化的String类对象。