java 공부중
순서가 있고 중복을 허용. 크기 정적 고정.
인덱스 검색 : 필요한 인덱스의 값을 빨리 찾을 수 있음. (참조값(주소값)을 계산해서 접근하기때문)
데이터 검색: 배열의 크기만큼의 연산 시간이 걸림
데이터를 추가할 때 위치에 따라 성능 변화가 발생
배열의 길이가 고정임.
=> 길이가 동적으로 변하고, 데이터 추가하기 편하면 좋겠다 -> 리스트
순서가 있고 중복을 허용. 크기 동적 변경.
리스트 자료구조를 사용하며, 내부의 데이터는 배열에 보관
package collection.array;
public class MyArrayListV3Main {
public static void main(String[] args) {
MyArrayListV3 list = new MyArrayListV3();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
System.out.println("addLast");
list.add(3, "addLast");
System.out.println(list);
System.out.println("addFirst");
list.add(0, "addFirst");
System.out.println(list);
Object removed1 = list.remove(4);
System.out.println("removed(4) = " + removed1);
System.out.println(list);
Object removed2 = list.remove(0);
System.out.println("removed(0) = " + removed2);
System.out.println(list);
}
}
package collection.array;
public class MyArrayListV3Main {
public static void main(String[] args) {
MyArrayListV3 list = new MyArrayListV3();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
System.out.println("addLast");
list.add(3, "addLast");
System.out.println(list);
System.out.println("addFirst");
list.add(0, "addFirst");
System.out.println(list);
Object removed1 = list.remove(4);
System.out.println("removed(4) = " + removed1);
System.out.println(list);
Object removed2 = list.remove(0);
System.out.println("removed(0) = " + removed2);
System.out.println(list);
}
}
=> 위의 코드에서는 타입 안전성일 떨어짐. 제네릭을 이용하면 타입의 안전성을 확보할 수 있음
package collection.array;
public class MyArrayListV4Main {
public static void main(String[] args) {
MyArrayListV4<String> stringList = new MyArrayListV4<>();
stringList.add("a");
stringList.add("b");
stringList.add("c");
String string = stringList.get(0);
System.out.println("string = " + string);
MyArrayListV4<Integer> intList = new MyArrayListV4<>();
intList.add(1);
intList.add(2);
intList.add(3);
Integer integer = intList.get(0);
System.out.println("integer = " + integer);
}
}
package collection.array;
import java.util.Arrays;
public class MyArrayListV4<E> {
private static final int DEFAULT_CAPACITY = 5;
private Object[] elementData;
private int size = 0;
public MyArrayListV4() {
elementData = new Object[DEFAULT_CAPACITY];
}
public MyArrayListV4(int initialCapacity) {
elementData = new Object[initialCapacity];
}
public int size() {
return size;
}
public void add(E e) {
if (size == elementData.length) {
grow();
}
elementData[size] = e;
size++;
}
public void add(int index, E e) {
if (size == elementData.length) {
grow();
}
shiftRigthFrom(index);
elementData[index] = e;
size++;
}
private void shiftRigthFrom(int index) {
for (int i = size; i > index; i--) {
elementData[i] = elementData[i - 1];
}
}
private void grow() {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity * 2;
elementData = Arrays.copyOf(elementData, newCapacity);
}
public E remove(int index) {
E oldValue = get(index);
shiftLeftFrom(index);
size--;
elementData[size] = null;
return oldValue;
}
private void shiftLeftFrom(int index) {
for (int i = index; i < size - 1; i++) {
elementData[i] = elementData[i + 1];
}
}
@SuppressWarnings("unchecked")
public E get(int index) {
return (E) elementData[index];
}
public E set(int index, E element) {
E oldValue = get(index);
elementData[index] = element;
return oldValue;
}
public int indexOf(E o) {
for (int i = 0; i < size; i++) {
if (o.equals(elementData[i])) {
return i;
}
}
return -1;
}
@Override
public String toString() {
return Arrays.toString(Arrays.copyOf(elementData, size)) + " size=" + size + ", capacity=" + elementData.length;
}
}
=> 배열 리스트는 순서대로 마지막에 데이터를 추가하거나 삭제할 때는 성능이 좋지만 앞이나 중간에 데이터를 추가하러나 삭제할 때는 성능이 좋지 않음
-> 단점 해결한 링크드 리스트