Integer Comparison Behavior: Java vs C# vs PHP

When working across multiple programming languages, subtle differences in how numeric types are represented and compared can easily lead to confusing and hard to debug. A well known example is Java’s Integer comparison behavior, where the result of == depends on the numeric value being compared. Why Integer 1 == Integer 1 evaluates to true in Java, while Integer 1000 == Integer 1000 evaluates to false, it not happened on PHP or C#.

Integer x = 1;
Integer y = 1;
System.out.println(x == y); // true


Integer a = 1000;
Integer b = 1000;
System.out.println(a == b); // false

At first glance, this behavior appears inconsistent. In reality, it is intentional and rooted in Java’s design.

Integer Cache in Java

Java implements an Integer Cache mechanism to improve performance and reduce memory usage. Key points:

  • Integer values in the range -128 to 127 are cached by the JVM
  • During autoboxing (int → Integer), cached instances are reused if the value falls within this range
  • The == operator compares object references, not numeric values

As a result:

  • Integer.valueOf(1) returns the same cached object every time
  • Integer.valueOf(1000) creates a new object for each call

So, in Java:

  • == compares references for wrapper types
  • .equals() compares values

Correct Code:

Integer a = 1000;
Integer b = 1000;
System.out.println(a.equals(b)); // true

Does the Same Thing Happen in C#?

int x = 1;
int y = 1;
Console.WriteLine(x == y); // true


int a = 1000;
int b = 1000;
Console.WriteLine(a == b); // true

The result is always true, regardless of the value.

Why?

  • int in C# is a value type, not an object
  • The == operator compares values, not references
  • There is no concept of an observable integer cache

What will happen when we use object?

object x = 1;
object y = 1;
Console.WriteLine(x == y); // false

Explanation:

  • object is a reference type
  • Boxing creates distinct object instances

C# Summary

  • int is safe to compare using ==
  • Reference comparison only occurs when explicitly using object

Then, let’s try in PHP

$x = 1;
$y = 1;
var_dump($x == $y); // true
var_dump($x === $y); // true


$a = 1000;
$b = 1000;
var_dump($a == $b); // true
var_dump($a === $b); // true

Explanation

  • Integers in PHP are scalar values, not objects
  • There is no wrapper class like Java’s Integer
  • Any internal memory optimizations are not observable at the language level

PHP Operators:

  • == compares values (with type juggling)
  • === compares both value and type

Leave a Reply

Your email address will not be published. Required fields are marked *.

*
*