В чем разница между горячим Observable и холодным Observable в RxJava

«В чем разница между горячим Observable и холодным Observable в RxJava» — вопрос из категории Реактивное программирование, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Холодный Observable начинает испускать данные только при подписке (каждый подписчик получает свой поток). Пример: Observable.just(1, 2, 3).

Горячий Observable испускает данные независимо от подписок (подписчики получают данные, начиная с момента подписки). Пример: PublishSubject или ConnectableObservable.

// Холодный
val cold = Observable.just(1, 2, 3)
cold.subscribe { println("Sub1: $it") } // Выведет 1,2,3
cold.subscribe { println("Sub2: $it") } // Снова выведет 1,2,3

// Горячий
val hot = PublishSubject.create<Int>()
hot.onNext(1)
hot.subscribe { println("Sub1: $it") } // Не получит 1
hot.onNext(2) // Sub1 получит 2