The toggle
Open Search Everywhere (press Shift twice, or Ctrl+Shift+A for Find Action), type "Customize Data Views", and hit enter.
In the dialog:
- Uncheck Enable alternative view for Collections classes — this is the main switch. With it off, the debugger shows the actual fields (
elementData,size,table,threshold, whatever your type actually has). - Check Show static fields — usually worth leaving on. Static constants are often what you're comparing against when you're deep in a bug.
- While you're there, consider enabling Show synthetic fields too — this exposes compiler-generated stuff like enclosing-class references for inner classes, which is useful when you're diagnosing captured-state bugs in lambdas.
Save. The change is immediate; re-evaluating any watch or inspecting a variable on the stack will now show the real shape.
Why the alternate view exists
For 99% of people, the default is correct. If you're debugging application code and you have an ArrayList<User>, you want to see the users, not the backing array and the modCount. The alternate view is also meaningfully faster on large collections — rendering a million-element HashMap as key-value pairs is O(n) lazy; rendering its internal Node[] bucket array is O(n) eager.
So: disable it when you're inside collection internals (custom Map, cache implementations, testing a concurrent data structure), re-enable it when you're back to regular application debugging.
Per-class overrides
If you only need the raw view for one specific type, there's a more surgical option: right-click a variable of that type in the debugger → Customize Data Views > Create Data Type Renderer…. You can define how instances of just that class are displayed without turning off the alternate view globally.