我知道Java中的字符串应该使用.equals()而不是==运算符进行比较。
但是在下面的代码中,有一个值为""的primaryObserverId
下面给出的if条件在Java6上运行良好,但在Java7上运行失败
String primaryObserverId = request.getParameter("primary_observer_id");
if(primaryObserverId == null || primaryObserverId=="")
primaryObserverId = RoleMap.getUserIdForThisSession(session.getId());我需要知道为什么这段代码在Java6上工作,而不是在Java7上工作。
我知道String Pool的概念在java中是如何用于字符串文字的,只是想知道这种突然行为的原因。
可以使用不同版本的GlassFish可能会导致任何问题,因为我在Java6中使用GlassFish-2.1,在Java7中使用GlassFish-4.1
发布于 2015-12-18 20:02:25
java中的所有字符串文字在需要时都被放置在堆的特殊区域中。因此,如果您有一个初始化为空字符串的变量,此字符串将被添加到堆中。如果您有另一个被初始化为空字符串的变量,那么它将包含对堆中已有的空字符串的引用,而不是创建新的空字符串。所以看起来你的问题是,当你在java6中运行你的应用程序时,出于某种原因,堆上有一个空字符串,这样你就可以检查这两个字符串是不是完全相同的对象。然而,当在java7中运行时,堆上没有空字符串,因此这两个字符串必须是完全不同的对象。
有关更完整的解释,请参阅this article。
发布于 2015-12-18 20:09:22
==比较内存中的地址,而equals()比较两个对象是否有意义地等价,因此在您的示例中,使用equals()方法更有意义,因为Servlet不使用池创建字符串,所以它们不是==,但它们是有意义的等价,因此是equals。
String primaryObserverId = request.getParameter("primary_observer_id");
if(primaryObserverId == null || "".equals(primaryObserverId)){
primaryObserverId = RoleMap.getUserIdForThisSession(session.getId());
}https://stackoverflow.com/questions/34355005
复制相似问题