Before Compose 234 , Android UI meant the View system: widgets declared in XML layouts, inflated into Java objects, then found and mutated. Older apps still use it (Interop and Migration embeds one layout). It is imperative: XML describes the first frame, and each change is a call such as findViewById<TextView>(R.id.header).text = "Staff picks (${books.size} books)", so you must remember every widget that shows the count, as jQuery 561 code did. In Compose you write Text("Staff picks (${books.size})") once; when books changes the function reruns and Compose updates what differs: UI is a function of state.
| View system | Jetpack Compose | React 7,897 / React Native 36,878 | |
|---|---|---|---|
| UI described in | XML plus code | Kotlin functions | JSX functions |
| Updating the screen | Mutate widgets | Rerun functions | Rerender components |
| Change detection | You track it | Compiler and runtime | Reconciler tree diff |
| Children | ViewGroup | Content lambdas (slots) | children prop |
| Layout | May measure twice | One measure per child | Yoga flexbox (View and Flexbox) |
The first run builds the composition; later runs recompose only functions whose inputs changed, checked against the slot table in which the runtime stores each call's arguments and remembered values:

The slot table is a gap buffer, so an insert moves the gap instead of copying the array. Compose Runtime 1.11 (April 2026) added an experimental replacement, LinkTable, up to twice as fast for list reorders; in 1.12.1 it is still off by default.