1. Libraries

The Java standard library is large. Prefer standard library APIs first, and add third-party dependencies only when the standard library does not cover the problem well.

1.1. Math

1for (int i = 0; i < 5; i++) {
2  var num = Math.random();
3  var s = String.format("%.5f", num);
4  System.out.println(s);
5}

1.2. StringBuilder

 1var entity = "One-Off Coder";
 2var address = "7526 Old Linton Hall Road";
 3var city = "Gainesville";
 4var state = "VA";
 5var zip = 20155;
 6var www = "https://www.oneoffcoder.com";
 7var email = "info@oneoffcoder.com";
 8
 9var label = new StringBuilder()
10    .append(entity).append('\n')
11    .append(address).append('\n')
12    .append(city).append(' ')
13    .append(state).append(' ')
14    .append(zip).append('\n')
15    .append(www).append('\n')
16    .append(email)
17    .toString();
18
19System.out.println(label);

1.3. HTTP

Use java.net.http.HttpClient for new HTTP code. JDK 26 adds HTTP/3 support to this API, but ordinary beginner code still uses the same HttpClient, HttpRequest, and HttpResponse types.

1import java.net.URI;
2import java.net.http.HttpClient;
3import java.net.http.HttpRequest;
4import java.net.http.HttpResponse;
 1String uri = "http://www.oneoffcoder.com";
 2
 3HttpClient client = HttpClient.newHttpClient();
 4HttpRequest request = HttpRequest.newBuilder()
 5    .uri(URI.create(uri))
 6    .build();
 7
 8HttpResponse<String> response =
 9    client.send(request, HttpResponse.BodyHandlers.ofString());
10
11String body = response.body();
12
13System.out.println(body.length());

1.4. CSV

1.4.1. Writing data to a CSV

1import com.opencsv.CSVWriterBuilder;
2import com.opencsv.ICSVParser;
3import com.opencsv.ICSVWriter;
4import java.io.FileWriter;
 1var writer = new CSVWriterBuilder(new FileWriter("demo.csv"))
 2    .withSeparator(ICSVParser.DEFAULT_SEPARATOR)
 3    .withQuoteChar(ICSVParser.DEFAULT_QUOTE_CHARACTER)
 4    .withEscapeChar(ICSVParser.DEFAULT_ESCAPE_CHARACTER)
 5    .withLineEnd(ICSVWriter.DEFAULT_LINE_END)
 6    .build();
 7
 8var entries = new String[][] {
 9    { "first_name", "last_name" },
10    { "John", "Doe" },
11    { "Jane", "Smith" }
12};
13
14for (String[] row : entries) {
15  writer.writeNext(row);
16}
17
18writer.close();

1.4.2. Reading data from a CSV

1import com.opencsv.CSVParserBuilder;
2import com.opencsv.CSVReaderBuilder;
3import com.opencsv.ICSVParser;
4import java.io.FileReader;
 1final var parser = new CSVParserBuilder()
 2    .withSeparator(ICSVParser.DEFAULT_SEPARATOR)
 3    .withQuoteChar(ICSVParser.DEFAULT_QUOTE_CHARACTER)
 4    .withEscapeChar(ICSVParser.DEFAULT_ESCAPE_CHARACTER)
 5    .build();
 6
 7final var reader = new CSVReaderBuilder(new FileReader("demo.csv"))
 8    .withSkipLines(1)
 9    .withCSVParser(parser)
10    .build();
11
12String[] line;
13while ((line = reader.readNext()) != null) {
14  for (int i = 0; i < line.length; i++) {
15    System.out.print(line[i]);
16    if (i < line.length - 1) {
17      System.out.print(", ");
18    } else if (i == line.length - 1) {
19      System.out.println();
20    }
21  }
22}
23
24reader.close();

1.5. Static imports

1import static java.lang.Math.pow;
2import static java.lang.Math.sqrt;
1var num = 100.0d;
2var s = sqrt(num);
3var p = pow(num, 2.0d);

1.6. String tokenization

1import java.util.StringTokenizer;
 1String s = "firstName=John; lastName=John; age=18";
 2
 3StringTokenizer tokenizer = new StringTokenizer(s, "=;");
 4
 5while (tokenizer.hasMoreTokens()) {
 6  String key = tokenizer.nextToken().strip();
 7  String val = tokenizer.nextToken().strip();
 8
 9  System.out.println(key + " is " + val);
10}

1.7. Optional

Optional is most useful as a return type when a method may not have a result. Avoid using it as a field type or method parameter in beginner code; plain values and validation are usually clearer there.

1.7.1. Basic use of optional

1import java.util.Optional;
1var x = Optional.of("John");
2// check if empty
3System.out.println(x.isEmpty()); // false
4
5// get value
6System.out.println(x.get()); // John

1.7.2. Nullable optional

1import java.util.Optional;
1var x = Optional.ofNullable(null);
2// check if empty and presentOptionalExample
3System.out.println(x.isEmpty()); // true
4System.out.println(x.isPresent()); // false
5
6System.out.println(x.orElse("No name!"));

1.8. Date

Date and Calendar are legacy APIs. They appear in older code, but new code should usually use the java.time package covered in the next chapter.

1.8.1. Basic date

1import java.util.Date;
1Date date = new Date();
2
3System.out.println(date.getTime());

1.8.2. Basic calendar

1import java.text.SimpleDateFormat;
2import java.util.Calendar;
3import static java.lang.String.valueOf;
4import static java.lang.String.format;
 1Calendar calendar = Calendar.getInstance();
 2
 3var month = calendar.get(Calendar.MONTH) + 1;
 4var day = calendar.get(Calendar.DATE);
 5var year = calendar.get(Calendar.YEAR);
 6var hour = calendar.get(Calendar.HOUR);
 7var minute = calendar.get(Calendar.MINUTE);
 8var second = calendar.get(Calendar.SECOND);
 9
10String date = String.join("-",
11    valueOf(year),
12    format("%02d", month),
13    format("%02d", day));
14
15String time = String.join(":",
16    format("%02d", hour),
17    format("%02d", minute),
18    format("%02d", second));
19
20System.out.println(date + " " + time);
21
22// or use SimpleDateFormat
23SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
24System.out.println(formatter.format(calendar.getTime()));

1.8.3. Calendar creation

1import java.text.SimpleDateFormat;
2import java.util.Calendar;
3import java.util.GregorianCalendar;
1Calendar calendar = new GregorianCalendar(2019, 0, 31);
2
3SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
4System.out.println(formatter.format(calendar.getTime()));

1.8.4. Calendar manipulation

1import java.text.SimpleDateFormat;
2import java.util.Calendar;
 1SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
 2
 3Calendar calendar = Calendar.getInstance();
 4
 5// add 1 year
 6calendar.add(Calendar.YEAR, 1);
 7System.out.println(formatter.format(calendar.getTime()));
 8
 9// subtract 2 years
10calendar.add(Calendar.YEAR,-2);
11System.out.println(formatter.format(calendar.getTime()));

1.9. Random number generation

1import java.util.Random;
1Random random = new Random(37L);
2
3var a = random.nextBoolean();
4var b = random.nextDouble();
5var c = random.nextInt();
6var d = random.nextInt(100);
7var e = random.nextFloat();
8var f = random.nextGaussian();
9var g = random.nextLong();