
선형으로 자료를 관리, 정해진 크기의 메모리를 먼저 할당받아 사용하고, 자료의 물리적 위치와 논리적 위치가 같다.
Array의 특징
선형으로 자료를 관리, 자료가 추가될 때마다 메모리를 할당 받고, 자료는 링크로 연결되며, 자료의 물리적 위치와
논리적 위치가 다를 수 있다.
LinkedList 특징
리스트에 자료 추가하기

리스트에 자료 삭제하기

가장 나중에 입력 된 자료가 가장 먼저 출력되는 자료 구조
(Last In First Out)
Stack의 특징

가장 먼저 입력된 자료가 가장 먼저 출력되는 자료 구조
(First In First Out)
Queue의 특징

부모 노드와 자식 노드간의 연결로 이루어진 자료 구조
Priority queue를 구현(우선 큐) -> 우선순위 큐는 우선순위가 높은 순으로 꺼내므로 힙을 이용해서 구현한다.
(최대힙이 부모노드가 자식노드보다 항상 크기때문에 반대인 최소힙으로도 가능)
부모노드에 자식노드가 두 개 이하인 트리


자료를 검색하기 위한 자료 구조, 검색을 위한 자료 구조이다.
키(key에 대한 자료를 검색하기 위한 사전(dictionary)개념의 자료 구조
key는 유일하고 이에 대한 value를 쌍으로 저장
index = h(key) : 해시 함수가 key에 대한 인덱스를 반환해주며 해당 인덱스 위치에 자료를 저장하거나 검색하게 된다.
저장되는 메모리 구조를 해시테이블이라 한다.
jdk 클래스 : HashMap,Properties

해시는 키에 대한 밸류가 있다.
키는 중복될 수 없고 키만 알면 밸류를 꺼낼 수 없다.
해시는 들어가는 순서와 상관이 없다. 해시펑션에 의해 정해져서 순서랑은 무관하다.

요소의 순회란
Iterator 사용하기
// Iterable 인터페이스
public interface Iterable<T> {
Iterator<T> iterator();
public static void main(String[] args) {
List<String> list = new LinkedList<>();
...
Iterator<String> itr = list.iterator();
...
// 반복자를 이용한 순차적 참조
while(itr.hasNext()) { // next 메소드가 반환할 대상이 있다면
str = itr.next(); // next 메소드를 호출한다.
if(str.equals("Box"));
itr.remove(); // next 메소드가 반환한 인스턴스 삭제
...
}
}
다음 두 가지 이유로 배열보다 ArrayList<E>가 더 좋다.
단, 배열처럼 선언과 동시에 초기화가 불가능한다.하지만 방법이 있다.
List<String> list = Arrays.asList("Toy","Robot","Box");
-> 인자로 전달된 인스턴스들을 저장한 컬렉션 인스턴스의 생성 및 반환
-> 이렇게 생성된 리스트 인스턴스는 Immutable 인스턴스이다.(변경 불가능)
하지만 이것도 방법이 있다.
public static void main(String[] args) {
List<String> list = Arrays.asList("Toy","Box","Robot","Box");
// 생성자 public ArraysList(Collection<? extends E> c)를 통한 인스턴스 생성
list = new ArrayList<>(list);
public ArraysList(Collection<? extends E> c) {...}
-> Collection<E>를 구현한 컬렉션 인스턴스를 인자로 전달받는다.
-> 그리고 E는 인스턴스 생성 과정에서 결정되므로 무엇이든 될 수 있다.
-> 덧붙여서 매개변수 c로 전달된 컬렉션 인스턴스에서는 참조만(꺼내기만) 가능하다.
public static void main(String[] args) {
List<String> list = Arrays.asList("Toy","Box","Robot","Box");
list = new ArraysList<>(list); // 배열 기반 리스트
...
//ArraysList<E> 인스턴스 기반으로 LinkedList<E> 인스턴스 생성
list = new LinkedList<>(list);
class ListIteratorCollection {
public static vod main(String[] args) {
List<String> list = Arrays.asList("Toy","Box","Robot","Box");
list = new ArrayList<>(list);
ListIterator<String> litr = list.listIterator();
// 양방향 반복자 획득
String str;
// 왼쪽에서 오른쪽으로 이동을 위한 반복문
while(litr.hasNext()){
str = litr.next();
System.out.print(str+'\t');
if(str.equals("Toy"))
litr.add("Toy2);
}
System.out.println();
// 오른쪽에서 왼쪽으로 이동을 위한 반복문
while(litr.hasPrevious()){
str = litr.previous();
System.out.print(str+'\t');
if(str.equals("Robot"))
litr.add("Robot2");
}
}
}
Set 인터페이스를 구현하는 제네릭 클래스의 특성 두가지는 다음과 같다.
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("Toy"); set.add("Box");
set.add("Robot"); set.add("Box");
System.out.println("인스턴스 수: "+set.size());
// 인스턴스 수: 3
그렇다면 동일 인스턴스의 기준은?
public boolean equals(Object obj)
Object 클래스의 equal 메소드 호출 결과를 근거로 동일 인스턴스를 판단한다.
public int hashCode()
그런데 그에 앞서 Object 클래스의 hashCode 메소드 호출 결과가 같아야 한다.
트리(Tree) 자료구조를 기반으로 인스턴스를 저장, 이는 정렬 상태가 유지되면서 인스턴스가 저장됨을 의미한다.
public static void main(String[] args) {
TreeSet<Integer> tree = new TreeSet<Integer>();
tree.add(3); tree.add(1);
tree.add(2); tree.add(4);
System.out.println("인스턴스 수: "+tree.size());
// 인스턴스 수: 3
//for-each문에 의한 반복
for(Integer n : tree)
System.out.print(n.toString()+'\t');
// 1 2 3 4
인스턴스의 비교 기준을 정의하는 것은 Comparable 인터페이스의 기준
class Person implements Comparable<Person> {
private String name;
private int age;
...
@Override
public int compareTo(Person p) {
return this.age-p.age;
}
}
따라서 TreeSet에 저장할 인스턴스들은 모두 Comparable 인터페이스를 구현한 클래스 인스턴스여야한다.
Comparator 인터페이스 기반으로 TreeSet 정렬 기준 제시하기
기존의 기준말고 새로운 정렬기준을 만들어 주는것이다.
class StringComparator implements Comparator<String> {
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
}
public static void main(String[] args) {
TreeSet<String> tree = new TreeSet<>(new StringComparator());
tree.add("Box");
tree.add("Rabbit");
tree.add("Robot");
for(String s : tree)
System.out.print(s.toString() + '\t');
//Box Robot Rabbit