A string in Java can be seen as an array of UTF-16 encoded "code units". A code unit is a sequence of bits that represents a part of an abstract character. All ASCII characters can be represented by exactly one UTF-16 code unit. When you calls chars(), you get a stream of "code units".
A "code unit" is not the same thing as a "code point". A Unicode code point is a number that indexes an abstract character. Some characters have a higher index than you can represent with 2 bytes, such as East Asian ideographs or many emojis. For those, you need more than one "code unit" per "code point".
Take a look at the following application:
Their achilles heel is the noogie! Give them noogies tiny ad!
SKIP - a book about connecting industrious people with elderly land owners