Seamus  Quitzon

Seamus Quitzon

1599278213

Java Integer Cache: Why Integer.valueOf(127) == Integer.valueOf(127) Is True

Short Answer

The short answer to this question is, direct assignment of an int literal to an Integer reference is an example of auto-boxing concept where the literal value to object conversion code is handled by the compiler, so during compilation phase compiler converts Integer a = 127; to Integer a = Integer.valueOf(127);.

The Integer class maintains an internal IntegerCache for integers which, by default, ranges from -128 to 127 and Integer.valueOf() method returns objects of mentioned range from that cache. So a == b returns true because a and b both are pointing to the same object.

Long Answer

In order to understand the short answer, let’s first understand the Java types, all types in Java lies under two categories

  1. Primitive Types: There are 8 primitive types (byteshortintlongfloatdoublechar, and boolean) in Java, which holds their values directly in the form of binary bits.
  2. For example, int a = 5; int b = 5; here a and b directly holds the binary value of 5, and if we try to compare a and b using a == b, we are actually comparing 5 == 5, which returns true.
  3. Reference Types: All types other than primitive types lies under the category of reference types, e.g. Classes, Interfaces, Enums, Arrays, etc. and reference types holds the address of the object instead of the object itself.
  4. For example, Integer a = new Integer(5); Integer b = new Integer(5), here, a and b do not hold the binary value of 5 instead a and b holds memory addresses of two separate objects where both objects contain a value 5. So if we try to compare a and b using a == b, ,we are actually comparing those two separate memory addresses. Hence, we get false, to perform actual equality on a and b we need to perform a.euqals(b).

Reference types are further divided into 4 categories:  Strong, Soft, Weak and Phantom References.

And we know that Java provides wrapper classes for all primitive types and support auto-boxing and auto-unboxing.

// Example of auto-boxing, here c is a reference type

Integer c = 128; // Compiler converts this line to Integer c = Integer.valueOf(128);

// Example of auto-unboxing, here e is a primitive type

int e = c; // Compiler converts this line to int e = c.intValue();


Now, if we create two integer objects `a` and `b,` and try to compare them using the equality operator `==`, we will get `false` because both references are holding different-different objects

Integer a = 128; // Compiler converts this line to Integer a = Integer.valueOf(128);

Integer b = 128; // Compiler converts this line to Integer b = Integer.valueOf(128);

System.out.println(a == b); // Output – false


But if we assign the value `127` to both `a` and `b` and try to compare them using the equality operator `==`, we will get `true` why?

Integer a = 127; // Compiler converts this line to Integer a = Integer.valueOf(127);

Integer b = 127; // Compiler converts this line to Integer b = Integer.valueOf(127);

System.out.println(a == b); // Output – true


As we can see in the code, we are assigning different objects to `a` and `b` but `a == b` can return true only if both `a` and `b` are pointing to the same object.

So, how does the comparison return true? what's actually happening here? are `a` and `b` pointing to the same object?

Well, until now, we know that the code `Integer a = 127;` is an example of auto-boxing and compiler automatically converts this line to `Integer a = Integer.valueOf(127);`.

So, it is the `Integer.valueOf()` method that is returning these integer objects, which means this method must be doing something under the hood.

And if we take a look at the source code of `Integer.valueOf()` method, we can clearly see that if the passed int literal `i` is greater than `IntegerCache.low` and less than `IntegerCache.high ,`then the method returns Integer objects from `IntegerCache`. Default values for `IntegerCache.low` and `IntegerCache.high` are `-128` and `127` respectively.

In other words, instead of creating and returning new integer objects, `Integer.valueOf()` method returns Integer objects from an internal `IntegerCache` if the passed `int` literal is greater than `-128` and less than `127`.

#java #cache #short #long #btye #integer cache #java integer

What is GEEK

Buddha Community

Java Integer Cache: Why Integer.valueOf(127) == Integer.valueOf(127) Is True
Seamus  Quitzon

Seamus Quitzon

1599278213

Java Integer Cache: Why Integer.valueOf(127) == Integer.valueOf(127) Is True

Short Answer

The short answer to this question is, direct assignment of an int literal to an Integer reference is an example of auto-boxing concept where the literal value to object conversion code is handled by the compiler, so during compilation phase compiler converts Integer a = 127; to Integer a = Integer.valueOf(127);.

The Integer class maintains an internal IntegerCache for integers which, by default, ranges from -128 to 127 and Integer.valueOf() method returns objects of mentioned range from that cache. So a == b returns true because a and b both are pointing to the same object.

Long Answer

In order to understand the short answer, let’s first understand the Java types, all types in Java lies under two categories

  1. Primitive Types: There are 8 primitive types (byteshortintlongfloatdoublechar, and boolean) in Java, which holds their values directly in the form of binary bits.
  2. For example, int a = 5; int b = 5; here a and b directly holds the binary value of 5, and if we try to compare a and b using a == b, we are actually comparing 5 == 5, which returns true.
  3. Reference Types: All types other than primitive types lies under the category of reference types, e.g. Classes, Interfaces, Enums, Arrays, etc. and reference types holds the address of the object instead of the object itself.
  4. For example, Integer a = new Integer(5); Integer b = new Integer(5), here, a and b do not hold the binary value of 5 instead a and b holds memory addresses of two separate objects where both objects contain a value 5. So if we try to compare a and b using a == b, ,we are actually comparing those two separate memory addresses. Hence, we get false, to perform actual equality on a and b we need to perform a.euqals(b).

Reference types are further divided into 4 categories:  Strong, Soft, Weak and Phantom References.

And we know that Java provides wrapper classes for all primitive types and support auto-boxing and auto-unboxing.

// Example of auto-boxing, here c is a reference type

Integer c = 128; // Compiler converts this line to Integer c = Integer.valueOf(128);

// Example of auto-unboxing, here e is a primitive type

int e = c; // Compiler converts this line to int e = c.intValue();


Now, if we create two integer objects `a` and `b,` and try to compare them using the equality operator `==`, we will get `false` because both references are holding different-different objects

Integer a = 128; // Compiler converts this line to Integer a = Integer.valueOf(128);

Integer b = 128; // Compiler converts this line to Integer b = Integer.valueOf(128);

System.out.println(a == b); // Output – false


But if we assign the value `127` to both `a` and `b` and try to compare them using the equality operator `==`, we will get `true` why?

Integer a = 127; // Compiler converts this line to Integer a = Integer.valueOf(127);

Integer b = 127; // Compiler converts this line to Integer b = Integer.valueOf(127);

System.out.println(a == b); // Output – true


As we can see in the code, we are assigning different objects to `a` and `b` but `a == b` can return true only if both `a` and `b` are pointing to the same object.

So, how does the comparison return true? what's actually happening here? are `a` and `b` pointing to the same object?

Well, until now, we know that the code `Integer a = 127;` is an example of auto-boxing and compiler automatically converts this line to `Integer a = Integer.valueOf(127);`.

So, it is the `Integer.valueOf()` method that is returning these integer objects, which means this method must be doing something under the hood.

And if we take a look at the source code of `Integer.valueOf()` method, we can clearly see that if the passed int literal `i` is greater than `IntegerCache.low` and less than `IntegerCache.high ,`then the method returns Integer objects from `IntegerCache`. Default values for `IntegerCache.low` and `IntegerCache.high` are `-128` and `127` respectively.

In other words, instead of creating and returning new integer objects, `Integer.valueOf()` method returns Integer objects from an internal `IntegerCache` if the passed `int` literal is greater than `-128` and less than `127`.

#java #cache #short #long #btye #integer cache #java integer

Tyrique  Littel

Tyrique Littel

1600135200

How to Install OpenJDK 11 on CentOS 8

What is OpenJDK?

OpenJDk or Open Java Development Kit is a free, open-source framework of the Java Platform, Standard Edition (or Java SE). It contains the virtual machine, the Java Class Library, and the Java compiler. The difference between the Oracle OpenJDK and Oracle JDK is that OpenJDK is a source code reference point for the open-source model. Simultaneously, the Oracle JDK is a continuation or advanced model of the OpenJDK, which is not open source and requires a license to use.

In this article, we will be installing OpenJDK on Centos 8.

#tutorials #alternatives #centos #centos 8 #configuration #dnf #frameworks #java #java development kit #java ee #java environment variables #java framework #java jdk #java jre #java platform #java sdk #java se #jdk #jre #open java development kit #open source #openjdk #openjdk 11 #openjdk 8 #openjdk runtime environment

Samanta  Moore

Samanta Moore

1620458875

Going Beyond Java 8: Local Variable Type Inference (var) - DZone Java

According to some surveys, such as JetBrains’s great survey, Java 8 is currently the most used version of Java, despite being a 2014 release.

What you are reading is one in a series of articles titled ‘Going beyond Java 8,’ inspired by the contents of my book, Java for Aliens. These articles will guide you step-by-step through the most important features introduced to the language, starting from version 9. The aim is to make you aware of how important it is to move forward from Java 8, explaining the enormous advantages that the latest versions of the language offer.

In this article, we will talk about the most important new feature introduced with Java 10. Officially called local variable type inference, this feature is better known as the **introduction of the word **var. Despite the complicated name, it is actually quite a simple feature to use. However, some observations need to be made before we can see the impact that the introduction of the word var has on other pre-existing characteristics.

#java #java 11 #java 10 #java 12 #var #java 14 #java 13 #java 15 #verbosity

Macey  Legros

Macey Legros

1599318240

Java String valueOf() Example | valueOf() Function In Java

Java String valueOf() is an inbuilt method that converts the different types of values (data types) into string type. This method is static, it can take up to two parameters, one is the String, and the other is the radix.

Java String valueOf()

Java String valueOf() method returns a string representation of the int, long, float, boolean, char, char array, and double arguments. We have different versions of the valueOf() method for each type of argument.

#java #java string valueof #valueof

Samanta  Moore

Samanta Moore

1620462686

Spring Boot and Java 16 Records

In this article, we will discuss Java 16’s newest feature, Records. Then we will apply this knowledge and use it in conjunction with a Spring Boot application.

On March 16th, 2021, Java 16 was GA. With this new release, tons of new exciting features have been added. Check out the release notes to know more about these changes in detail. This article’s focus will be on Java Records, which got delivered with JEP 395. Records were first introduced in JDK 14 as a preview feature proposed by JEP 359, and with JDK 15, they remained in preview with JEP 384. However, with JDK 16, Records are no longer in preview.

I have picked Records because they are definitely the most favored feature added in Java 16, according to this Twitter poll by Java Champion Mala Gupta.

I also conducted a similar survey, but it was focused on features from Java 8 onwards. The results were not unexpected, as Java 8 is still widely used. Very unfortunate, though, as tons of new features and improvements are added to newer Java versions. But in terms of features, Java 8 was definitely a game-changer from a developer perspective.

So let’s discuss what the fuss is about Java Records.

#java #springboot #java programming #records #java tutorials #java programmer #java records #java 16