Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将在常量池中创建多少个字符串对象_Java_String_Logging_Log4j - Fatal编程技术网

Java 将在常量池中创建多少个字符串对象

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

考虑以下语句,并且日志级别设置为ERROR。正在使用的日志API是log4j。 根据上述信息,将创建多少个字符串

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请阅读,