La réponse de base :
Ils ne sont utiles que lors de l'implémentation de onSaveInstanceState() et de la restauration de cet état dans onCreate(). Si vous n'implémentez pas onSaveInstanceState(), vous pouvez oublier ces méthodes et faire comme si elles n'existaient pas.
Le problème qu'ils résolvent : si vous voulez sauvegarder une référence à un fragment dans votre "état d'instance sauvegardé", vous ne pouvez pas simplement y mettre une référence d'objet. D'abord parce que vous ne pouvez pas mettre un objet simple dans un Bundle :) Et la raison en est que le but de cet état sauvegardé est d'être copié hors de votre processus, de sorte que si votre processus doit être tué, il peut plus tard être copié dans un nouveau processus pour que vous réinitialisiez votre activité/fragment. Un objet brut n'a de sens que dans le contexte du processus dans lequel il est exécuté, il n'est donc pas possible de copier correctement la référence à un tel objet hors de votre processus actuel et dans un autre.
Ainsi, ce que putFragment()/getFragment() fait est de placer un morceau de données dans le Bundle donné qui peut identifier ce fragment à travers une nouvelle instance de votre activité/fragment dans un autre processus. La nature exacte de cette représentation n'est pas définie, mais dans l'implémentation actuelle, il s'agit de l'identifiant entier interne de ce fragment, qui sera utilisé ultérieurement lorsque le FragmentManager devra recréer ce fragment à partir d'un état précédemment sauvegardé... il est recréé avec ce même identifiant, de sorte que lorsque vous appelez ensuite getFragment(), il peut récupérer l'entier et l'utiliser pour déterminer l'objet Fragment correct à renvoyer à l'appelant, qui correspond à celui qui a été précédemment sauvegardé.