java中的字符串内存分配

java中的字符串内存分配,java,string,memory,Java,String,Memory,在一个Servlet类中,我进行检查 if(“Mail”.equals(request.getParameter(mode))| |“Chat”.equals(request.getParameter(mode))) {} 我的问题是关于为字符串“Mail”和“Chat”分配的内存。它将为此servlet的每个请求创建新的字符串对象。GC呢?不,它不会每次都创建一个新对象。字符串常量是内部的-它们被创建一次并放入一个特殊的池中 它不仅不会在每次运行代码时创建新字符串,而且如果在代码的其他地方使用

在一个Servlet类中,我进行检查

if(“Mail”.equals(request.getParameter(mode))| |“Chat”.equals(request.getParameter(mode))) {}


我的问题是关于为字符串“Mail”和“Chat”分配的内存。它将为此servlet的每个请求创建新的字符串对象。GC呢?

不,它不会每次都创建一个新对象。字符串常量是内部的-它们被创建一次并放入一个特殊的池中

它不仅不会在每次运行代码时创建新字符串,而且如果在代码的其他地方使用常量“Mail”或“Chat”,它们也会使用相同的字符串对象

根据Java语言规范:

每个字符串文字都是对类字符串(§4.3.3)实例(§4.3.1,§12.5)的引用(§4.3)。字符串对象具有常量值。字符串文字,或者更一般地说,作为常量表达式(§15.28)值的字符串,使用String.intern方法“interned”以共享唯一实例


Jon,在另一个线程中,我问你它是否也存储在池中,以及它消耗了多少内存。我想know@org.life.java:是的,它确实存储在池中。它不会占用太多内存-基本上足够一个空字符数组和
字符串
对象本身。因此,如果你在类中经常使用字符串,并且不想冒拼写错误的风险,那么将字符串存储为
静态final
,才有意义,对吧?@cringe:就内存使用而言,是的。但是保持一致性是非常重要的……如果您曾经跟踪过仅仅调度一个servlet所执行的代码量,那么您就不会担心这样的微观优化了!