@Override
 public boolean equals(Object obj) {
   if (this == obj) return true;
   if (!super.equals(obj)) return false;
   if (getClass() != obj.getClass()) return false;
   ArraySparseSet other = (ArraySparseSet) obj;
   if (numElements != other.numElements) return false;
   for (int index = 0; index < numElements; index++)
     if (!other.contains(elements[index])) return false;
   return true;
 }
  public void difference(FlowSet otherFlow, FlowSet destFlow) {
    if (sameType(otherFlow) && sameType(destFlow)) {
      ArraySparseSet other = (ArraySparseSet) otherFlow;
      ArraySparseSet dest = (ArraySparseSet) destFlow;
      ArraySparseSet workingSet;

      if (dest == other || dest == this) workingSet = new ArraySparseSet();
      else {
        workingSet = dest;
        workingSet.clear();
      }

      for (int i = 0; i < this.numElements; i++) {
        if (!other.contains(this.elements[i])) workingSet.add(this.elements[i]);
      }

      if (workingSet != dest) workingSet.copy(dest);
    } else super.difference(otherFlow, destFlow);
  }