저장소 : GitHub Repositories leeconomy1121/java-study
ArrayList vs LinkedList
List Interface(리스트 인터페이스)
상황에 따라 ArrayList -> LinkedList 바꿔도 이상없음.
일반적인 순서대로 입력은 ArrayList가 2배 더 빠름
특정 인덱스 번호에 입력이나 제거는 LikedList가 훨씬 더 빠름
App class
package list_Interface;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class App {
public static void main(String[] args) {
// List Interface
List<Integer> list1 = new ArrayList<>();
List<Integer> list2 = new LinkedList<>();
// ArrayList
list1.add(5);
list1.add(7);
list1.add(8);
// LikedList
list2.add(1);
list2.add(2);
list2.add(3);
displayList(list1); // 콘솔에 입력된 리스트 타입 객체의 아이템들을 출력
System.out.println();
displayList(list2);
System.out.println();
List<Integer> list3 = new ArrayList<>();
list3.addAll(list1);
list3.addAll(list2);
displayList(list3);
}
/**
* 입력된 리스트 타입 객체의 아이템들을 출력
* @param list
*/
private static void displayList(List<Integer> list) {
// list.forEach(System.out::println);
for(int i : list) {
System.out.println(i);
}
}
}
결과
instanceof
객체의 타입을 판별해서 클래스의 객체가 맞으면 true, 아니면 false
equals
객체가 같은지 비교하는 메소드 같으면 true, 아니면 false
remove()
리스트의 객체를 삭제하는 메소드
JAVA Collection
다수의 데이터를 쉽고 효율적으로 처리할 수있는 방법을 제공하는 클래스의 집합체, 인터페이스를 의미
💡 Collection은 용도에 따라 크게 List,Set,Map 3가지 인터페이스로 분류되어 사용된다.
🔎List형
순서가 있는 데이터의 집합, 데이터 중복 O
1.LinkedList
양방향 포인터 구조
데이터의 삽입, 삭제가 빈번할 경우 데이터의 위치정보만 수정하면 되기에 유용
2.ArrayList
단방향 포인터 구조
데이터마다 Index가 존재해 데이터 조회 기능 우수
3.Vector
과거 데이터 대용량 처리를 위해 사용, 상대적으로 성능이 좋지 않아 잘 쓰이지 않음
🔎Set형
순서가 없는 데이터의 집합, 데이터 중복 X
1.HashSet
데이터를 hash table에 저장, Set 중에 가장 성능이 좋음
2.TreeSet
저장된 데이터의 값에 따라 정렬, 레드-블랙 트리(Red-Black Tree) 사용
🔎Map형
KEY-VALUE, 키와 값의 쌍으로 이루어진 데이터의 집합,
순서가 없고, 키 중복 X, 데이터 중복 O
💡 동일한 키를 가진 객체를 저장하려 한다면, 기존 값은 사라지고 새로운 값으로 대치된다.
1.HashMap
대표적으로 많이 사용되는 Map collection
데이터를 Array의 형태로 저장
KEY로 사용할 객체는 hashCode()와 equals() 메서드를 오버라이드해서 동등 객체가 될 조건을 정의 해야함
💡 동일 키 조건 : hashCode() 값이 같고, equals() 메서드가 true를 반환
2.TreeMap
데이터를 Binary search tree의 형태로 저장
KEY 값을 기준으로 데이터정렬
3.HashTable
HashMap과 내부 구조 동일
동기화된 메서드로 구성되므로, 스레드에 안전(thread safe)
List, Set 차이점
List : 중복을 허용한다.
리스트의 아이템 입력, 제거가 중간에 자주 받는다 : LinkedList
리스트의 아이템 입력, 제거가 끝에 받는다 : ArrayList
Set : 중복을 허용하지 않는다.
정렬이 필요하다 : TreeSet, LinkedHashSet
정렬이 필요하지 않다 : HashSet
예제 1, 예제 2
예제 1
Split_String class
package example;
public class Split_String {
public static void main(String[] args) {
// split() 문자열 쪼개서 배열로 리턴
String text1 = "(CNN)As the world learns more about the Omicron coronavirus variant and Delta continues to cause Covid-19 cases to rise around much of the United States, the need for booster shots becomes clearer than ever -- !even./ beyond the growing data about waning vaccine immunity.";
String text2 = "[서울경제] 한국핀테크지원센터(이사장 변영한)와 한국핀테크산업협회(협회장 류영준)는 ’21.12.3.(금), 메타버스에서 개최한 2021 핀테크인의 밤에 600여 명이 참여했으며, 변영한 이사장의 개회사를 시작으로 강연과 네트워킹 등이 90분간 진행되었다고 밝혔다.";
// String[] words = text1.split("[^a-zA-Z]+"); // 정규표현식 영문 철자를 제외한 특수문자 스페이스, 점, 슬래시 같은 것들을 제외하고 단어만 리턴
String[] words = text2.split("[^가-힣]+");
for(String w : words) {
if(w.length() < 3) { // 철자가 2개 이하는 제외
continue;
}
System.out.println(w.toLowerCase()); // 소문자로 변환해서 출력
}
}
}
결과
example 2
Book_wordSet class
package example;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.TreeSet;
public class Book_wordSet {
public static void main(String[] args) {
// 책 전체 내용을 읽어서 단어로 분리해 리스트에 넣기
// 이때 리스트는 단어가 중복되지 않는다. 알파벳순으로 저장 => TreeSet
File gatsby = new File("The Great Gatsby.txt");
// C:\JAVA\java-study\CH22_CollectionsAPI\The Great Gatsby.txt
System.out.println(gatsby.exists()); // 파일이 있는지 확인
TreeSet<String> gatsList = loadwords(gatsby);
System.out.println(gatsList.size());
for(String w : gatsList) {
System.out.println(w);
}
}
/**
* 입력된 파일을 읽어서 단어를 저장해 마지막에 TreeSet List로 리턴
* @param gatsby
* @return
*/
private static TreeSet<String> loadwords(File gatsby) {
TreeSet<String> wordSet = new TreeSet<>();
// 파일 읽기
try (BufferedReader reader = new BufferedReader(new FileReader(gatsby))){
String line = null;
// 한줄 읽기
while((line = reader.readLine()) != null) { // 파일의 끝에 더 이상 문자가 없으면 null
String[] words = line.split("[^a-zA-Z]+");
// TreeSet에 단어로 분리해서 입력한다. (자동 정렬 및 중복 제거)
for(String w : words) {
if(w.length() < 6) {
continue;
}
wordSet.add(w.toLowerCase()); // 소문자로 단어 입력
}
}
} catch (FileNotFoundException e) {
System.out.println("파일을 찾지 못함 : ");
} catch (IOException e) {
System.out.println("파일을 읽지 못함 : ");
}
return wordSet;
}
}
결과
캡쳐사진으로 결과값이 다 보이진 않지만 실제 창에는 스크롤 내리면 리스트의 단어들이 다 출력됨