Is there a possibility of the string equality operator (==) being fixed?

tzengshinfu tzengshinfu at gmail.com
Tue Oct 31 02:10:16 UTC 2023


Thank you, Anatoly, for informing me about `IntegerCache`.
As a developer experienced in C# and JavaScript/TypeScript, I am currently
responsible for migrating our in-house systems from C# to Java.
I also have the responsibility of training and sharing knowledge with
others.

I was surprised by the following result in Java:

```java
Integer int1 = 100;
Integer int2 = 100;
Integer int3 = int1 + 100;
Integer int4 = int2 + 100;
out.println(int3 == int4); // false
```

This is different from how it works in C#:

```C#
Int32 int1 = 100;
Int32 int2 = 100;
Int32 int3 = int1 + 100;
Int32 int4 = int2 + 100;
Console.Write(int3 == int4); // True
```

Now, I understand that Java's design philosophy (thanks to Brian for
patiently explaining) leads to this behavior.
I will make an effort to understand how this works under the hood and
include it in my Java FAQ documentation.
My initial thoughts and suggestions were aimed at colleagues who are also
transitioning from other programming languages and newcomers to Java who
bring their language experiences.
Naturally, they might find the unexpected results in certain use cases, and
I hope to find ways to make this learning curve smoother without disrupting
the existing framework.

Without breaking the current architecture, both Solution A (changing
String1 == String2 to String::equals()) and Solution B (introducing a new
string/str class to replace the String class) are unfeasible (thanks to
Nathan for preventing "I think it's rarely used, but in reality, it's not,
and everything breaks").

Can I propose a Solution C?

Solution C: Introduce the === and !== operators for value comparison
(equivalent to Object::equals()).

For example:

```java
if (Integer4 === Integer1 + Integer2 + Integer3) {
    // Do something...
}
```

Would be equivalent to:

```java
if (Integer4.equals(Integer1 + Integer2 + Integer3)) {
    // Do something...
}
```

>From a visual perspective, I believe that the === and !== operators can
reduce the chances of typos and make the code look cleaner, with fewer
parentheses compared to using equals().
Sometimes, symbols can convey meaning more clearly than text. This idea
stems from my experience with Delphi, where the use of keywords like begin
and end mixed with variable declarations and expressions made code
difficult to read in a plain text editor, despite IDE features like
highlighting and automatic formatting. Java's use of {} solved this issue.
However, there are also counterexamples, such as Rust's code, where
excessive symbols may contribute to a steep learning curve.

/* GET BETTER EVERY DAY */
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/amber-dev/attachments/20231031/9e4a9092/attachment.htm>


More information about the amber-dev mailing list