Java 将在常量池中创建多少个字符串对象
考虑以下语句,并且日志级别设置为ERROR。正在使用的日志API是log4j。 根据上述信息,将创建多少个字符串Java 将在常量池中创建多少个字符串对象,java,string,logging,log4j,Java,String,Logging,Log4j,考虑以下语句,并且日志级别设置为ERROR。正在使用的日志API是log4j。 根据上述信息,将创建多少个字符串 if (logger.isDebugEnabled()) { logger.debug("Executing SQL query [" + sql + "]"); } 另一个问题是 if (logger.isDebugEnabled()) { StringBuilder sBuilder = new StringBuilder("Executing SQL que
if (logger.isDebugEnabled()) {
logger.debug("Executing SQL query [" + sql + "]");
}
另一个问题是
if (logger.isDebugEnabled()) {
StringBuilder sBuilder = new StringBuilder("Executing SQL query [");
sBuilder.append(sql);
sBuilder.append("]");
logger.debug(sBuilder.toString());
}
在上述情况下,将创建多少个字符串
我的问题是,即使没有为调试启用记录器,编译器也会创建字符串吗
logger.debug("Executing SQL query [" + sql + "]");
两条线
"Executing SQL query ["
"]"
在编译时创建
然后,在运行时
"Executing SQL query [" + sql + "]"
(+)操作符JVM
返回新的StringBuilder(string….toString(),它在堆内存中创建一个新string实例
如果启用调试,则追加操作将使用StringBuilder.toString
两条线
"Executing SQL query ["
"]"
在编译时创建
然后,在运行时
"Executing SQL query [" + sql + "]"
(+)操作符JVM
返回新的StringBuilder(string….toString(),它在堆内存中创建一个新string实例
追加操作将在
StringBuilder.toString
中发生,如果启用调试。如果源代码中有引号,则编译器将把字符串常量放入池中,无论代码有多复杂。编译器不会做出很多假设,除非它能清楚地看到代码是不可访问的(比如if(false)
)
你可能想看看slf4j的logback,它允许你写东西
log.debug("Executing SQL query [{}]", sql);
请注意,在运行时,它仍然会创建一个StringBuilder
,并根据模式和参数生成结果,但slf4j将为您执行if
。这将使您的代码保持干净和快速,而无需付出很多努力
您可能希望查看它们,使其更简单、更紧凑。如果源代码中有引号,那么无论代码多么复杂,编译器都会将字符串常量放入池中。编译器不会做出很多假设,除非它能清楚地看到代码是不可访问的(比如
if(false)
)
你可能想看看slf4j的logback,它允许你写东西
log.debug("Executing SQL query [{}]", sql);
请注意,在运行时,它仍然会创建一个StringBuilder
,并根据模式和参数生成结果,但slf4j将为您执行if
。这将使您的代码保持干净和快速,而无需付出很多努力
您可能希望查看它们的代码,使其更简单、更紧凑。这些代码也会在运行时加载吗?@Jabir当然,这是一个简单的java代码行,不管它是logger还是其他什么。至少我相信是这样。@Suresh我对问题做了一些修改,你们能检查一下吗now@Jabir同样,创建了两个字符串。还有一个在运行时解决。@Jabir请阅读,它们也会在运行时加载吗?@Jabir当然,这是一个简单的java行,不管它是logger还是其他什么。至少我相信是这样。@Suresh我对问题做了一些修改,你们能检查一下吗now@Jabir同样,创建了两个字符串。一个在运行时解决。@Jabir请阅读,