1、首先将一片空间分为栈和堆,栈是来执行程序的,堆是用来存放公共属性的。
2、分了一片空间叫做元空间里面分配了一片空间叫常量池,常量池中分配了一片空间存放abc
3、栈中给每个方法独立的分配了一片空间叫栈挣,栈挣里面又分配了一片空间叫做成员变量的槽,槽里面存放引用数据类型s1,如果abc直接等于abc,会去常量池里面去找。
4、所以基础数据类型比较的是值,引用数据类型比较的是内存地址,因为具体的值不会再栈挣中存储,而是存放在另一片空间,需要一个内存地址来指向他。如果写成String s1="abc"就会在常量池里面去分配。如果写成s1 = new String();就会在堆中分配空间,s1和s2的指向变了,所以s1和s2不一样,new String()中的abc是在常量池中第一字符串不让变,第二找的话直接到常量池里面找,速度会很快。