new String 到底会创建几个对象呢
String对象详解
简单描述
字符串可以说是java中非常常见的一种数据类型了,我们在日常的开发中对其的使用及其的频繁,并且它也是笔试面试中常考的一个知识点,因此我们非常有必要对其做一定了解。今天这篇文章以一个常见的面试题为引子,详细的对String做一个描述。
String入门常识
- String对象有两个存储的空间,一个常量池(字符串常量池)(jdk1.7后再堆空间中划出一块作为常量池,1.7之前是在方法区中划一块空间做常量池),另一个就是堆空间。
- String之所以有两块存储空间,是因为String在编程中比较常用,为了节省空间,同时也提高了效率(减少了对象的创建)。
- String是被final关键字修饰的类,因此它是不可变对象,不能被继承。
- String对象的拼接都是通过StringBuilder完成,然后调用起toString()方法创建一个新的String对象。
- intern()方法:返回调用者对象在常量池中的对象。比如 “111”.intern(); 如果"111"这个String对象在常量池中已经存在,则该方法的调用只会返回该对象,再不做其他操作,如果"111"这个String对象不在常量池中,该方法会在常量池中创建一个,然后返回。
注: 其实intern()方法是为了让调用者使用它在常量池中的对象,因为,无论是通过字面量的方式使用还是通过new 关键字都会在常量池中创建对象。
String的创建方式
1.字面量的方式直接定义:String str = “111”;
2.new关键字创建: String str = new String(“111”);
String str = “111”;会创建几个对象
这种创建方式只会在常量池中创建一个"111"对象。
new String(“111”)会创建几个对象
- 第一种情况
当常量池中没有"111"这个字符串时,会创建2个对象。堆、常量池各一个。 - 第二种情况
常量池中有"111"这个字符串时,会创建1个对象。只在堆中建一个。
– 创建过程描述
当使用new String创建字符串对象时,首先会在堆中创建一个对应的String对象,然后判断该对象在常量池中是否存在,如果存在,则创建对象结束,即创建1个;否则,将该对象本身复制一份放到常量池中。