import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ArrayListText {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> list = new ArrayList<>();
list.add("Milk");
list.add("Bread");
list.add("Butter");
list.add(1,"Apple");
list.set(2, "Grape");
list.remove(3);
for (String s:list) {
System.out.println(s);
}
System.out.println("------");
list.forEach(s->System.out.println(s));
System.out.println("------");
list.forEach(System.out::println);
System.out.println("------");
List<Integer>num = new ArrayList<Integer>();
num.add(1);
num.add(2);
num.add(3);
num.add(4);
Iterator<Integer>e = num.listIterator();
while (e.hasNext()) {
System.out.println(e.next());
}
}
}

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ArrayListText {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> list = new ArrayList<String>();
list.add("I");
list.add("Hate");
list.add("Her");
list.add(3,"Jacket");
list.remove(3);
list.set(1, "Love");
list.set(2, "You");
//for-each
for (String l : list) {
System.out.print(l);
System.out.print(" ");
}
System.out.println("");
//Iterator
Iterator<String> i = list.iterator();
while (i.hasNext()) {
System.out.print(i.next());
System.out.print(" ");
}
System.out.println("");
}
}코드를 입력하세요

for-each와 Iterator 두 개를 사용해봤을 때, 나에게는 Iterator를 사용하는것이 더 직관적으로 이해가 잘 되는 것 같다.
ArrayList에 직접 요소를 삭제하고 수정하고 추가해보면서 가변 크기를 가진 ArrayList의 특징을 직접 경험해보았다.
Q. ArrayList는 단방향리스트이고, LinkedList는 양방향 리스트인데, 요소를 추가/삭제하였을 때 단방향/양방향이 나타내는 차이는 뭘까?
A. ArrayList는 동적배열 -> 데이터가 꽉 찬 책장 중간에 새 책을 꽂는 것과 같음!
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Main {
public static <E> void show(Set<E> s) {
for(E e : s) System.out.print(e + " ");
System.out.println("\n--------------------");
Iterator<E> it = s.iterator();
while (it.hasNext()) {
System.out.print(it.next()+",");
}
System.out.println("\n---------------------");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Hello World");
Set<Integer> set1 = new HashSet<Integer>(Arrays.asList(1,2,3,4,5));
Set<Integer> set2 = new HashSet<Integer>(Arrays.asList(3,4,5,6,7));
Set<Integer> set3 = new HashSet<Integer>(Arrays.asList(5,6,7,8,9));
Set<Integer> set4 = new HashSet<Integer>(Arrays.asList(8,9,10,11,12));
Set<Integer> set5 = new HashSet<Integer>(Arrays.asList(1,2,3,4,5,6,7,8,9,10,11,12));
set1.addAll(set2);
set2.retainAll(set3);
set3.removeAll(set4);
set4.removeAll(set3);
set5.containsAll(set4);
show(set1);
show(set2);
show(set3);
show(set4);
show(set5);
}
}


import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class Main {
public static <K,V> void show(Map<K, V> map) {
System.out.println("----------------");
Set<K> keys = map.keySet(); //key 집합
System.out.println("Key:" + keys);
Collection<V> values = map.values(); //value collection
System.out.println("Values: "+values);
Set<Map.Entry<K, V>> entrySet = map.entrySet(); //key와 value집합
System.out.println("Key : Values");
System.out.println("---------------------");
for (Entry<K, V> entry : entrySet) {
System.out.println(entry.getKey() + ": "+entry.getValue());
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<Integer, String> map = new HashMap<Integer, String>();
for (int i = 0; i < 10; i++) {
map.put(i, "data#"+i);
}
System.out.println(map);
System.out.println("map.get(111): "+map.get(111));
map.put(111, "data#111");
map.remove(1);
map.remove(2);
map.put(3, "new_data#3");
System.out.println(map);
show(map);
}
}

Q. 왜 key는 Set으로 받고, value는 Collection으로 받을까?
key는 중복을 허용하지 않고(Set), value는 중복을 허용하기 때문(Collection)이다.
그 아래 entrySet 역시 키-값의 쌍은 전체 map 안에서 절대 중복되지 않기 때문에 EntrySet을 이용해 Set형태로 받는다.