Start here. This is the direct spoken answer to practice first.
Overview
Immutability and pooling reinforce each other, but they are different ideas and should not be collapsed into one explanation.
A Java String is immutable: once created, its sequence of characters cannot change. Operations such as replace or concatenation return another string rather than modifying the original. That makes strings safe to share, dependable as hash keys, and easier to use across threads. The string pool is a JVM-managed set of canonical string instances, especially for literals, so equal literals can share one object. Pooling is an optimization; it does not change the rule that string values should be compared with equals, not ==.