Pages

Showing posts with label Java 12. Show all posts
Showing posts with label Java 12. Show all posts

Monday, May 27, 2019

Java 12 String API indent​() Method Example

1. Overview

In this quick tutorial, We'll learn new indent() introduced in JDK 12 in Java.lang.String class.

Demonstrated with examples how to use indent() method.

Please read article on Java 12 new String API methods addition.


Will go through its internal code and how it works.

Java 12 String indent​() Method Example

Thursday, May 9, 2019

Java 12 String API Additions

1. Overview

Java 12 added a few useful APIs to the commonly used String class. In this tutorial, we will explore and use these new APIs.

  • indent​(int n)
  • transform​(Function<? super String,​? extends R> f)
  • describeConstable()
  • resolveConstantDesc​(MethodHandles.Lookup lookup)


Take a look at Java 11 String API methods which are discussed in depth in the last article.


In all our example, we will use String string = "Java-W3schools";

2. indent (int n)

As the name suggests, the indent () instance method provides the indentation for the given string that means it will add or remove the white characters at the beginning of the string.

Where method argument n indicates the number of leading white space characters to add or remove.

2.1 Signature

public String indent​(int n)

If n value is positive then adds leading white spaces.
If n value is negative then removes leading white spaces.
If n value is zero then the input string is unchanged.

2.2 Example - n positive

See the example program on indent method with value 5.

String value = "indent";
System.out.println(value);
System.out.println(value.indent(5));

2.3 Output

indent
     indent

See the difference between the original string and indented string. Indented string now has 5 empty spaces added to it.

2.4 Example - n negative


In this example, passing a negative value to it and added 4 empty spaces to the input string at the beginning.

String value = "    indent";
System.out.println(value);
System.out.println(value.indent(5));

2.5 Output

Now observe the output and it has removed 2 empty spaces at the beginning.

    indent
  indent

If the input string is not having empty spaces at the beginning if n is negative then it will not do anything. Simply it returns the same string.

2.6 Example - n is zero

String inputNZero = "welcome";
System.out.println(inputNZero.indent(0));

2.7 Output

welcome

2.8 Internal Code

Internally, first, it converts the input string into lines by calling line() method then it will add n empty spaces by calling " ".repeat(n). Finally, it appends the empty spaces to each line at the beginning.


public String indent(int n) {
        return isEmpty() ? "" :  indent(n, false);
    }

    private String indent(int n, boolean removeBlanks) {
        Stream stream = removeBlanks ? lines(Integer.MAX_VALUE, Integer.MAX_VALUE)
                                             : lines();
        if (n > 0) {
            final String spaces = " ".repeat(n);
            stream = stream.map(s -> spaces + s);
        } else if (n == Integer.MIN_VALUE) {
            stream = stream.map(s -> s.stripLeading());
        } else if (n < 0) {
            stream = stream.map(s -> s.substring(Math.min(-n, s.indexOfNonWhitespace())));
        }
        return stream.collect(Collectors.joining("\n", "", "\n"));
    }


3. transform (Function<? super String, ? extends R> f)


Transform method is important and used to transform the string into one form to another form using Function Functional interface.

Must be used with lambda expression only because Function is part of Java 8 stream API.

3.1 Signature

public  R transform​(Function f)

3.2 Example


We will see a few scenarios in this example program now. If we want to convert all elements of List into uppercase or append some value to it, then the transform method is most usable.

  List fruits = new ArrayList<>();

  fruits.add("Mango");
  fruits.add("Apple");
  fruits.add("Banana");
  fruits.add("Avvacado");
  fruits.add("Papaya");

  List newFruitsList = fruits.stream().map(s -> s.transform(str -> str.toUpperCase())).collect(Collectors.toList());

  System.out.println(newFruitsList);


3.3 Output

From fruits list stream, taking one by one fruit name and passing to transform function which converts into uppercase by calling toUpperCase() method of String class. Collecting all outputs of transform() method into a List using Collectors.toList() method.

[MANGO, APPLE, BANANA, AVVACADO, PAPAYA]

Not only toUpperCase() method but also can be used any operation that can be performed on String either adding some content to it or anything. Now just adding "Halwa" to each string in the fruits list.

s -> s.transform(str -> str + " Halwa")

Now the newFruitsList will have the values with added " Halwa" string to each fruit name.

[Mango Halwa, Apple Halwa, Banana Halwa, Avvacado Halwa, Papaya Halwa]

3.4 Internal Code

Internally it just invokes the f.apply() method.

 public  R transform(Function f) {
        return f.apply(this);
    }

4. describeConstable()

Returns an Optional containing the nominal descriptor for this instance, which is the instance itself.

4.1 Signature

public Optional describeConstable()

Java 12 has introduced Constants API in JEP 334. If you look at the String class documentation, it implements two new interfaces from Constants API – Constable, and ConstantDesc. This method is declared in the Constable interface and implemented in the String class.

4.2 Example


 String status = "SUCCESS";
 Optional optional = status.describeConstable();
 System.out.println(optional);
 System.out.println(optional.get());
 System.out.println(optional.isPresent());

4.3 Output

Optional[SUCCESS]
SUCCESS
true

5. resolveConstantDesc (MethodHandles.Lookup lookup)

Resolves this instance as a ConstantDesc, the result of which is the instance itself.

5.1 Signature

public String resolveConstantDesc​(MethodHandles.Lookup lookup)

5.2 Example


 String string = "resolveConstantDesc​";
 String constDesc = string.resolveConstantDesc(MethodHandles.lookup());
 System.out.println(constDesc);

6. Conclusion

In this tutorial, We've seen the new methods added in Java 12 version. indent (...) and transform() methods add great value to String API. But describeConstable() and resolveConstantDesc methods are not much useful for developers when working on Strings.

Programs shown in this post are available on GitHub. All these programs are downloadable.


Tuesday, April 30, 2019

Shenandoah: Ultra low-pause garbage collector in Java 12

Java 12 New ZGC - Concurrent Class Unloading

One feature ZGC is currently missing is class unloading before java 12 versions. This should be implemented. Due to the latency sensitive nature of class unloading, this operation should be performed concurrently.

Concurrent Class Unloading Released in JDK 12 for ZGC

The Z Garbage Collector now supports class unloading. By unloading unused classes, data structures related to these classes can be freed, lowering the overall footprint of the application. Class unloading in ZGC happens concurrently, without stopping the execution of Java application threads, and has zero impact on GC pause times. This feature is enabled by default, but can be disabled by using the command line option `-XX:-ClassUnloading`.


Shenandoah - A Low-Pause-Time Garbage Collector

Traditional Class Unloading VS ZGC Concurrnet Class Unloading


Traditional Class Unloading

Step 1: Marking (concurrent)
  Mark metadata (classes, CLDs) when marking objects


Step 2: Reference processing (STW)
  Need to know what is reachable from finalizers before class unloading


Step 3: Unloading (STW)
  Unload code cache
  Unload metadata

ZGC Concurrnet Class Unloading

Step 1: Marking (concurrent)
 Mark metadata (classes, CLDs) when marking objects
 Mark both strong and final reachable graphs


Step 2: Reference processing (concurrent)
 Already know what is reachable from finalizers before class unloading


Step 3: Unloading (concurrent)
 Unload code cache
 Unload metadata

Image of ZGC-Phases

Shenandoah: A Low-Pause-Time Garbage Collector:

Added a new garbage collection (GC) algorithm named Shenandoah which reduces GC pause times by doing evacuation work concurrently with the running Java threads. Pause times with Shenandoah are independent of heap size, meaning you will have the same consistent pause times whether your heap is 100 MB or 100 GB or 1TB.

Modern machines have more memory and more processors than ever before. Service Level Agreement (SLA) applications guarantee response times of 10-500ms. In order to meet the lower end of that goal we need garbage collection algorithms which are efficient enough to allow programs to run in the available memory, but also optimized to never interrupt the running program for more than a handful of milliseconds. Shenandoah is an open-source low-pause time collector for OpenJDK designed to move us closer to those goals.

Shenandoah trades concurrent cpu cycles and space for pause time improvements. We've added an indirection pointer to every Java object which enables the GC threads to compact the heap while the Java threads are running. Marking and compacting are performed concurrently so we only need to pause the Java threads long enough to scan the thread stacks to find and update the roots of the object graph.

The Shenandoah algorithm is described in depth in this PPPJ2016 paper.

As experimental feature, Shenandoah will require -XX:+UnlockExperimentalVMOptions in the command line. The Shenandoah build system disables the build on unsupported configurations automatically. Downstream builders may choose to disable building Shenandoah with --with-jvm-features=-shenandoahgc on otherwise supported platforms.

To enable/use Shenandoah GC, the following JVM options will be needed: -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC.

 

Java 12 Files mismatch Method Example to Compare two Files

1. Java 12 Files mismatch Overview

In this post, We will learn about new method mismatch() added in Java 12 to Files class. Files class is in package java.nio.file.Files.

java.nio.file.Files class consists exclusively of static methods that operate on files, directories, or other types of files. In most cases, the methods defined here will delegate to the associated file system provider to perform the file operations.

Java 12 API Files mismatch


We will learn how to compare two files using Files.mismatch method.

JDK 12 introduces the new way to determine equality between two files.

Java 12 Collectors.teeing() - Working Examples

1. Overview

In this post, We will learn about new method teeing () added in Java 12 to Collectors class. Collectors class is in package java.util.stream.Collector and it is in java.base module.


Java 12 Collector.teeing​() Method with Example


2. Collectors.teeing ()

Returns a Collector that is a composite of two downstream collectors. Every element passed to the resulting collector is processed by both downstream collectors, then their results are merged using the specified merge function into the final result.