相关疑难解决方法(0)

Java中==和equals()之间有什么区别?

我想澄清一下我是否理解正确:

  • == - >是参考比较,即两个对象都指向相同的内存位置
  • .equals() - >计算对象中值的比较

我的理解是正确的吗?

java identity equality object-comparison

592
推荐指数
12
解决办法
62万
查看次数

在Java中的枚举上使用==可以吗?

可以==在Java中使用枚举,还是需要使用.equals()?在我的测试中,==总是有效,但我不确定我是否能保证这一点.特别是,.clone()枚举上没有方法,所以我不知道是否有可能得到一个枚举,其.equals()返回的值不同于==.

例如,这样就可以了:

public int round(RoundingMode roundingMode) {
  if(roundingMode == RoundingMode.HALF_UP) {
    //do something
  } else if (roundingMode == RoundingMode.HALF_EVEN) {
    //do something
  }
  //etc
}
Run Code Online (Sandbox Code Playgroud)

或者我需要这样写:

public int round(RoundingMode roundingMode) {
  if(roundingMode.equals(RoundingMode.HALF_UP)) {
    //do something
  } else if (roundingMode.equals(RoundingMode.HALF_EVEN)) {
    //do something
  }
  //etc
}
Run Code Online (Sandbox Code Playgroud)

java syntax enums

105
推荐指数
5
解决办法
4万
查看次数

如果equals(null)抛出NullPointerException,这是一个坏主意吗?

合同equals与问候null,如下所示:

对于任何非空引用值x,x.equals(null)应该return false.

这是相当奇特的,因为如果o1 != nullo2 == null,那么我们有:

o1.equals(o2) // returns false
o2.equals(o1) // throws NullPointerException
Run Code Online (Sandbox Code Playgroud)

o2.equals(o1) throws NullPointerException是一件好事,因为它提醒我们程序员错误.然而,如果出于各种原因我们只是将其切换到了那个错误就不会被捕获o1.equals(o2),而这只会"默默地失败".

所以问题是:

  • 为什么o1.equals(o2)不应该return false投掷而不是一个好主意NullPointerException
  • 如果我们尽可能地重写合同以便anyObject.equals(null)总是扔掉,那会NullPointerException不是一个坏主意?

与...比较 Comparable

相反,这就是Comparable合同所说的:

请注意,这null不是任何类的实例,并且e.compareTo(null)应该抛出一个NullPointerException偶数e.equals(null)返回false.

如果NullPointerException适合compareTo,为什么不适合equals

相关问题


一个纯粹的语义论证

这些是Object.equals(Object …

java null equals nullpointerexception

75
推荐指数
3
解决办法
5万
查看次数

Javafx 2单击并双击

我想知道是否有可能检测到JavaFX 2中的双击?如何 ?

我想在点击和双击之间进行不同的事件.

谢谢

java javafx click double-click javafx-2

53
推荐指数
2
解决办法
6万
查看次数

为什么Java不允许在枚举中覆盖equals(Object)?

我注意到以下代码片段......

@Override
public boolean equals(Object otherObject) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

......不允许的枚举,由于该方法equals(Object x)被定义为finalEnum.为什么会这样?

我想不出任何需要覆盖equals(Object)Enum的用例.我只是想知道这种行为背后的原因.

java enums api-design

38
推荐指数
1
解决办法
2万
查看次数

如何比较布尔值?

以此为例(摘自Java正则表达式检查程序不起作用):

while(!checker) {
    matcher = pattern.matcher(number);
    if(matcher.find())
        checker = true;
    else
        year++;
}
Run Code Online (Sandbox Code Playgroud)

如果.equals(false)用来检查价值是否重要Boolean checker

我知道有是颇为相似.但是,显然这个问题涉及原始boolean而不是对象包装器Boolean; 因此,.equals()不适用.

还应该Boolean以不同的方式处理boolean

java boolean

29
推荐指数
2
解决办法
10万
查看次数

Singleton中的线程安全性

我知道Java中的双重锁定已被破坏,那么在Java中使单例线程安全的最佳方法是什么?我想到的第一件事是:

class Singleton{
    private static Singleton instance;

    private Singleton(){}

    public static synchronized Singleton getInstance(){
        if(instance == null) instance = new Singleton();
        return instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

这有用吗?如果是这样,它是最好的方式(我想这取决于具体情况,所以说明特定技术最好的时候会有用)

java singleton multithreading

13
推荐指数
3
解决办法
6553
查看次数

比较枚举的最佳方法

例如,我有一个枚举enum Color { Red, Brown }.我也有一些这种类型的变量:

Color c1 = Brown, c2 = Red
Run Code Online (Sandbox Code Playgroud)

比较常数值的最佳方法是什么:

if (c1 == Color.Brown) { 
    //is brown
}
Run Code Online (Sandbox Code Playgroud)

要么

if (c1.equals(Color.Brown)) {
    //is brown
}
Run Code Online (Sandbox Code Playgroud)

java enums

6
推荐指数
1
解决办法
2万
查看次数

枚举等于()和==

enum Drill{
        ATTENTION("Attention!"), AT_EASE("At Ease");    
        private String str; 
        private Drill(String str){
            this.str = str;
        }
        public String toString(){
            return str;
        }
    }
public class EnumExample {
    public static void main(String[] args) {
            Drill d1= Drill.valueOf("ATTENTION");
            Drill d2= Drill.valueOf("ATTENTION");
            **System.out.println(d1.equals(d2));//TRUE
            System.out.println(d1==d2);//TRUE**
            System.out.println(Drill.ATTENTION.equals(Drill.valueOf("ATTENTION")));
            System.out.println(Drill.ATTENTION.equals(Drill.AT_EASE));//FALSE 
            System.out.println(Drill.ATTENTION==Drill.valueOf("ATTENTION"));//TRUE
            System.out.println(Drill.ATTENTION==Drill.AT_EASE);//FALSE
}
}
Run Code Online (Sandbox Code Playgroud)

使用==和equals()时的枚举行为似乎相同.根据我的知识,==只是检查参考.因此d1 == d2应为FALSE.任何人都可以解释这种行为为什么是真的?

java enums

6
推荐指数
1
解决办法
301
查看次数

为什么使用==比较枚举导致PMD警告?

以下比较使用以下两个枚举值==:

MyEnum enum1 = blah();     // could return null
MyEnum enum2 = blahblah()  // could return null
if (enum1 == enum2) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

但是PMD 在第3行给出了CompareObjectsWithEquals警告:

使用equals()来比较对象引用

不确定我理解这个检查源代码,但认为比较两个枚举是可以的,==所以我想知道我的代码是否可以改进或检查是否错误.

java comparison enums pmd

6
推荐指数
1
解决办法
850
查看次数