String str1 = new String("abc");
Stirng str2 = "abc";
虽然两个语句都是返回一个String对象的引用,但是jvm对两者的处理方式是不一样的。
对于第一种,jvm会在内部维护的strings pool中放入一个"abc"对象,并在heap中创建一个String对象,然后将该heap中对象的引用返回给用户。
对于第二种,jvm首先会在内部维护的strings pool中通过String的equels方法查找是对象池中是否存放有该String对象,如果有,则返回已有的String对象给用户,而不会在heap中重新创建一个新的String对象;如果对象池中没有该String对象,jvm则创建新的String对象添加至strings pool中,将其引用返回给用户。
注意:使用第一种方法创建对象时,jvm是会主动把该对象放到strings pool里面的。
问题:对于第一种,jvm会在内部维护的strings pool中放入一个"abc"对象,并在heap中创建一个String对象,然后将该heap中对象的引用返回给用户。
堆中创建的String 对象和 字符串常量池中的abc 对象是什么关系?难道只是为了跟别的String 对象或变量 equals 时候用的吗?