Start here. This is the direct spoken answer to practice first.
Why this question matters
Read-only access and immutable state solve different problems. One restricts what a caller can do through an API, while the other gives all observers a stable value.
A read-only interface or wrapper prevents the receiver from mutating through that reference, but the owner may still change the backing collection. An immutable collection returns a new collection for each logical change, leaving the previous value unchanged. I expose a read-only view when one owner legitimately mutates state and consumers only need observation. I use an immutable value when readers need a stable snapshot that cannot change underneath them.