Java is a high-level object-oriented programming language. Use this tag when you're having problems using or understanding the language itself. This tag is frequently used alongside other tags for libraries and/or frameworks used by Java developers.
Java is a high-level, platform-independent, object-oriented, functional programming language and runtime environment.
The Java language derives much of its syntax from C and C++, but its object model is simpler than that of the latter and it has fewer low-level facilities. Java applications are typically compiled to bytecode (called class files) that can be executed by a JVM (Java Virtual Machine), independent of computer architecture. The JVM often further compiles code to native machine code to optimize performance.
The JVM manages memory with the help of a garbage collector (see also garbage-collection) to handle object removal from memory when objects are no longer in use. Java's typing discipline is static, strong, safe, nominative, and manifest. Java supports features such as reflection and interfacing with C and C++ via the JNI (Java Native Interface).
Java is designed to have as few implementation dependencies as possible, intended to allow application developers to write once, run anywhere, or sometimes write once, run everywhere (code that executes on one platform does not need to be recompiled to run on another). Java was originally developed by James Gosling at Sun Microsystems (which fully merged with Oracle Corporation on January 27th, 2010) and was released in 1995 as a core component of Sun Microsystems' Java platform. Java was started as a project called "Oak" by James Gosling in June 1991.
The Java platform is the name given by Sun (now Oracle) to computing systems that have installed tools for developing and running Java programs. The platform features a wide variety of tools that can help developers work efficiently with the Java programming language.
To get started, you download a Java Development Kit (JDK), which lets you both develop and run java applications.
Background
The main reference implementation of Java is open source (the OpenJDK) and is supported by major companies including Oracle, Apple, SAP, and IBM.
Java is compiled into bytecode, which is then compiled by the JVM into native machine code. The compilation is done just-in-time (JIT). This was initially viewed as a performance hit, but JVM and JIT compilation improvements have made this less of a concern. In some cases, the JVM may even be faster than native code compiled to target an older version of a processor for backward compatibility reasons. Since Java 9, it can be compiled ahead-of-time (AOT).
Very few computers can run Java programs directly. Before Java 9, users running Java programs were expected to have the JRE (Java Runtime Environment) installed on their system. Modern Java programs intended to run directly on client computers now ship with their own installers.
Versions
Notable Java versions, code names, and release dates include:
Version | Code Name | Release Date |
---|---|---|
Java SE 19 | JSR 394 | September 20, 2022 |
Java SE 18 | JSR 393 | March 22, 2022 |
Java SE 17 | JSR 392 | September 14, 2021 |
Java SE 16 | JSR 391 | March 16, 2021 |
Java SE 15 | JSR 390 | September 15, 2020 |
Java SE 14 | JSR 389 | March 17, 2020 |
Java SE 13 | JSR 388 | September 17, 2019 |
Java SE 12 | JSR 386 | March 19, 2019 |
Java SE 11 | JSR 384 | September 25, 2018 |
Java SE 10 | JSR 383 | March 20, 2018 |
Java SE 9 | JSR 376 | September 21, 2017 |
Java SE 8 (1.8) | JSR 337 | March 18, 2014 |
Java SE 7 (1.7) | Dolphin | July 28, 2011 |
Java SE 6 (1.6) | Mustang | December 11, 2006 |
J2SE 5.0 (1.5) | Tiger | September 29, 2004 |
J2SE 1.4 | Merlin | February 13, 2002 |
J2SE 1.3 | Kestrel | May 8, 2000 |
J2SE 1.2 | Playground | December 4, 1998 |
JDK 1.1 | February 19, 1997 | |
JDK 1.0 | January 23, 1996 | |
JDK Beta | 1995 |
Since Java SE 10
, new versions will be released every six months.
Latest Stable Versions:
Version | Release Date |
---|---|
Java Standard Edition 19 (19) | September 20, 2022 |
Java Standard Edition 18 (18.0.2.1) | August 18, 2022 |
Java Standard Edition 17 (17.0.4.1) | August 18, 2022 |
Java Standard Edition 16 (16.0.2) | July 20, 2021 |
Java Standard Edition 15 (15.0.2) | January 19, 2021 |
Java Standard Edition 14 (14.0.2) | July 14, 2020 |
Java Standard Edition 13 (13.0.2) | January 14, 2020 |
Java Standard Edition 12 (12.0.2) | July 16, 2019 |
Java Standard Edition 11 (11.0.16.1) | August 18, 2022 |
Java Standard Edition 10 (10.0.2) | July 17, 2018 |
Java Standard Edition 9 (9.0.4) | January 16, 2018 |
Java Standard Edition 8 Update 341 (1.8.0_341) | July 19, 2022 |
Java Standard Edition 7 Update 80 (1.7.0_80) | April 14, 2015 |
For more code names and release dates, visit Java SE Code Names. To see release notes for each version of the JDK, visit the Wikipedia article on Java version history.
To get a Java JDK so you can develop (or run) java code on your machine, you need a java installer package supplier. Java is open source, but a supplier will take care of building the java source code into a binary, wrapping this into an installer, and maintaining this version on your machine (e.g. with security updates).
Java comes in LTS (Long-Term-Support) and non-LTS versions. Each supplier chooses how to deal with LTS versions. Some (Oracle OpenJDK) have the same short support window for all releases, LTS or not. Some (Amazon Corretto) do not bother to release non-LTS versions at all. Most suppliers release all versions that will support LTS versions for far longer.
The LTS versions are Java 8, 11, and 17.
The major suppliers are:
- AdoptOpenJDK, also known as Adoptium - free, LTS versions and non-LTS versions, LTS versions are supported a long time. Recommended.
- Oracle OpenJDK - Note that these are only supported for 6 months, even the so-called LTS (Long Term Support) releases. You will need to update as java updates.
- Oracle JavaSE - licensed for those who want commercial support. LTS and non-LTS versions, LTS versions are supported for a long time. A free but license-wise very restricted test version is available.
- Amazon Coretto - free, maintained by Amazon, optimized for AWS, LTS versions only.
- Many more commercial offerings.
The End of Public Updates (Formerly called End Of Life and also referred to as EoPU) dates for the freely available distribution from Oracle are:
Version | EoPU Date |
---|---|
Java SE 16 | September 2021 for OpenJDK |
Java SE 15 | March 2021 for OpenJDK |
Java SE 14 | September 2020 for OpenJDK |
Java SE 13 | March 2020 for OpenJDK |
Java SE 12 | September 2019 for OpenJDK |
Java SE 11 | At least September 2022 for AdoptOpenJDK |
Java SE 10 | September 2018 |
Java SE 9 | March 2018 |
Java SE 8 | January 2019 (commercial use) |
Java SE 7 | Apr 2015 |
Java SE 6 | Feb 2013 |
J2SE 5.0 | Oct 2009 |
J2SE 1.4 | Oct 2008 |
Initial help
New to Java or need help to get your first Java program running? See the Oracle Java Tutorials section on Getting Started.
Before asking a question, please search to see if it has been asked before (we have many duplicates, some are listed below under Frequently Asked Questions), and read Writing the Perfect Question to learn how to get Jon Skeet to answer your question.
Naming conventions
Java programs should adhere to the following naming conventions to increase readability and decrease the chances of accidental errors. By following these naming conventions, you will make it easier for others to understand your code and help you.
- Type names (classes, interfaces, enums, etc.) should begin with a capital letter and capitalize the first letter of each subsequent word. Examples include:
String
,ThreadLocal
, andNullPointerException
. This is sometimes known as PascalCase. - Method and field names should be camelCased; that is, they should begin with a lowercase letter and capitalize the first letter of each subsequent word. Examples:
indexOf
,printStackTrace
,interrupt
. - Constant expression names (
static final
immutable objects) should be written in ALL_CAPS_SNAKE_CASE, with underscores separating each word. Examples:YELLOW
,DO_NOTHING_ON_CLOSE
. This also applies to the values of anEnum
class. However,static final
references to non-immutable objects should be camelCased.
Hello World - Your first program
Code of a typical Hello World program:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Compilation and invocation of Hello World program:
javac -d . HelloWorld.java
java -cp . HelloWorld
Java source code is compiled to an intermediate form (bytecode instructions for the Java Virtual Machine) which can be executed with the java
command later on.
More information:
Useful IDEs for Java
- Eclipse IDE (eclipse)
- Run Java code online
- NetBeans IDE (netbeans)
- IntelliJ IDEA (intellij-idea)
- Spring Tool Suite (spring-tool-suite based on Eclipse, includes tools for working with Spring)
- JDeveloper IDE (jdeveloper)
- Android Studio (android-studio based on IntelliJ IDEA, mainly intended for working on Andriod projects)
- BlueJ (bluej)
- ideone - An online IDE with other popular language support.
- Sublime Text (sublimetext)
Beginners' resources
- The Java Tutorials - Starts from scratch on Windows/Linux/Mac and covers most of the standard library. The Java Keyword Reference listing by Oracle complements the Java Tutorials very well.
- Generics
- Codecademy (Java) - Learn the very basics of programming.
- Coding Bat (Java) - After learning some basics, refine and hone your Java skills with Coding Bat.
- Code Conventions for the Java Programming Language
- Stanford Video Lectures on Java
- Udemy free course on Java
- Edx course on Introduction to computing with Java
- Coursera courses on Java
- Java Programming - A free online course on learning Java
Online Compilers
Day-to-day updated resources
- Java SE Documentation
- Java 7 API reference
- Java 8 API reference
- Java 9 API reference
- Java 10 API reference
- Java 11 API reference
- Java 12 API reference
- Java 13 API reference
- Java 14 API reference
- Java 15 API reference
- Java 16 API reference
- Java 17 API reference
Advanced resources
- Java Language and Virtual Machine Specifications
- Other languages that can be mixed with Java on JVM
- A Guide to Java 8
- The Definitive Java Generics Advanced FAQ by Angelika Langer
Java frameworks, libraries, and software
Java programming books and resources
- Java Application Development on Linux by Carl Albing and Michael Schwarz (PDF)
- How to Think Like a Computer Scientist
- Spring IO Guides
- Head First Java
- The Java EE 7 Tutorial (PDF)
- Java Thin-Client Programming (and other IBM redbooks)
- Oracle's Java Tutorials
- Thinking in Java
- Effective Java (PDF)
- Effective Java 3rd edition
- OSGi in Practice (PDF)
- Category wise tutorials - J2EE
- Java Example Codes and Tutorials - J2EE
- Java Design Pattern Video Training
- Code Search for Java examples
- Global Java cross-reference engine
- Java 101 Tutorials
- Java EE 8 Tutorial Project
Frequently Asked Questions
People often ask about the following Java topics:
General:
Classpath:
String
, StringBuilder
and toString
:
- How do I compare strings in Java?
- Difference between StringBuilder and StringBuffer
- Why do I get
SomeType@2f92e0f4
when I print my object? - Immutability of Strings in Java
equals
and hashCode
:
Java Platform SE API:
- Skipping
nextLine()
after usenextInt()
- Comparing dates
- Converting between java.util.Date and java.time.LocalDate
- Removing items while iterating through a Collection, avoiding ConcurrentModificationException
- How to sort a
Map<Key, Value>
on the values in Java? - When to use
LinkedList
overArrayList
? Arrays.asList()
- Differences between
HashMap
andHashtable
? - Difference between Set and List?
Generics:
- What does the
<E>
in Java mean? - Is
List<Dog>
a subclass ofList<Animal>
? Why aren't Java's generics implicitly polymorphic (and why aren't collections covariant)? - Java Generics: What is PECS?
- What is a raw type and why shouldn't we use it?
- How to create a generic array?
- How to instantiate generic type variable
Classes and objects:
- Is Java pass by reference?
- What's the advantage of a Java enum versus a class with public static final fields?
- Difference between public, protected, private and default
Arithmetic and conversions:
- Why can't I print a double correctly?
- Division of integers returns 0
- Java's +=, -=, *=, /= compound assignment operators
Debugging:
- What is a stack trace, and how can I use it to debug my application errors?
- What is a
NullPointerException
and how do I fix it? - What is an
ArrayIndexOutOfBoundsException
and how do I prevent it? - How do I avoid null checks?
- Why am I getting a
NoClassDefFoundError
? - Why am I getting a
NoSuchMethodError
?
Thread
and multithreading:
- What does
java.lang.Thread.interrupt()
do? - While loop doesn't see a changed value unless there's a print statement in it
implements Runnable
vs.extends Thread
Interacting with the operating system:
(Editors, please only list questions which actually are frequently asked.)