【Java基础】-- 内存分配之堆、栈、常量池

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YYZZHC999/article/details/82084838

Java内存分配主要包括以下几个区域:

  1. 寄存器:我们在程序中无法控制

  2. 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中

  3. 堆:存放用new产生的数据

  4. 静态域:存放在对象中用static定义的静态成员

  5. 常量池:存放常量

  6. 非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.

猜你喜欢

转载自blog.csdn.net/YYZZHC999/article/details/82084838