Para comparar objetos de tipo primitivo( int,char,boolean,double) se usa "==", pero String no es un tipo primitivo, es de un tipo objeto y el operador "==" no está definido para las variables de tipo Objeto, para compararlos se usan métodos adicionales y es el programador de la clase del objeto quien decide los criterios para decidir si un objeto es igual o diferente a otro objeto. Por ejemplo el método equals de String compara todos los caracteres del String y si todos son iguales devuelve true eso lo puedes ver en el código fuente del método, y tú puedes crear tus propias clases e implementar métodos para comparar objetos de esa clase.