Hat was damit zu tun wie Java intern Strings verwaltet. "==" vergleicht die Adressen von Objekte und "Peter" und "Peter" haben in Java die gleiche Adresse. Wenn du Strings inhaltlich vergleichen willst, musst du name1.equals(name2) vergleichen.
Wenn du dich genauer einlesen willst, musst du dich mit dem String Pool in Java beschäftigen.
Zwei Gründe, die dafür sorgen, dass zwei gleiche String-Literale (im Sinne von equals()) in einer Klasse auf dasselbe String-Objekt zur Laufzeit abgebildet werden:
1. Der Java-Compiler: String-Literale werden ja in der .class Datei im Constant Pool abgelegt. Um möglichst Platz zu sparen, hält der Compiler (z.B. javac) schon eine Map von String nach Constant Pool Index, so dass häufige gleiche auftretende String-Literale immer auf denselben Constant Pool Eintrag abgebildet werden und die entsprechende Zeichenkette des Strings dann nur einmal tatsächlich in der .class-Datei gespeichert zu werden braucht.
2. Die Java Language Specification: Diese verlangt sogar, dass alle String-Literale in allen geladenen Klassen immer ge-"intern"-ed werden, also im von @Robat genannten String Pool gespeichert werden, so dass Lookups von gleichen String-Literalen immer auf dasselbe String-Objekt abgebildet werden. Siehe hierzu: https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28 ("Compile-time constant expressions of type String are always "interned" so as to share unique instances, using the method String.intern.")