AbstractListModel is an abstract implementation of ListModel that provides concrete implementations of the ListDataListener methods, but it contains no specific data structure internally. Receipt of a corresponding ListDataEvent allows the listening JList to update itself in response to a change in the ListModel.  DefaultListModel is a typical concrete subclass of AbstractListModel that manipulate a Vector internally. The source illustrates typical usage. In particular, fireContentsChanged() is "Sent when the contents of the list has changed in a way that's too complex to characterize with the previous methods," fireIntervalAdded() or fireIntervalRemoved(). Because Vector is a legacy of the original DefaultTableModel, you'll want to use a more flexible alternative; index0 and index1 refer to elements of your chosen data structure.
What if I insert 10 elements in random places?
Then index0 and index1 should "bracket the change."
What does "bracket the change" mean?
In this context, bracket is used as a verb meaning to enclose or include; index0 should include the lowest changed index, and index1 should include the highest changed index. The range may include intervening cells, even though they were not changed. Happily, like JTable, JList renders only visible cells, so the marginal cost is bounded; more here.