public void move(int srcIndex, int dstIndex, int len) {
    	checkRange(srcIndex, len);
    	checkRange(dstIndex, len);

    	// Copy elements
    	if (srcIndex < dstIndex) {
    		for (int i=len-1; i>=0; i--) {
    			doReSet(dstIndex+i, doGet(srcIndex+i));
    		}
    	} else if (srcIndex > dstIndex) {
    		for (int i=0; i<len; i++) {
    			doReSet(dstIndex+i, doGet(srcIndex+i));
    		}
    	}

    	// Set elements to null after the move operation
    	if (srcIndex < dstIndex) {
    		int fill = Math.min(len, dstIndex-srcIndex);
    		setMult(srcIndex, fill, null);
    	} else if (srcIndex > dstIndex) {
    		int fill = Math.min(len, srcIndex-dstIndex);
    		setMult(srcIndex+len-fill, fill, null);
    	}
    }
Move specified elements.
Source and destination ranges may overlap.
The elements which are moved away are set to null, so the size of the list does not change.

@param srcIndex	index of first source element to move
@param dstIndex	index of first destination element to move
@param len		number of elements to move
@throws 			IndexOutOfBoundsException if the ranges are invalid
jphp-runtime/src/php/runtime/memory/support/IList.java