変な動作だけど多分それで正しい
任意の一文字とそれの0回以上の繰り返し -> ABC にマッチ
.* で0文字にもマッチ -> 末尾のnullにマッチ
で2回マッチするっぽい
PCREとかJavaScriptとかも同様の動作をするよ
正直、".*$" でも2回マッチするのは納得できないけどw

for (String regex: new String[]{".*", "^.*", ".*$"}) {
var matcher = Pattern.compile(regex).matcher("ABC");
System.out.println(matcher);
matcher.results().forEach(mr -> System.out.println(mr.group()));
}