将String添加到String数组的开头

是否可以在不迭代整个数组的情况下将字符串添加到String数组的开头。

回答:

唯一的方法是维护环形缓冲区。也就是说,您有一个计数器,它记住起始位置,然后移动它而不是移动数组中的所有条目。这仅适用于您重新定义“开始”的含义。

请参阅ArrayDeque的源代码,其中包含三个字段

   86       /**

87 * The array in which the elements of the deque are stored.

88 * The capacity of the deque is the length of this array, which is

89 * always a power of two. The array is never allowed to become

90 * full, except transiently within an addX method where it is

91 * resized (see doubleCapacity) immediately upon becoming full,

92 * thus avoiding head and tail wrapping around to equal each

93 * other. We also guarantee that all array cells not holding

94 * deque elements are always null.

95 */

96 private transient E[] elements;

97

98 /**

99 * The index of the element at the head of the deque (which is the

100 * element that would be removed by remove() or pop()); or an

101 * arbitrary number equal to tail if the deque is empty.

102 */

103 private transient int head;

104

105 /**

106 * The index at which the next element would be added to the tail

107 * of the deque (via addLast(E), add(E), or push(E)).

108 */

109 private transient int tail;

因此,添加到开始像这样

  224       public void addFirst(E e) {

225 if (e == null)

226 throw new NullPointerException();

227 elements[head = (head - 1) & (elements.length - 1)] = e;

228 if (head == tail)

229 doubleCapacity();

230 }

312 /**

313 * @throws NoSuchElementException {@inheritDoc}

314 */

315 public E getFirst() {

316 E x = elements[head];

317 if (x == null)

318 throw new NoSuchElementException();

319 return x;

320 }

注意:它移动头部,而不是将所有元素向下移动阵列。

以上是 将String添加到String数组的开头 的全部内容, 来源链接: utcz.com/qa/406201.html

回到顶部