== Why is this an issue?

The `equals` method in `AtomicInteger` and `AtomicLong` returns `true` only if two instances are identical, not if they represent the same number value.

This is because `equals` is not part of the API contract of these classes, and they do not override the method inherited from `java.lang.Object`.
Although both classes implement the `Number` interface, assertions about `equals` comparing number values are not part of that interface either.
Only the API contract of implementing classes like `Integer`, `Long`, `Float`, `BigInteger`, etc., provides such assertions.

== How to fix it

- To compare the number value of two instances `a` and `b` of `AtomicInteger` or `AtomicLong`, use `a.get() == b.get()` instead of `a.equals(b)`.
- If you want to check for object identity, use `a == b` instead of `a.equals(b)` to clarify your intention.

=== Code examples

==== Noncompliant code example

[source,java,diff-id=1,diff-type=noncompliant]
----
Boolean isSameNumberValue(AtomicLong a, AtomicLong b) {
  return a.equals(b); // Noncompliant, this is true only if a == b
}

Boolean isSameReference(AtomicLong a, AtomicLong b) {
  return a.equals(b); // Noncompliant, because misleading
}
----

==== Compliant solution

[source,java,diff-id=1,diff-type=compliant]
----
Boolean isSameNumberValue(AtomicLong a, AtomicLong b) {
  return a.get() == b.get(); // Compliant
}

Boolean isSameReference(AtomicLong a, AtomicLong b) {
  return a == b; // Compliant
}
----

== Resources

=== Documentation

* https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html[Java SE 8 API Specification: Package "java.util.concurrent.atomic"]

=== Articles & blog posts

* https://programming.guide/java/atomicinteger-equals.html[Programming.Guide: AtomicInteger and equals / Comparable]


ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

=== Message

Use ".get()" to retrieve the value and compare it instead.


endif::env-github,rspecator-view[]
