Java中的栈、堆和常量池是程序存储数据的三个主要区域。它们分别具有不同的特点和用途。
栈:栈又叫做方法栈,它用于存放方法的局部变量和方法调用的信息。每个线程都有自己的栈,它具有LIFO(后进先出)的特点。栈的大小是固定的,超过栈的大小会导致堆栈溢出。在栈中存储的数据是基本类型的值或者对象的引用。
public static void main(String[] args){ int a = 10; //将值10存入栈中 String str = "Hello World"; //将字符串"Hello World"的引用存入栈中 System.out.println(a); //从栈中取出a的值并打印 System.out.println(str); //从栈中取出str的引用并打印 }
堆:堆是Java虚拟机的内存池,用于存储类的实例、数组和字符串等动态生成的对象。堆具有动态扩展的特性,当堆中的对象达到一定数量时,堆会自动扩展。堆中的对象可由所有线程共享。
class Person{ private String name; public Person(String name){ this.name = name; } } public static void main(String[] args){ Person p1 = new Person("张三"); //在堆中创建Person对象 Person p2 = new Person("李四"); }
常量池:常量池用于存放编译时生成的各种字面量和符号引用,如字符串常量、基本类型常量、类和接口的全限定名、方法和字段的名称和描述符等。常量池具有共享的特性,多个对象可以共享同一个常量池中的常量。
public static void main(String[] args){ String str1 = "hello"; //将字符串"hello"存入常量池中 String str2 = "hello"; String str3 = new String("hello"); //在堆中创建String对象 System.out.println(str1 == str2); //比较str1和str2的引用,返回true System.out.println(str1 == str3); //比较str1和str3的引用,返回false }