Loops in Java: Basics, Usage, and Examples

Loops in Java: Basics, Usage, and Examples
Hostman Team
Technical writer
Java
26.02.2024
Reading time: 15 min

In this article, we will describe using statements with conditions and touch upon the types of loops in Java:

  • While

  • For

  • For Each

  • Do-While

The guide will be useful for beginner programmers who want to learn how the syntax is organized.

What loops are for

Let's start with an analogy. Our life consists entirely of a sequence of actions. They change depending on external and internal conditions. For example, the action "I will go to the gym today" contains conditions. 

One person will not go to the gym if they have a sore throat, while the other will not skip a workout because of a slight cold or bad mood. 

The same is true for apps. The code contains conditions. They customize the operation of the software, depending on the developer's idea. 

Loop iteration in Java is a single execution of the loop body until the loop exit conditions are met. Such algorithms create the functionality of the program. They describe a pattern of repeated actions and contain information about the number of repetitions.

Let's look at a simple problem: writing the numbers from 1 to 150 by regular enumeration:

public class Main {
   public static void main(String[] args) {
       System.out.println(1);
       System.out.println(2);
…(repetitions)
       System.out.println(150);
   }
}

We got the required result, the range of numbers. However, this approach is inconvenient as we have to manually describe each repeated action, although each repetition is connected to the previous one (except for the first one).

Describing an algorithm where we put two lines and get a similar result is easier. Let's complicate the task: numbers should be printed through a space:

public class Main {
    public static void main(String[] args) {
        for (int i = 1; i <= 150; i++) {
            System.out.print(i + " ");
        }
    }
}

We printed out the numbers and separated them with spaces. Initially, we would describe each print statement. Tip: you can remove the curly braces of the loop body if the loop contains a single line. 

How to create a Java loop:

  1. Create (initialize) a variable. Define i and assign it to 1, since we start counting from it.

  2. Add an exit condition. We have indicated under what conditions the number is output after the code is run. The <= symbol means "less than or equal to". According to the condition, we need to add all digits in the range, including 150. We can apply "less than" + 1, i.e. 151. 

  3. Increment condition. What happens when the number is less than or equal to 15. We will increment the number by 1 at each iteration of the loop. The algorithm is repeated as long as the value of the condition check is equal to the Boolean expression "True". When "False" appears at the next iteration, the loop body is not executed, the loop ends, and code execution moves on to the next part of the program.

This is how For loops work in Java. Let's analyze the peculiarities of different types of loops in Java.

Loop

Purpose

While

Repeating the fragment an indefinite number of times, including 0.

For

Repetition of the code in a given number of iterations, including 0

For Each

Array elements enumeration

Do While

Repeating a fragment with checking after iteration at least once

While

The while loop in Java is an operator with an unknown number of iterations. It executes a given pattern until the condition of the expression is false. 

Another life analogy: studying at a university continues until a student goes through the whole course of study and passes all the intermediate and final exams. The algorithm of actions includes: attending lectures, preparing for the control stages of knowledge testing.

while (Conditions) {
  // Algorithm body
}

The condition inside the while statement takes a Boolean value. It is only true or false. The algorithm is triggered as long as the expression takes True. 

In all other cases, the code fragment inside the loop body is not executed.

Let's apply while and see how the loop body stops executing after five iterations. 

Example of a Java while loop with a parameter:

public class Main {
    public static void main(String[] args) {
        int count = 0;
        while (count < 5) {
            System.out.println("Number: " + count);
            count++;
        }
        System.out.println("Completed. The check ignores the fragment and sequentially executes the rest of the program");
    }
}

Java follows all the principles of object-oriented methodology and is based strictly on them. To successfully run the code, we declare the Main class and the method of the same name after public static void main(String[] args). Before while, we initialize the variable necessary for the loop condition.

As long as the number is less than 5, the string and the current value of the count variable are printed. Then count is incremented by 1 (incremented). Result:

Number: 0
Number: 1
Number: 2
Number: 3
Number: 4
Completed. The check ignores the fragment and sequentially executes the rest of the program

For

While is best used when the number of iterations is initially unknown. The situation is different with the for loop in Java: it is used when the number of occurrences is known initially, for multiple repetitions of a code fragment. 

With for, you can create a variable and specify conditions at once. It is usually needed when there is no user input. But let's consider one interesting problem:

import java.math.BigInteger;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter a number to calculate its factorial: ");
        int num = scanner.nextInt();
        BigInteger factorial = BigInteger.ONE;
        for (int i = 1; i <= num; i++) {
            factorial = factorial.multiply(BigInteger.valueOf(i));
        }
        System.out.println("factorial " + num + " equals to " + factorial);
    }
}

We find out the number of repetitions even before the loop. The number depends on a fixed user-defined number of multiplications from 0 to n (where n is any input using the formula 1*2*3..*n) via a math function. 

BigInteger.valueOf(i) creates a new BigInteger object that represents i. factorial.multiply(BigInteger.valueOf(i)) multiplies the current value of factorial (which is also a BigInteger object) by the BigInteger object. Assigning factorial = ... sets the value of factorial to a new BigInteger object representing the product.

At each iteration of the loop, the current value of factorial is multiplied by i, and the result is stored back into factorial. By the end of the loop, we output the factorial of the number.

Let's show the difference from While:

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int numberToGuess = 498;
        int guess = 0;
        while (guess != numberToGuess) {
            System.out.print("Guess the number (from 1 to 1000): ");
            guess = scanner.nextInt();
            if (guess < numberToGuess) {
                System.out.println("Lesser");
            } else if (guess > numberToGuess) {
                System.out.println("Greater");
            }
        }
        System.out.println("You have won, this is the right answer: " + numberToGuess + "!");
    }
}

Here, we apply while because the repetitions depend entirely on how many times the user enters the value. But we must stop when he types 498. Only then we can exit the loop. 

For Each

The for each loop in Java is a variant of the for loop adapted for convenient iteration over iterated objects (arrays and collections). It appeared in Java 5.0 in 2004 and simplifies code writing. 

How the for loop works in Java:

public class Main {
    public static void main(String[] args) {
        int[] numbers = {145, 342, 2343, 423, 23, 96, 11, 20, 590, 1457};
        // Output only even numbers
        for (int number : numbers) {
            if (number % 3 == 0) {
                System.out.print(number + " ");
            }
        }
    }
}

Result:

342 2343 423 96 

Apply the for each loop to selectively output only certain elements from the array based on certain conditions. 

We output numbers divisible by three. Here you can see how to use a for each loop in Java to perform operations on collections. It can be used to loop through the elements of an array.

Do-While

The main difference between while and do-while loops in Java is that do-while executes the first iteration before the loop condition is checked. While may not execute a part of the program at all if the result of the check takes a false value. 

Writing a loop in Java with do-while looks like this:

do {
    // Code fragment
} while (condition);

The condition is checked at the end of the iteration.

Here is an example illustrating the difference between do-while and while:

public class Main {
    public static void main(String[] args) {
        // do-while example
        int count1 = 0;
        do {
            System.out.println(count1);
            count1++;
        } while (count1 < 5);
        // while example
        int count2 = 0;
        while (count2 < 5) {
            System.out.println(count2);
            count2++;
        }
    }
}

We have applied do-while. The algorithm will always execute the first occurrence and then check the condition (but only at the end of the iteration). 

The code inside the do statement is executed at least once. Even if we started with the number 5. The loop will end when the user executes our query. Do-while literally means "Perform this action and later check if the given rule is applied".

In the second part of the example, nothing will happen if we assign count2 to 5. The code inside the while statement is executed strictly when the condition we have written into the algorithm is met. 

In general, do-while is needed when executing a fragment at least once. While is needed when it is better to apply a code block only when the boolean expression is "True".

Deploy and manage your apps with ease

Break, Continue and Return statements

Special constructs can be used to interfere with the operation of a loop. For example, you can interrupt them, return a value to a function, or exclude an undesired result.

Operator

Used for

What it does

Break

Interrupting loop execution

Exits the code fragment. Continues from the statement that follows it

Continue

Skipping the specified iteration in the loop

Ignores the entry and starts the next one

Return

Returning a function value

Exits the entire function and returns the specified data within the statement, if specified by the developer

Break

This is the skip statement that ends the loop or switch. It terminates the iteration prematurely if the break conditions are met. The result of calculations from the previous occurrence is stored in memory.

Example in Java with a loop:

public class Main {
    public static void main(String[] args) {
        for (int i = 1; i <= 10; i++) {
            if (i == 5) {
                break;
            }
            System.out.println(i);
        }
    }
}

The code snippet uses a loop from 1 to 10. At each iteration, we check if the number is equal to 5.

If so, then the loop ends with a break statement, eliminating the remaining 5 iterations. Therefore, only numbers from 1 to 4 are output.

The final value is 4, the last result is ignored by the compiler. The principle works in all types of loops in Java. In practice, Break is used when you need to exclude a possible result or occurrence. It is also suitable for improving productivity.

Continue

This operator does not interrupt the loop, but selectively eliminates possible iterations. When the statement runs, the iteration ends, and the program begins rechecking the condition. The result of previous calculations is stored in memory.

Here is the implementation of the project using continue:

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Map<String, Double> assortment = new HashMap<>();
        assortment.put("Apples", 9.5);
        assortment.put("Bananas", 15.5);
        assortment.put("Oranges", 18.0);
        assortment.put("Grapes", 40.0);
        assortment.put("Pineapples", 89.0);
        System.out.println("Welcome to our shop! Here’s our products:");
        System.out.println(assortment);
        double totalAmount = 0.0;
        boolean moreItems = true;
        while (moreItems) {
            System.out.println("Enter the product name to buy (or 'exit'):");
            String itemName = input.nextLine();
            if (itemName.equals("exit")) {
                moreItems = false;
                continue;
            }
            if (!assortment.containsKey(itemName)) {
                System.out.println("Sorry, we do not have this product.");
                continue;
            }
            System.out.println("Enter the number of items, " + itemName + " you want to buy:");
            int quantity = input.nextInt();
            input.nextLine(); // clean the buffer
            double itemPrice = assortment.get(itemName);
            double itemTotal = itemPrice * quantity;
            System.out.println("You added " + quantity + " " + itemName + " to basket. Price: " + itemTotal);
            totalAmount += itemTotal;
        }
        System.out.println("Thanks for shopping with us! Your total: " + totalAmount);
    }
}

This is a simplified Java program with a loop that is an online store. You can select a product from a certain range and calculate the total cost of the order.

At the beginning of the program, a HashMap is created to store the items available in the store and their corresponding prices. The program then displays the assortment for the user.

The program then goes into a loop. The user is prompted to enter the name of the product he wants to buy. If the user enters exit, the algorithm ends, and the program ends.

When entering the name of a product that is not in stock, we notify the user that the product is not available and continue processing.

If the customer enters the name of an available product, the program prompts you to enter the number of items he wants to buy. The app then calculates the cost of the order and adds the price.

At the end, the program calculates the cost of the order and exits. The application demonstrates continue for implementing a simplified commercial project.

Return

Return is used to terminate the method and print the result of the calculation. It is also used in loops to exit and return a value.

The return statement is written to exit a function and return a value to the caller. This is useful when you want to perform calculations or iterations until a certain condition occurs and return a result based on it.

Implementation of return:

public class Main {
    public static void main(String[] args) {
        int[] arr = {17, 34, 45, 1, 8};
        int num = 45;
        int index = findIndex(arr, num);
        System.out.println("Found " + num + " in set: " + index);
    }
    public static int findIndex(int[] arr, int num) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == num) {
                return i; // Returning the result of calculations and exiting the loop
            }
        }
        return -1; // Returning -1, if no required number
    }
}

When iterating, the algorithm will stop and immediately return the index if it finds the right number. No additional code will be executed after return.

Infinite loops

An infinite loop continues to execute indefinitely, its exit condition does not evaluate to False in at least one case, or its exit condition is undefined. The algorithm will run forever or until interrupted by an external event.

Here's an example:

while (true) {
 // any code except break and return
}

Here the result of the condition value is always True, so the loop runs without stopping. To stop the loop, you must change the condition to False.

In most cases, an infinite loop in Java is a logical mistake on the part of the developer. If done incorrectly, it can cause the program to become unresponsive and crash.

However, sometimes an infinite loop is necessary. For example, in server processes, operating systems, or real-time applications. In these cases, it is usually combined with optimization. This is necessary to ensure that the program remains operational and does not consume a lot of system resources.

Nested Loops

They mean using one or more loops inside another. They are typically used to work with two-dimensional arrays.

Let's draw a pattern in the shape of the letter X. You need to use a two-loop fragment in Java to include possible combinations of dashes and asterisks.

Implementation

public class Main {
    public static void main(String[] args) {
        int size = 7;
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                if (i == j || i == size - j - 1) {
                    System.out.print("*");
                } else {
                    System.out.print("-");
                }
            }
            System.out.println();
        }
    }
}

Create a square pattern with alternating rows of stars and dashes, with the stars forming an "X" shape through the middle of the square. The square size is set to 7 which is the number of rows.

Result:

*-----*
-*---*-
--*-*--
---*---
--*-*--
-*---*-
*-----*

"X" will always be printed, regardless of the number of lines, thanks to the nested loop check. The if statement checks whether the current position of the loop is on the main diagonal (where i == j) or on the opposite diagonal (where i == size - j - 1). When one of the conditions is true, a star is printed at the position. If false, dash.

Conclusion

In this guide, we have described Java loops, what they are and how to use them. With loops, developers can simplify their code and create efficient applications.

Java
26.02.2024
Reading time: 15 min

Similar

Java

Java Date Format

Handling dates and times effectively is a critical aspect of many software applications. In Java, the SimpleDateFormat class from the java.text package offers developers a robust mechanism for formatting Date objects into strings and parsing strings back into Date objects. This guide explores the features, use cases, and best practices for leveraging SimpleDateFormat in your Java projects. Overview of SimpleDateFormat A method for creating unique patterns for date and time data representation is offered by SimpleDateFormat. These patterns are versatile, allowing developers to adapt date formats to their specific application requirements. Here’s an introductory example: import java.text.SimpleDateFormat; import java.util.Date; public class SimpleDateFormatDemo { public static void main(String[] args) { SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); Date currentDate = new Date(); System.out.println("Formatted Date: " + formatter.format(currentDate)); } } This sample produces a string that is formatted in accordance with the given pattern and contains the current date and time: Formatted Date: 07/01/2025 14:35:00 Pattern Syntax for Formatting Dates The SimpleDateFormat class employs a symbolic pattern language to precise how dates and times should appear. Below is a table summarizing some key symbols: Symbol Description Example y Year 2025 (yyyy), 25 (yy) M Month 01 (MM), Jan (MMM) d Day of the month 07 (dd) H Hour (0-23) 14 (HH) h Hour (1-12) 02 (hh) m Minute 35 (mm) s Second 00 (ss) a AM/PM marker PM E Day of the week Tue (EEE), Tuesday (EEEE) z Time zone PST (z), Pacific Standard Time (zzzz) d Day of the month 07 (dd) H Hour (0-23) 14 (HH) h Hour (1-12) 02 (hh) m Minute 35 (mm) s Second 00 (ss) a AM/PM marker PM E Day of the week Tue (EEE), Tuesday (EEEE) z Time zone PST (z), Pacific Standard Time (zzzz) Combining these symbols allows developers to create highly tailored date and time formats. Customizing Date Formats Using SimpleDateFormat, you can craft custom formats to suit various requirements. Here’s an example demonstrating three distinct patterns: import java.text.SimpleDateFormat; import java.util.Date; public class DateFormatExamples { public static void main(String[] args) { Date currentDate = new Date(); SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat verboseFormat = new SimpleDateFormat("EEEE, MMMM dd, yyyy"); SimpleDateFormat timeFormat = new SimpleDateFormat("hh:mm a z"); System.out.println("ISO Format: " + isoFormat.format(currentDate)); System.out.println("Verbose Format: " + verboseFormat.format(currentDate)); System.out.println("Time Format: " + timeFormat.format(currentDate)); } } Sample Output: ISO Format: 2025-01-07 Verbose Format: Tuesday, January 07, 2025 Time Format: 02:35 PM PST Parsing Strings to Date Objects SimpleDateFormat also facilitates converting string representations of dates back into Date objects. This is especially useful for handling user input or reading data from external sources. import java.text.SimpleDateFormat; import java.util.Date; public class DateParsingDemo { public static void main(String[] args) { String inputDate = "07-01-2025 14:35:00"; SimpleDateFormat parser = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); try { Date parsedDate = parser.parse(inputDate); System.out.println("Parsed Date: " + parsedDate); } catch (Exception e) { System.out.println("Parsing failed: " + e.getMessage()); } } } Expected Output: Parsed Date: Tue Jan 07 14:35:00 PST 2025 Incorporating Time Zones The setTimeZone method in SimpleDateFormat allows for explicit handling of different time zones. Here’s an example: import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; public class TimeZoneHandling { public static void main(String[] args) { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"); formatter.setTimeZone(TimeZone.getTimeZone("UTC")); System.out.println("UTC Time: " + formatter.format(new Date())); formatter.setTimeZone(TimeZone.getTimeZone("America/New_York")); System.out.println("New York Time: " + formatter.format(new Date())); } } Output Example: UTC Time: 2025-01-07 22:35:00 UTC New York Time: 2025-01-07 17:35:00 EST Locale-Aware Formatting The SimpleDateFormat class supports locale-specific date formatting. By specifying a Locale, you can adapt your application for different regions and languages: import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; public class LocaleFormatting { public static void main(String[] args) { Date today = new Date(); SimpleDateFormat usFormatter = new SimpleDateFormat("EEEE, MMMM dd, yyyy", Locale.US); SimpleDateFormat frFormatter = new SimpleDateFormat("EEEE, MMMM dd, yyyy", Locale.FRANCE); System.out.println("US Format: " + usFormatter.format(today)); System.out.println("French Format: " + frFormatter.format(today)); } } Output Example: US Format: Tuesday, January 07, 2025French Format: mardi, janvier 07, 2025 Working with Legacy Code For projects that rely on legacy systems, SimpleDateFormat can be instrumental in ensuring compatibility with older data formats. By crafting patterns that match the specific requirements of legacy systems, developers can seamlessly bridge modern and older systems. However, it is critical to perform rigorous testing when working with legacy code. Edge cases like leap years, daylight saving time adjustments, or unusual formats often surface in older implementations. Developers should document the specific formats being used and verify the results using multiple test cases. In certain situations, refactoring legacy systems to use modern libraries like DateTimeFormatter may offer long-term benefits. While it might require upfront effort, the enhanced performance and reduced bug risk in newer libraries often justify the transition. Date Validation Techniques Validating dates is a common requirement in applications that accept user input. With SimpleDateFormat, you can ensure that input strings conform to the expected format before further processing. For example: import java.text.SimpleDateFormat; import java.util.Date; public class DateValidation { public static void main(String[] args) { String dateString = "31-02-2025"; SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy"); formatter.setLenient(false); try { Date validatedDate = formatter.parse(dateString); System.out.println("Valid Date: " + validatedDate); } catch (Exception e) { System.out.println("Invalid Date: " + e.getMessage()); } } } Output Example: Invalid Date: Unparseable date: "31-02-2025" Using the setLenient(false) method ensures that only logically valid dates are accepted, reducing the risk of errors in downstream processes. Common Pitfalls and Recommendations Thread Safety: Avoid sharing SimpleDateFormat instances across multiple threads. Use ThreadLocal or Java’s DateTimeFormatter for thread-safe alternatives. Error Handling: Always handle potential ParseException errors when parsing strings. ISO Standards: Utilize ISO 8601 formats (e.g., yyyy-MM-dd'T'HH:mm:ss'Z') for better interoperability. Dynamic Time Zones: Refrain from hardcoding time zones; instead, fetch them dynamically when necessary. Input Validation: Before parsing, make sure the input strings have the correct format. Transitioning to Modern Alternatives With the introduction of the java.time package in Java 8, many developers prefer DateTimeFormatter over SimpleDateFormat for its enhanced features and thread safety. import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class ModernDateFormatting { public static void main(String[] args) { LocalDateTime currentDateTime = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); System.out.println("Formatted Date-Time: " + currentDateTime.format(formatter)); } } Sample Output: Formatted Date-Time: 2025-01-07 14:35:00 Additionally, DateTimeFormatter supports advanced features such as optional sections, localized styles, and predefined constants for ISO-compliant formats. These features make it a more versatile and robust choice for modern applications. Final Thoughts SimpleDateFormat remains a practical choice for date and time handling in Java. However, it is essential to understand its limitations, especially in terms of thread safety and modern compatibility. By adopting best practices and considering newer options like DateTimeFormatter, you can ensure robust and efficient date manipulation in your Java applications. Whether you are working with legacy systems, processing user inputs, or developing new features, a thorough knowledge of Java's date formatting features will empower you to handle date and time operations with confidence and precision. In addition, check out our app platform to find cloud apps, such as React, Angular, Vue and more.
15 January 2025 · 8 min to read
Java

Java main() Method

The main method in Java is a fundamental component for any standalone application. It serves as the entry point where the program begins execution. Understanding the syntax and functionality of this method is crucial for every Java programmer. This article delves into the specifics of the main method, explaining its syntax, the role of command-line arguments, and providing practical examples to illustrate its use. Syntax Explanation: public static void main(String[] args) The Java main method is defined as: public static void main(String[] args) Breaking down the syntax: public: This is an access modifier, meaning the method is accessible from anywhere. static: This keyword means the method belongs to the class rather than an instance of the class. It can be invoked without creating an object of the class. void: This signifies that the method does not return any value. main: This is the name of the method. The Java runtime environment looks for this specific method signature to start execution. String[] args: This parameter is an array of String objects, which stores command-line arguments passed to the program. Understanding the String[] args Parameter The String[] args parameter in the main method is crucial for passing information to the program at runtime. Each element in this array is a command-line argument provided when the program is executed. For example, if a program is run with java MyClass arg1 arg2, args[0] would be arg1 and args[1] would be arg2. public class MyClass { public static void main(String[] args) { for (String arg : args) { System.out.println(arg); } } In the above code, each command-line argument passed to the program is printed to the console. How to Use Command-Line Arguments Command-line arguments allow users to pass data into a Java program at the time of execution, making the program more flexible and dynamic. Here's a simple example of how to use command-line arguments in a Java program: public class SumArgs { public static void main(String[] args) { int sum = 0; for (String arg : args) { sum += Integer.parseInt(arg); } System.out.println("Sum: " + sum); } } If this program is run with java SumArgs 10 20 30, it will output Sum: 60. This demonstrates how command-line arguments can be used to input data without modifying the program's source code. Typical Use Cases and Examples Configuration Parameters: Command-line arguments are often used to pass configuration settings to a program. For example, specifying the path to a configuration file or setting a debug mode. public class ConfigLoader { public static void main(String[] args) { if (args.length > 0) { String configFilePath = args[0]; System.out.println("Loading configuration from: " + configFilePath); // Load and process the configuration file } else { System.out.println("No configuration file path provided."); } } } File Processing: Programs that perform operations on files often accept file paths as command-line arguments. public class FilePrinter { public static void main(String[] args) { if (args.length > 0) { String filePath = args[0]; // Code to read and print file content } else { System.out.println("Please provide a file path."); } } } Testing and Debugging: Command-line arguments can be used to quickly test and debug different scenarios by changing the input parameters without altering the source code. Conclusion The public static void main(String[] args) method is an essential part of any Java application. Its syntax and functionality are designed to provide a standardized entry point for program execution. Understanding how to leverage String[] args for command-line arguments can significantly enhance the flexibility and utility of your programs. By mastering the main method, Java developers can build more dynamic and configurable applications, making their code more versatile and easier to manage.
31 July 2024 · 4 min to read
Java

Installing Java Using apt on Ubuntu

Java and the JVM (Java Virtual Machine) are often used in various applications. Therefore, it's important to know how to install free packages and alternative releases from Oracle, including JRE (Java Runtime Environment) and JDK (Java Development Kit).  This tutorial will guide you through installing Java on Ubuntu using apt and selecting the preferred version. Prerequisites You will need a system (your local machine or a cloud server) with Ubuntu 20.04 pre-installed, with root and sudo accounts, and a configured firewall. Installing JRE/JDK The simplest way to get started is to use the release included in the standard Ubuntu package. Ubuntu 22.04 comes with OpenJDK 11, which includes open-source JRE and JDK packages. First, download updates to the package index: sudo apt update Before installing Java on Ubuntu, check if it has already been installed: java -version If Java is not installed, you will see: Command 'java' not found, but can be installed with:apt install openjdk-11-jre-headless  # version 11.0.20.1+1-0ubuntu1~22.04, orapt install default-jre              # version 2:1.11-72build2apt install openjdk-17-jre-headless  # version 17.0.8.1+1~us1-0ubuntu1~22.04apt install openjdk-18-jre-headless  # version 18.0.2+9-2~22.04apt install openjdk-19-jre-headless  # version 19.0.2+7-0ubuntu3~22.04apt install openjdk-8-jre-headless   # version 8u382-ga-1~22.04.1 Now, install the OpenJDK package: sudo apt install default-jre After installation, verify the JRE presence: java -version You should see: openjdk version "11.0.23" 2024-04-16OpenJDK Runtime Environment (build 11.0.23+9-post-Ubuntu-1ubuntu122.04.1)OpenJDK 64-Bit Server VM (build 11.0.23+9-post-Ubuntu-1ubuntu122.04.1, mixed mode, sharing) To compile and run even specific applications, you will also need the JDK package: sudo apt install default-jdk Verify the compiler version: javac -version You should see: javac 11.0.23 Installing Oracle JDK In some cases, you may need the Oracle JDK package. This installation of Java on Ubuntu will differ from the methods described above, as it requires manual installation. You cannot install it from Ubuntu repositories using apt-get install, but the process is still relatively easy. The latest version is Java 22. However, Java 21 has the longest support. We will install Java 21 in Ubuntu using wget and a download link copied from the Downloads section on the Oracle website. Run: wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.deb Now install: sudo apt install ./jdk-21_linux-x64_bin.deb Check the Java version: java -version You should see: java version "21.0.3" 2024-04-16 LTSJava(TM) SE Runtime Environment (build 21.0.3+7-LTS-152)Java HotSpot(TM) 64-Bit Server VM (build 21.0.3+7-LTS-152, mixed mode, sharing) Managing Java Versions You can install multiple versions of Java on a single machine. To see the default version, use: sudo update-alternatives --config java If you've installed the previously mentioned versions, you will see: Enter the desired version number or press Enter to keep the current settings (indicated by an asterisk). This also applies to other modules like the compiler javac, keytool, javadoc, jarsigner, etc.: sudo update-alternatives --config javac Setting the JAVA_HOME Variable Most Java applications use the JAVA_HOME environment variable to determine the installation directory.  In the previous chapter, we run this command: sudo update-alternatives --config java Check the paths in its output. In our case, the directories are: OpenJDK 11: /usr/lib/jvm/java-11-openjdk-amd64/bin/java OpenJDK 8: /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java Oracle Java 21: /usr/lib/jvm/java-8-oracle/jre/bin/java Copy the desired path and edit the /etc/environment file with nano: sudo nano /etc/environment Add a new line with the copied path: JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64/bin/" This sets the JAVA_HOME variable for all user accounts. Save and exit the file, then reload the environment variables: source /etc/environment Check if the changes were applied: echo $JAVA_HOME You should see: /usr/lib/jvm/java-11-openjdk-amd64/bin/ This change applies to the current user, while others need to restart the system. Conclusion We have covered the installation of Java in Ubuntu, including standard JRE/JDK versions and official Oracle releases. After installing the platform, you can use Java applications and dependencies without restrictions.
09 July 2024 · 4 min to read

Do you have questions,
comments, or concerns?

Our professionals are available to assist you at any moment,
whether you need help or are just unsure of where to start.
Email us
Hostman's Support