<html><head><style id="css_styles" type="text/css"><!--blockquote.cite { margin-left: 5px; margin-right: 0px; padding-left: 10px; padding-right:0px; border-left: 1px solid #cccccc }
blockquote.cite2 {margin-left: 5px; margin-right: 0px; padding-left: 10px; padding-right:0px; border-left: 1px solid #cccccc; margin-top: 3px; padding-top: 0px; }
a img { border: 0px; }
li[style='text-align: center;'], li[style='text-align: center; '], li[style='text-align: right;'], li[style='text-align: right; '] {  list-style-position: inside;}
body { font-family: 'Segoe UI'; font-size: 12pt; }
.quote { margin-left: 1em; margin-right: 1em; border-left: 5px #ebebeb solid; padding-left: 0.3em; }
--></style></head><body><div>I think this comparison is not very valid.</div><div><br /></div><div>`Integer` is not the type you an experienced Java developer would use for this, you'd use `int` which can't be set to `null`, just like `Int32` in C# can't be set to `null`.  Generally, use of `Integer` like you do in your example is not recommended and often a sign that the developer is not yet that familiar with Java.  The only places I'd expect to see `Integer` is in generic declarations (like List<Integer>) or at the input/output layers of your application to indicate a value can be an integer OR null.  Usage like this would immediately (and safely) be replaced with `int` (doing calculations on them means they can't be null so `int` is the correct type to use).</div><div><br /></div><div><span>```java</span><br style="background-color:rgba(0,0,0,0);" /><span>int int1 = 100;</span><br style="background-color:rgba(0,0,0,0);" /><span>int int2 = 100;</span><br style="background-color:rgba(0,0,0,0);" /><span>int int3 = int1 + 100;</span><br style="background-color:rgba(0,0,0,0);" /><span>int int4 = int2 + 100;</span><br style="background-color:rgba(0,0,0,0);" /><span>out.println(int3 == int4); // true!</span><br style="background-color:rgba(0,0,0,0);" /><span>```</span><br /></div><div><br /></div><div>--John</div><div><br /></div>
<div>------ Original Message ------</div>
<div>From "tzengshinfu" <<a href="mailto:tzengshinfu@gmail.com">tzengshinfu@gmail.com</a>></div>
<div>To <a href="mailto:amber-dev@openjdk.org">amber-dev@openjdk.org</a></div>
<div>Date 31/10/2023 03:10:16</div>
<div>Subject Re: Is there a possibility of the string equality operator (==) being fixed?</div><div><br /></div>
<div id="x112a455ab35c4ee"><blockquote cite="CANj-iJf4NwWYoOoyXCXrbZ=YvsBdSX-3pbb_xrkRQtHP2ydYWw@mail.gmail.com" type="cite" class="cite2">
<div dir="ltr"><div dir="ltr">Thank you, Anatoly, for informing me about `IntegerCache`.<br />As a developer experienced in C# and JavaScript/TypeScript, I am currently responsible for migrating our in-house systems from C# to Java.<br />I also have the responsibility of training and sharing knowledge with others.<br /><br />I was surprised by the following result in Java:<br /><br />```java<br />Integer int1 = 100;<br />Integer int2 = 100;<br />Integer int3 = int1 + 100;<br />Integer int4 = int2 + 100;<br />out.println(int3 == int4); // false<br />```<br /><br />This is different from how it works in C#:<br /><br />```C#<br />Int32 int1 = 100;<br />Int32 int2 = 100;<br />Int32 int3 = int1 + 100;<br />Int32 int4 = int2 + 100;<br />Console.Write(int3 == int4); // True<br />```<br /><br />Now, I understand that Java's design philosophy (thanks to Brian for patiently explaining) leads to this behavior.<br />I will make an effort to understand how this works under the hood and include it in my Java FAQ documentation.<br />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.<br />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.<br /><br />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").<br /><br />Can I propose a Solution C?<br /><br />Solution C: Introduce the === and !== operators for value comparison (equivalent to Object::equals()).<br /><br />For example:<br /><br />```java<br />if (Integer4 === Integer1 + Integer2 + Integer3) {<br />    // Do something...<br />}<br />```<br /><br />Would be equivalent to:<br /><br />```java<br />if (Integer4.equals(Integer1 + Integer2 + Integer3)) {<br />    // Do something...<br />}<br />```<br /><br />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().<br />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.<br />However, there are also counterexamples, such as Rust's code, where excessive symbols may contribute to a steep learning curve.<br clear="all" /><div><div dir="ltr" class="gmail_signature"><br />/* GET BETTER EVERY DAY */<br /><br /><br /></div></div></div></div>
</blockquote></div>
</body></html>