Set은 데이터 저장 시 오름차순 정렬 처리가 이루어진다. (순서가 무시)
List는 작성 순서대로 저장된다. (순서가 보장)
//java5+ 제네릭<>를 안붙이면 object로 간주하여 오류가 뜬다.
Set<String> a = new TreeSet<String>();
List<String> b = new ArrayList<String>();
List 예시 1)
public class Test02 {
public static void main(String[] args) {
// 선형구조 : 시작과 끝이 존재하는 구조 (ArrayList, LinkedList)
List<String> a = new ArrayList<String>();
// 데이터가 시도때도 없이 변할 때 좋다.
// 데이터의 거리가 다소 멀기 때문에 속도가 느리다.
List<String> b = new LinkedList<String>();
//데이터 추가
a.add("마리오");
a.add("루이지");
a.add("쿠파");
System.out.println(a);
b.add("마리오");
b.add("루이지");
b.add("쿠파");
System.out.println(b);
//포함 검사
System.out.println(a.contains("피카츄"));
System.out.println(a.contains("마리오"));
//데이터 갯수 검사
System.out.println(a.size());
System.out.println(b.size());
//위치 검사
System.out.println(a.indexOf("피카츄"));
System.out.println(a.indexOf("루이지"));
//데이터 삭제
a.remove("마리오"); //마리오 데이터와 일치하는 항목을 삭제(나머지가 앞으로 이동)
b.remove(0); //0번 인덱스에 존재하는 항목을 삭제(나머지가 앞으로 이동)
System.out.println(a);
System.out.println(b);
}
}
List 예시 2)
어차피 전체를 처리할 생각이라면 인덱스를 생략하고 추출한 값을 담을 변수만 정의
Iterable을 상속 받은 클래스라면 모두 사용 가능한
전체를 출력할 때만 가능하다는 단점이 존재한다.
public class Test04 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(100); //int ----> Integer (자동포장, auto-boxing)
list.add(200);
list.add(300);
list.add(400);
list.add(500);
list.add(3, 600); //중간 삽입
for(int n : list) {
System.out.println(n);
}
System.out.println();
// .get(인덱스 번호)인덱스 번호의 데이터를 가져오기
for(int i = 0; i < list.size(); i++) { //Integer ----> int (자동포장해제, auto-unboxing)
System.out.println(list.get(i));
}
}
}
List 예시 3)
데이터가 고정이라면 간편 생성 명령으로 리스트 생성이 가능하다.
단, 이 방식으로 생성된 리스트는 불변(immutable)이다.
public class Test08 {
public static void main(String[] args) {
//생성, 가변
//List<Integer> list = new ArrayList<>();
//명령, 불변(Java 8+)
//List<Integer> list = Arrays.asList(10, 20, 30, 40, 50);
//불변(Java 9+)
//불변 : 주어진 데이터를 사용할 경우, list.add() 사용 불가
List<Integer> list = List.of(10, 20, 30, 40, 50);
//list.add(60); //error
for(int n : list) {
System.out.println(n);
}
}
}
비선형구조 : 시작이나 끝이 명확하지 않은 구조 (TreeSet, HashSet)
정해진 방식에 의해 데이터를 저장하며, 중복된 데이터가 없는 저장소이다.
주 목적은 전체를 빠르게 조회하는 것이다.
조회의 성능이 선형구조(ArrayList, LinkedList)의 비해 훨씬 빠르다.
TreeSet은 탐색의 특화 되어 있고, 데이터를 순서대로 출력하고 싶을 때 사용한다.
Hashset은 TreeSet보다 속도가 빠르다, 데이터의 순서가 상관 없을 때 사용한다.
public class Test04 {
public static void main(String[] args) {
//Set
//중복 제거된 데이터가 출력되기 때문에 List보다 집합 연산에서 훨씬 편리하다.
//데이터 준비
Set<String> galaxy = Set.of("통화" ,"문자", "게임", "영상통화", "삼성페이");
Set<String> iphone = Set.of("통화", "문자", "게임", "아이튠즈", "시리");
//합집합 : galaxy ∪ iphone - union
Set<String> union = new TreeSet<>();
union.addAll(galaxy);
union.addAll(iphone);
System.out.println(union);
//교집합 - 두 휴대폰이 가진 공통 기능 : galaxy ∩ iphone - intersection
Set<String> intersect = new TreeSet<>(galaxy);
intersect.retainAll(iphone); // 위에 new TreeSet<>(galaxy); 코드와 같은 것
System.out.println(intersect);
//차집합 - 어느 한 쪽 휴대폰만 가진 기능 : minus
//galaxy - iphone 또는 iphone - galaxy
Set<String> minus = new TreeSet<>(galaxy);
minus.removeAll(iphone);
System.out.println(minus);
}
}