제가 만든 코드와 자바의 ArrayList의 메서드와 작동 방식은 차이가 있습니다. 단순히 구조를 파악하기 위한 코드입니다.
private static final int DEFAULT_CAPACITY = 10; (실제 자바 API도 동일하게 10)import java.util.Arrays;
import java.util.NoSuchElementException;
import java.util.Objects;
public class MyArrayList<E> {
private static final int DEFAULT_SIZE = 10;
private int size;
private Object[] array;
public MyArrayList() {
this.size = 0;
array = new Object[DEFAULT_SIZE];
}
public void add(E e) {
if (size >= array.length) {
extendSize();
}
array[size++] = e;
}
// 인덱스로 값 얻어내기
public E get(int index) {
indexCheck(index);
return (E) array[index];
}
// list 사이즈
public int size() {
return this.size;
}
public boolean isEmpty() {
if (this.size == 0) {
return true;
}
return false;
}
public void remove(int index) {
indexCheck(index);
// 길이가 하나작은 배열 생성
Object[] arrayNew = new Object[this.size - 1];
// 움직일 필요없는 값 담기
for (int i = 0; i < index; i++) {
arrayNew[i] = array[i];
}
// 하나의 값이 삭제됨에 따라서, 앞으로 당겨서 옮겨주기
for (int i = array.length - 1; i > index; i--) {
arrayNew[i - 1] = array[i];
}
this.array = arrayNew;
this.size--;
}
//값을 모두 보여주기위해서 String으로 리턴
public String print() {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < size; i++) {
stringBuilder.append(array[i]).append('\n');
}
return stringBuilder.toString();
}
// 값 변경
public void set(int index, E e) {
indexCheck(index);
array[index] = e;
}
public int findIndex(E e) {
for (int i = 0; i < size; i++) {
if (e == array[i]) {
return i;
}
}
throw new NoSuchElementException();
}
public boolean contains(E e) {
int index = findIndex(e);
if (index != -1) {
return true;
}
return false;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof MyArrayList)) return false;
MyArrayList<?> that = (MyArrayList<?>) o;
return size == that.size && Arrays.equals(array, that.array);
}
@Override
public int hashCode() {
int result = Objects.hash(size);
result = 31 * result + Arrays.hashCode(array);
return result;
}
// 범위 내의 인덱스인지 확인
private void indexCheck(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
}
// 배열 사이즈 증가 (10씩 증가시킴)
private void extendSize() {
this.array = Arrays.copyOf(array, array.length + DEFAULT_SIZE);
}
}
제가 만든 코드와 자바의 LinkedList의 메서드와 작동 방식은 차이가 있습니다. 단순히 구조를 파악하기 위한 코드입니다.
실제 자바의 LinkedList는 Doubly LinkedList로 구현되어 있습니다.
last 만을 가지고 있음으로써, 끝에 노드를 추가, 삭제를 간편하게 하고자 하는 기능만 있다.public class Node<E> {
E e;
Node<E> next;
public Node(E e) {
this.e = e;
this.next = null;
}
public E getE() {
return e;
}
public Node<E> getNext() {
return next;
}
}
import java.util.NoSuchElementException;
public class MyLinkedList<E> {
private Node first;
private Node last; // 맨 뒤에 새로 추가하는 것을 편하게 하기 위함
private int size;
public MyLinkedList() {
this.first = null;
this.last = null;
this.size = 0;
}
// 맨 앞에 넣기
public void addFirst(E e) {
Node node = new Node(e);
node.next = first;
first = node;
if (size == 0) {
last = first;
}
size++;
}
// 맨 뒤에 넣기
public void add(E e) {
if (size == 0) {
addFirst(e);
return;
}
Node node = new Node(e);
last.next = node;
last = node;
size++;
}
// 인덱스를 찾아서 넣기
public void add(int index, E e) {
if (index == 0) {
addFirst(e);
return;
}
Node newNode = new Node(e);
Node previousNode = findNode(index - 1);
Node currentNode = previousNode.next;
previousNode.next = newNode;
newNode.next = currentNode;
size++;
}
public int size() {
return this.size;
}
//get과 같음
public Node findNode(int index) {
indexCheck(index);
Node node = first;
for (int i = 0; i < index; i++) {
node = node.next;
}
return node;
}
public void removeLast() {
if (size == 1) {
first = null;
last = null;
size--;
return;
}
if (size == 0) {
throw new NoSuchElementException();
}
Node node = findNode(size - 2);
node.next = null;
last = node;
size--;
}
public void removeFirst() {
if (size == 0) {
throw new NoSuchElementException();
}
first = first.next;
size--;
}
public void remove(int index) {
indexCheck(index);
if (index == 0) {
removeFirst();
return;
}
Node node = findNode(index - 1);
Node targetNode = node.next;
node.next = targetNode.next;
size--;
}
private void indexCheck(int index) {
if (index >= size || index < 0) {
throw new IndexOutOfBoundsException();
}
}
}
개인 정리이므로 틀린 부분이 있을 수 있습니다. 틀린 부분이 있다면 알려주시면 감사하겠습니다.