版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YYZZHC999/article/details/82084838
Java内存分配主要包括以下几个区域:
寄存器:我们在程序中无法控制
栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中
堆:存放用new产生的数据
静态域:存放在对象中用static定义的静态成员
常量池:存放常量
非RAM(随机存取存储器)存储:硬盘等永久存储空间
(1)堆和常量池
String s1 = "abc"; // 常量池
String s2 = new String("abc"); // 堆内存中
System.out.println(s1==s2); // false两个对象的地址值不一样。
System.out.println(s1.equals(s2)); // true
(2)常量池
String s1="a"+"b"+"c";
String s2="abc";
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
java中的常量优化机制,s1成为abc在常量池中创建,所以s2无需再次创建。
(3)
String s1="ab";
String s2="abc";
String s3=s1+"c";
System.out.println(s3==s2); // false
System.out.println(s3.equals(s2)); // true
现在常量池中创建ab“”, 地址指向了s1; 再创建”abc”,地址指向了s2;对于s3先创建StringBuilder(或者stringbuffer)对象,通过append连接到“abc”,再调用toString()转换得到的地址指向s3,所以s3==s2为false.