String创建问题
创建一个字符串的方法有两种:
- 直接赋值
- 用构造方法创建12345//直接赋值,入池String str1 = "Hello";String str2 = "Hello";//用构造方法创建,不入池String str3 = new String("Hello");
- 对于第一种创建方式是很常用的一种,只是表示在堆开辟的一块空间,是共享的。str1和str2是共享同一个堆上面的内存的。
- 对于第二中方式其实创建了两个对象一个是匿名对象,另一个氏new实例化的对象,其中一个对象被视为垃圾,会被GC垃圾回收机制回收。并且这个创建的内存是不会被共享的。
但是提供了方法可以使其手动入池:1String str4 = new String("Hello").intern();
这样可以使得该类创建的字符串进行手动入池。
字符串内容一旦声明不可改变
如果我们创建一个字符串,然后再对字符串进行拼接,这样该字符串之前指向的堆内存是不会改变的,但字符串会指向另一个堆内存,该堆内存内便是拼接后的字符串,原本的内存会被视为垃圾进行回收。