ArrayList源码中的数组扩容的疑点

ArrayList源码中的数组扩容的疑问
private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

这里的int newCapacity = oldCapacity + (oldCapacity >> 1);这句怎么理解?
------解决方案--------------------
int newCapacity = oldCapacity + (oldCapacity >> 1)
相当于int newCapacity = oldCapacity + (oldCapacity / 2)
也就是说newCapacity = oldCapacity * (1.5)
扩容50%的意思
------解决方案--------------------
int newCapacity = oldCapacity + (oldCapacity >> 1)
newCapacity 就是扩容的新组数大小。而扩容的大小是根据原有旧数组大小来决定的。
oldCapacity >>1。就是右移1位,这里会换算成二进制来进行。就是把十进制对应的数字换成二进制后往右边移一位。所以跟除以2差不多。所以扩容为原来的1.5倍。
但是右移一位的时候,如果非偶数,也就是说二进制数的最低位为1,则会舍弃,就成为了除2-1。
但是我好像记得ArrayList的扩容是直接用的(oldCapacity * 3)/2 + 1。你确定你没有看错。
------解决方案--------------------
扩大50%容量
------解决方案--------------------
楼上的都对。

补充一点,对CPU而言,右移一位要比除2要快很多。