字符串池即StirngPool的确是存在于常量池中,其实字符串池只是常量池的一部分,那些常量如final修饰的常量也存在常量池中;我记得毕老师说过,常量池是存在于方法区中的。java为了优化内存空间,将那些固定不变的作为常量存储起来,并不会再第二次创建相同的常量了,即所说的创建了String s = "abc",在定义String b = "abc"就会将变量b也指向已有的"abc"了。其中a和b这两个变量是存在于栈内存中的,使用完毕就会释放的。而"abc"是存在于常量池中,常量池存在于方法区中,所以,使用完后,还是存在这个常量的。因此,常量池不是在栈内存中,而是单独的开辟的方法区中。其实,这些常量是在jvm在加载class之后,才在方法区中开辟的一片空间的。
如果感兴趣的话,你可以看看关于内存分配的总结: