あなたの講師は次のことを意味していると思います。
- char []には、System.inから読み取られた文字が含まれている必要があります(適切なサイズだけではありません)
- " "は、上の他のオーバーロードされたメソッド
System.in.read
のみを参照し、参照しないため、一度に1文字を読み取るように制限されます。InputStream#read()
read
InputStream
実装方法を確認する必要がArrayList
あります。配列に支えられていますが、リストは任意にサイズ変更できます。リストのサイズが配列サイズを超えると、ArrayList
より大きな新しい配列を作成し、古い配列の内容をその配列にコピーします。ここにいくつかの関連する抜粋がありますArrayList
:
/**
* Appends the specified element to the end of this list.
*
* @param e element to be appended to this list
* @return <tt>true</tt> (as specified by {@link Collection#add})
*/
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
/**
* Increases the capacity to ensure that it can hold at least the
* number of elements specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
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);
}
は使用できないためSystem.arraycopy()
、独自のメソッドを作成する必要があります。それはただのfor
ループです。
これは実際にはそれほど非効率的ではありません。javadocで説明されているようにArrayList#add(E)
、償却された定数時間で実行されます。
戦略に正確に従うとArrayList
、結果の配列は必要以上に大きくなるため、最後に、入力サイズに正確に切り捨てるために、最後にもう1つ配列のサイズ変更を行う必要があります。または、文字を読み取るたびに配列を1ずつ増やすこともできますが、実行時間は入力長が線形(n)ではなく2次(n ^ 2)になります。