[JAVA] ArrayList๋Š” ์–ด๋–ป๊ฒŒ ๋Š˜์–ด๋‚˜๋Š”๊ฐ€? ArrayList์˜ ๋™์  ํ• ๋‹น ๋ฐฉ์‹

2022. 6. 7. 01:21ยท๊ฐœ๋ฐœ/Etc.

ArrayList๋ž€

ArrayList๋Š” ๋ฐฐ์—ด๊ณผ ์œ ์‚ฌํ•˜๋ฉฐ, List ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ ๋ฐ์ดํ„ฐ์— ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์—ฐ์†๋œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

 

ArrayList์˜ ํŠน์ง•

  • ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋ฐฐ์—ด์€ ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ์ง€๋งŒ, ArrayList๋Š” ์‚ฌ์ด์ฆˆ๊ฐ€ ๋™์ ์œผ๋กœ ํ• ๋‹น๋˜๋Š” ๋ฐฐ์—ด์ด๋‹ค.
  • ์ฐธ์กฐ ํƒ€์ž…(reference type)๋งŒ ์›์†Œ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์ค‘๋ณต์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, null ๊ฐ’๋„ ํ—ˆ์šฉํ•œ๋‹ค.
  • ์ž๋ฃŒ๋ฅผ ๋Œ€๋Ÿ‰์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋ฉด ๋‚ด๋ถ€ ์ฒ˜๋ฆฌ ์ž‘์—…์ด ๋Š˜์–ด๋‚˜์„œ ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

ArrayList์˜ ์ฃผ์š” ๋ฉ”์†Œ๋“œ

๋ฉ”์†Œ๋“œ ์„ค๋ช…
boolean add(E e) ์ง€์ •๋œ ์ œ๋„ค๋ฆญ ํƒ€์ž… ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
void add(int index, E element) ํŠน์ • ์ธ๋ฑ์Šค ์œ„์น˜์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
boolean addAll(Collection<? extends E> c) Collection์„ ํ˜„์žฌ ArrayList์— ๋ชจ๋‘ ์ถ”๊ฐ€ํ•œ๋‹ค.
void clear() ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
boolean contains(Object o) ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋œ ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.
E get(int index) ํŠน์ • ์ธ๋ฑ์Šค ์œ„์น˜์˜ ์ œ๋„ค๋ฆญ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
int indexOF(Object o) ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋œ ๊ฐ์ฒด์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
Iterator<E> iterator() ์ˆœ์ฐจ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ ค๊ณ  Iterator ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
boolean remove(int index) ํŠน์ • ์ธ๋ฑ์Šค ์œ„์น˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.
int size() ArrayList ๊ฐ์ฒด์— ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

 

ArrayList์˜ ๋™์  ํ• ๋‹น ๋ฐฉ์‹

ํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๋Š” ๋ฐฐ์—ด๊ณผ ๋‹ฌ๋ฆฌ ArrayList๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ ์–ด๋–ป๊ฒŒ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋™์ ์œผ๋กœ ๋Š˜์–ด๋‚˜๋Š”์ง€ ๋‚ด๋ถ€ ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ์•Œ์•„๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

	/**
	 * Default initial capacity.
	 */
	private static final int DEFAULT_CAPACITY = 10;

	/**
	 * Shared empty array instance used for empty instances.
	 */
	private static final Object[] EMPTY_ELEMENTDATA = {};

	/**
	 * Shared empty array instance used for default sized empty instances. We
	 * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
	 * first element is added.
	 */
	private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

	/**
	 * The array buffer into which the elements of the ArrayList are stored.
	 * The capacity of the ArrayList is the length of this array buffer. Any
	 * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
	 * will be expanded to DEFAULT_CAPACITY when the first element is added.
	 */
	transient Object[] elementData;

๊ธฐ๋ณธ Capacity๊ฐ€ 10์ด๋‹ค. ArrayList๋Š” ์‹ค์ œ๋กœ ์ผ๋ฐ˜์ ์ธ Object ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋นˆ ArrayList๋Š” ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ ๊ธฐ๋ณธ Capacity๋กœ ํฌ๊ธฐ๊ฐ€ ํ™•์žฅ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

	/**
	 * Constructs an empty list with the specified initial capacity.
	 *
	 * @param  initialCapacity  the initial capacity of the list
	 * @throws IllegalArgumentException if the specified initial capacity
	 *		 is negative
	 */
	public ArrayList(int initialCapacity) {
		if (initialCapacity > 0) {
			this.elementData = new Object[initialCapacity];
		} else if (initialCapacity == 0) {
			this.elementData = EMPTY_ELEMENTDATA;
		} else {
			throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);
		}
	}

	/**
	 * Constructs an empty list with an initial capacity of ten.
	 */
	public ArrayList() {
		this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
	}

ArrayList ์ƒ์„ฑ ์‹œ ์ดˆ๊ธฐ ์šฉ๋Ÿ‰์„ ์ค€ ๊ฒฝ์šฐ์™€ ๋นˆ ArrayList๋กœ ์ƒ์„ฑํ•œ ๊ฒฝ์šฐ.

add() ๋ฉ”์†Œ๋“œ

	/**
	 * This helper method split out from add(E) to keep method
	 * bytecode size under 35 (the -XX:MaxInlineSize default value),
	 * which helps when add(E) is called in a C1-compiled loop.
	 */
	private void add(E e, Object[] elementData, int s) {
		if (s == elementData.length)
			elementData = grow();
		elementData[s] = e;
		size = s + 1;
	}

	/**
	 * Appends the specified element to the end of this list.
	 *
	 * @param e element to be appended to this list
	 * @return {@code true} (as specified by {@link Collection#add})
	 */
	public boolean add(E e) {
		modCount++;
		add(e, elementData, size);
		return true;
	}

ํ˜„์žฌ ArrayList ๋‚ด๋ถ€์—์„œ ๋™์ž‘ํ•˜๋Š” ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ๊ฐ™์„ ๋•Œ,

grow() ๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋กœ ํฌ๊ธฐ๋ฅผ ํ™•์žฅํ•ด ์ค€ ๋’ค ์ž…๋ ฅ๋ฐ›์€ ์ธ๋ฑ์Šค์— ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด grow()๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๊ณ  ์žˆ์„๊นŒ. ๐Ÿ™„

	/**
	 * 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
	 * @throws OutOfMemoryError if minCapacity is less than zero
	 */
	private Object[] grow(int minCapacity) {
		int oldCapacity = elementData.length;
		if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
			int newCapacity = ArraysSupport.newLength(oldCapacity,
					minCapacity - oldCapacity, /* minimum growth */
					oldCapacity >> 1		   /* preferred growth */);
			return elementData = Arrays.copyOf(elementData, newCapacity);
		} else {
			return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
		}
	}

	private Object[] grow() {
		return grow(size + 1);
	}

 if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)

๋จผ์ € ํ˜„์žฌ ArrayList๊ฐ€ ๋น„์–ด ์žˆ๋Š”์ง€ ์•„๋‹Œ์ง€ ํ™•์ธํ•œ๋‹ค.

๋น„์–ด ์žˆ์„ ๊ฒฝ์šฐ, else๋กœ ๊ธฐ๋ณธ ์šฉ๋Ÿ‰์ธ 10๊ณผ size + 1 ์ค‘ ํฐ ๊ฐ’์œผ๋กœ ์ƒˆ Object ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•œ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ, ์ƒˆ๋กœ์šด capacity๋กœ ํฌ๊ธฐ๋ฅผ ํ™•์žฅํ•ด ์ค€๋‹ค. 

 

 int newCapacity = ArraysSupport.newLength(oldCapacity, minCapacity - oldCapacity, oldCapacity >> 1);

oldCapacity : ๊ธฐ์กด ์šฉ๋Ÿ‰

minCapacity - oldCapacity : (size + 1) - (elementData.length) = ์ผ๋ฐ˜์ ์œผ๋กœ ์ตœ์†Œ ์ฆ๊ฐ€๊ฐ’์€ 1์ด ๋œ๋‹ค.

oldCapacity >> 1 : ๊ธฐ์กด ์šฉ๋Ÿ‰ / 2 (์šฐ์ธก ์‰ฌํ”„ํŠธ ์—ฐ์‚ฐ)

	/**
	 * A soft maximum array length imposed by array growth computations.
	 * Some JVMs (such as HotSpot) have an implementation limit that will cause
	 *
	 * ...
	 */
	public static final int SOFT_MAX_ARRAY_LENGTH = Integer.MAX_VALUE - 8;

	/**
	 * Computes a new array length given an array's current length, a minimum growth
	 * amount, and a preferred growth amount. The computation is done in an overflow-safe
	 * fashion.
	 *
	 * ...
	 */
	public static int newLength(int oldLength, int minGrowth, int prefGrowth) {
		// preconditions not checked because of inlining
		// assert oldLength >= 0
		// assert minGrowth > 0

		int prefLength = oldLength + Math.max(minGrowth, prefGrowth); // might overflow
		if (0 < prefLength && prefLength <= SOFT_MAX_ARRAY_LENGTH) {
			return prefLength;
		} else {
			// put code cold in a separate method
			return hugeLength(oldLength, minGrowth);
		}
	}

์–ด๋งˆ์–ด๋งˆํ•œ ์–‘์˜ ์ฃผ์„์ด๋ผ ์ค‘๊ฐ„์— ์ƒ๋žตํ–ˆ๋‹ค.

 int prefLength = oldLength + Math.max(minGrowth, prefGrowth)

๊ธฐ์กด arrayList๊ฐ€ 10์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ์–ผ๋งˆ๋‚˜ ๋Š˜๋ฆด์ง€ ์šฉ๋Ÿ‰์„ ์ €์žฅํ•˜๋Š” prefLength์„ 10๊ณผ minGrowth, prefGrowth ์ค‘ ๋” ํฐ ๊ฐ’์ธ 5๋ฅผ ๋”ํ•ด 15์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. ๊ฒฐ๊ตญ ๊ธฐ์กด ํฌ๊ธฐ์—์„œ 1.5๋ฐฐ๋กœ ๋Š˜๋ ค ์ƒˆ๋กœ์šด ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 if (0 < prefLength && prefLength <= SOFT_MAX_ARRAY_LENGTH)

์ƒˆ๋กœ์šด ํฌ๊ธฐ๊ฐ€ SOFT_MAX_ARRAY_LENGTH๋ฅผ ๋„˜์–ด๊ฐ€์ง€ ์•Š์„ ๊ฒฝ์šฐ, ๊ทธ๋Œ€๋กœ ๋„˜๊ฒจ ์ฃผ์ง€๋งŒ 0๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ์ตœ๋Œ€ ์šฉ๋Ÿ‰ ๊ฐ’์„ ๋„˜๋Š” ๊ฒฝ์šฐ๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ.

	private static int hugeLength(int oldLength, int minGrowth) {
		int minLength = oldLength + minGrowth;
		if (minLength < 0) { // overflow
			throw new OutOfMemoryError(
				"Required array length " + oldLength + " + " + minGrowth + " is too large");
		} else if (minLength <= SOFT_MAX_ARRAY_LENGTH) {
			return SOFT_MAX_ARRAY_LENGTH;
		} else {
			return minLength;
		}
	}

 int minLength = oldLength + minGrowth;

๊ธฐ์กด ํฌ๊ธฐ์™€ ์ตœ์†Œ ์ฆ๊ฐ€๊ฐ’์„ ๋”ํ•ด์„œ ์„ค์ •ํ•œ ์ตœ์†Œ ์šฉ๋Ÿ‰์ด 0๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ OutOfMemoryError ๋ฐœ์ƒ. SOFT_MAX_ARRAY_LENGTH ์ดํ•˜์ธ ๊ฒฝ์šฐ์—๋Š” ์„ค์ •๋œ int์˜ ์ตœ๋Œ€์น˜๋ฅผ ์šฉ๋Ÿ‰์œผ๋กœ ๋ถ€์—ฌํ•œ๋‹ค.

 

๊ฒฐ๋ก ์ ์œผ๋กœ

ArrayList๋Š” ์ƒˆ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ ์ž ํ•  ๋•Œ, capacity๊ฐ€ ๊ธฐ์กด ๋ฐฐ์—ด์˜ ํฌ๊ธฐ์™€ ๊ฐ™์•„์ง€๋ฉด ๊ธฐ์กด ์šฉ๋Ÿ‰์˜ 1.5๋ฐฐ๋งŒํผ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ๊ทธ ํฌ๊ธฐ๊ฐ€ ๋Š˜์–ด๋‚œ ๋ฐฐ์—ด์— ๊ธฐ์กด elementData๋ฅผ copyํ•œ๋‹ค. ์‹ค์ œ๋กœ๋Š” ์ •์  ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์š”์†Œ๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ์ตœ์†Œ ์ฆ๊ฐ€๋Ÿ‰์„ ๊ณ„์‚ฐํ•˜์—ฌ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆฌ๋Š” ๋ฐฉ์‹์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

 

์ฐธ๊ณ 

zorba91.tistory.com/287

sabarada.tistory.com/63

junghyungil.tistory.com/96

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋™์ผ์กฐ๊ฑด (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๊ฐœ๋ฐœ > Etc.' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[WebSquare] ๊ทธ๋ฆฌ๋“œ(Grid)์— ๋ฐ”์ธ๋”ฉ๋œ ๋ฐ์ดํ„ฐ ์™ธ์— ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ์‹ถ์„ ๋•Œ  (0) 2022.05.03
'๊ฐœ๋ฐœ/Etc.' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [WebSquare] ๊ทธ๋ฆฌ๋“œ(Grid)์— ๋ฐ”์ธ๋”ฉ๋œ ๋ฐ์ดํ„ฐ ์™ธ์— ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ์‹ถ์„ ๋•Œ
Lily ๐Ÿ‘ฉ‍๐Ÿ’ป
Lily ๐Ÿ‘ฉ‍๐Ÿ’ป
  • Lily ๐Ÿ‘ฉ‍๐Ÿ’ป
    proLOGue
    Lily ๐Ÿ‘ฉ‍๐Ÿ’ป
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (11)
      • ์ผ์ƒ (0)
        • .txt (0)
        • ํ•„์‚ฌ (0)
        • ์‹œ์‚ฌ (0)
        • ๋ฆฌ๋ทฐ (0)
        • ์—ฌํ–‰ (0)
      • ๊ฐœ๋ฐœ (11)
        • Algorithm (5)
        • IDE (2)
        • MSA (0)
        • Design Pattern (0)
        • Cloud Native (1)
        • Database (0)
        • Security (0)
        • Trouble Shooting ๐Ÿš€ (1)
        • Frontend (0)
        • Etc. (2)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    java
    ํ•ต์‹ฌ๋งŒ ์ฝ•! ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค
    ArrayList
    docker
    GitAction
    ๋™์ ํ• ๋‹น
    ๊ทธ๋ฆฌ๋“œ
    ๋„์ปค
    ์›น์Šคํ€˜์–ด
    ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค
    ๋ฐ”์ธ๋”ฉ
    selecteddata
    Kubernetes
    websquare
    CLI
    AWS
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
Lily ๐Ÿ‘ฉ‍๐Ÿ’ป
[JAVA] ArrayList๋Š” ์–ด๋–ป๊ฒŒ ๋Š˜์–ด๋‚˜๋Š”๊ฐ€? ArrayList์˜ ๋™์  ํ• ๋‹น ๋ฐฉ์‹
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”