code: @Override
  	public int indexOf(Object elem) {
  		int elemHash=elem.hashCode();
  
  		// Find the location to insert the object at
  		int elemHashPos=binarySearchHashCode(elemHash);
  
  		// Not found
  		if(elemHashPos<0) return -1;
  
  		// Try backwards until found or different hashCode
  		int pos=elemHashPos;
  		while(pos>=0) {
  			E T=get(pos);
  			if(T.hashCode()!=elemHash) break;
  			if(T.equals(elem)) {
  				// Found one, iterate backwards to the first one
  				while(pos>0 && get(pos-1).equals(elem)) pos--;
  				return pos;
  			}
  			pos--;
  		}
  
  		// Try forwards until found or different hashCode
  		pos=elemHashPos+1;
  		int size=size();
  		while(pos<size) {
  			E T=get(pos);
  			if(T.hashCode()!=elemHash) break;
  			if(T.equals(elem)) return pos;
  			pos++;
  		}
  
  		// Not found
  		return -1;
  	}
docs: Searches for the first occurrence of the given argument, testing
  for equality using the <tt>equals</tt> method.
  
  @param   elem   an object.
  @return  the index of the first occurrence of the argument in this
  list; returns <tt>-1</tt> if the object is not found.
  @see     Object#equals(Object)