深入理解String
String类创建了几个对象?
- String str = “hello”;
创建了一个对象
jvm在编译阶段会判断常量池中是否有“hello”这个常量对象,如果有,str就直接指向这个常量的引用,如果没有就会在常量池中创建这个对象。 - String str = new String(“hello”);
创建了两个对象
jvm编译阶段会判断常量池中是否有“hello”这个常量对象,进而判断是否创建常量对象,然后运行阶段通过new关键字在java 堆上开辟一块儿空间来创建String 对象。 - String str = “hello” + “world”;
创建了一个对象
jvm编译阶段通过编译器优化后,会把字符串常量直接合并成“helloworld”,所以在常量池中只创建了一个对象。 - 如果String s1 = “hello”;
String s2 = s1 + “world”;创建了几个对象呢?又是哪几个对象呢?
创建了3个对象,变量+常量底层会先new 一个StringBuilder对象,调用其append方法进行字符串拼接,拼接完以后会返回一个新的对象“helloworld”。
“hello”,StringBuilder对象,“helloworld” - String str = “hello” + new String(“world”);
创建了五个对象
常量池对象"hello",“world”,new String(“world”)创建堆对象,还有一个堆对象“helloworld”,还有一个StringBuilder对象。