常量池:
java设计人员为了高效的使用内存,有了字符串常量池的概念.相同的字面值对象只在字符串常量池中创建一次就可以了,
当再出现相同的字面值对象时,不会创建新的对象,只是引用常量池中已经创建好的对象即可.
无则创建,有则返回
JVM虚拟机运行时,人为划分的内存分类
栈:方法调用的入栈、方法执行完毕出栈,方法中的局部变量都在每个方法对应的栈帧中分配.
堆: 程序运行时动态分配的内存,一new创建的对象就在堆里。
方法区(静态区):常量池在方法区里面
创建了几个对象
1.直接赋值
只会创建一个对象,在常量池中,无则创建,有则返回
String s1 = "aaa";//创建了一个对象 在常量池中
String s2 = "aaa";//没有创建对象
System.out.println(s1==s2);//true
System.out.println(s1.equals(s2));//true
2.new
new创建了两个对象:1.常量池中(无则创建、有则返回) 2.堆里(只要一new就一定会在堆里出现一个新的)
String s1 = new String("aaa");//创建了两个对象 常量池中是字面值对象 堆里是指向常量池中的地址
String s2 = new String("aaa");创建了一个对象 堆里那个
System.out.println(s1==s2);//false 不是引用同一个对象
System.out.println(s1.equals(s2));//true
System.out.println(s1.intern()==s2.intern());//true