String类的两种对象实例化方式比较
关于直接赋值操作中字符串都相同的原因:
在String类进行设计时采用了一种称为共享设计模式的概念,在每一个运行的JVM低层存在一个字符串的对象池(Object Pool),如果用户采用了直接赋值的方式,会将字符串的内容放入池中,一共其他继续使用直接赋值方式的String对象使用,如果新声明的字符串内容不在翅中,则会开辟一个新的,继续放入池中,以供下次使用.
关于共享设计模式的简单解释:就好比家中准备的工具箱一样,如果有一天需要用到螺丝刀,发现家里没有,就去买一把新的,使用完之后不是扔掉而是放到工具箱备下次使用,而这个工具箱是在每个家庭成员中共享的.
面试中常会出这样的题:实例化String类的两种方式的区别:
A直接赋值:
例如 String str = "Hello";
只开辟一块内存空间,字符串内容可以自动入池,以供下次使用.
B构造方法:
例如 String str = new String("Hello");//这里创建了2个实例化对象,一个是String的匿名对象"Hello",另一个是使用关键字new 实例化的String类对象.
开辟两块堆内存空间,有一块将成为垃圾,并且不能自动入池,需要使用intern()手工入池.
日后开发中,String对象的实例化永远都采用直接赋值的方式完成.
以上文字内容主要出自书籍<<JAVA核心技术精讲>>