Java strings are sequences of 16-bit units and don't guarantee UTF-16 validity. There are newer standard library APIs that perform astral-aware operations, though.
(Note that java.lang.Character is a char, so wrong. I think there is no CodePoint type or similar that wraps int.)
It's unclear to me what you mean by "Java Characters". A Java char is a UTF-16 code unit, and the java.lang.Character boxes a char (16 bits unsigned). However, since Java 5, java.lang.Character has static methods for astral-aware UTF-16 operations where a code point is a Java int (32 bits signed).
> the dot matches the whole pair without splitting it
Yeah, so UTF16 in Java is being used as a variable-width encoding. Nice to know.