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

Jens Lideström jens at lidestrom.se
Tue Oct 31 07:33:16 UTC 2023


Remember that C# has its own quirks regarding the behaviour of ==.

Example of the behaviour in C#:

```
string s1 = new String("1");
string s2 = new String("1");
object o1 = s1;
object o2 = s2;
Console.WriteLine(s1 == s2); // True, overload for string kicks in
Console.WriteLine(o1 == o2); // False, reference equality!

int? i1 = 1;
int? i2 = 1;
object o1 = i1;
object o2 = i2;
Console.WriteLine(i1 == i2); // True, overload for Nullable<int> kicks 
in
Console.WriteLine(o1 == o2); // False, reference equality!
```

That is, in C# the behaviour of == varies for the same objects, 
depending on what types the references have.

Both approaches have their advantages and disadvantages. But to me 
Java's approach seems more sensible: For reference types == always means 
reference equality.

Best regards,
Jens Lideström

On 2023-10-31 03:10, tzengshinfu wrote:

> 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 */


More information about the amber-dev mailing list