code: private boolean hasSameStructure() {
          Object wrappedCollection = getWrappedValue();
          if (wrappedCollection == null) {
              return bufferedListModel.size() == 0;
          }
          else if (wrappedCollection instanceof Object[]) {
              Object[] wrappedArray = (Object[])wrappedCollection;
              if (wrappedArray.length != bufferedListModel.size()) {
                  return false;
              }
              for (int i = 0; i < bufferedListModel.size(); i++) {
                  if(super.hasValueChanged(wrappedArray[i], bufferedListModel.get(i))) {
                      return false;
                  }
              }
          }
          else {
              if (((Collection)wrappedCollection).size() != bufferedListModel.size()) {
                  return false;
              }
              for (Iterator i = ((Collection)wrappedCollection).iterator(), j = bufferedListModel.iterator(); i.hasNext();) {
                  if (super.hasValueChanged(i.next(), j.next())) {
                      return false;
                  }
              }
          }
          return true;
      }
docs: Checks if the structure of the buffered list model is the same as the wrapped
  collection. "same structure" is defined as having the same elements in the
  same order with the one exception that NULL == empty list.