자료구조를 바탕으로 객체를 효율적으로 추가, 삭제, 검색할 수 있도록 제공되는 컬렉션 라이브러리
<E>
add()
get()
remove()
📌 배열과 달리 저장 용량을 초과한 객체가 들어오면 저장 용량이 자동으로 늘어난다!!
// ArrayList 사용 예시
import java.util.ArrayList;
public class ArrayListExample {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>(); // 2. generic을 사용한다. <String> 제네릭을 사용하면 배열의 타입도 String이 된다.
list.add("hong");
list.add("gil");
list.add("dong");
//String str = list.get(0); // 1. 매번 casting을 해줘야 해서
// for(int i=0; i<list.size(); i++) {
// System.out.println(list.get(i));
// }
//System.out.println(str);
// 향상된 for문 사용에 최적화되어 있음
for( String name : list ) {
System.out.println(name);
}
list.remove(0);
System.out.println();
for(String name : list) {
System.out.println(name);
}
list.remove("dong");
System.out.println();
for(String name : list) {
System.out.println(name);
}
}
}
ArrayList
와 동일한 구조📌 차이점: 동기화된 메소드로 구성되어 있어서 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제 가능!
➡ 스레드가 안전하다
public class Korean {
String juminNo;
String name;
String addr;
public Korean(String juminNo, String name, String addr) {}
}
import java.util.ArrayList;
import java.util.List;
public class ArrayListObjExample {
public static void main(String[] args) {
List<Korean> kors = new ArrayList<Korean>();
Korean k = new Korean("121212", "park", "seoul");
kors.add(k);
kors.add(new Korean("131313", "lee", "incheon"));
kors.add(new Korean("141414", "song", "busan"));
kors.add(new Korean("121212", "park", "seoul"));
kors.remove(k);
}
}
📌 인접 참조를 링크해서 체인처럼 관리
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class LinkedListExample {
public static void main(String[] args) {
List<String> list1 = new ArrayList<String>();
List<String> list2 = new LinkedList<String>();
long startTime;
long endTime;
startTime = System.nanoTime();
for(int i=0; i<10000; i++) {
list1.add(0, String.valueOf(i));
}
endTime = System.nanoTime();
System.out.println("ArrayList 걸린 시간: " + (endTime-startTime) + " ns");
startTime = System.nanoTime();
for(int i=0; i<10000; i++) {
list2.add(0, String.valueOf(i));
}
endTime = System.nanoTime();
System.out.println("LinkedList 걸린 시간: " + (endTime-startTime) + " ns");
startTime = System.nanoTime();
list1.get(list1.size()-1);
endTime = System.nanoTime();
System.out.println("ArrayList 걸린 시간: " + (endTime-startTime) + " ns");
startTime = System.nanoTime();
list2.get(list2.size()-1);
endTime = System.nanoTime();
System.out.println("LinkedList 걸린 시간: " + (endTime-startTime) + " ns");
}
}
// RESULT!
//ArrayList 걸린 시간: 14641500 ns
//LinkedList 걸린 시간: 6516200 ns
//ArrayList 걸린 시간: 135100 ns
//LinkedList 걸린 시간: 36800 ns
ArrayList
보다 좋은 성능 발휘iterator()
메소드)를 제공!add()
remove()
hasNext()
: 가져올 객체가 있으면 true
, 없으면 false
반환next()
: hasNext()
에서 true
가 반환됐을 때 사용hashCode()
와 equals()
의 리턴값으로 판별public class Member {
public String name;
public int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
// 같은 데이터 값이 중복으로 들어가는 것을 판별해 주는 코드
public boolean equals(Object obj) {
if(obj instanceof Member) {
Member member = (Member) obj;
return member.name.equals(name) && (member.age==age) ;
} else {
return false;
}
}
public int hashCode() {
return name.hashCode() + age;
}
}
import java.util.HashSet;
public class HashSetExample2 {
public static void main(String[] args) {
HashSet<Member> mems = new HashSet<Member>();
Member mem1 = new Member("hong", 20);
Member mem2 = new Member("hong", 20);
Member mem3 = new Member("hong", 30);
Member mem4 = new Member("park", 20);
mems.add(mem1);
mems.add(mem2);
mems.add(mem3);
mems.add(mem4);
for(Member m : mems) {
System.out.println(m.name);
}
}
}
import java.util.TreeSet;
public class TreeSetExample {
public static void main(String[] args) {
TreeSet<Integer> ts = new TreeSet<Integer>(); // Integer는 int(기본변수)를 클래스화 시켜주는(boxing) 레퍼런스 클래스
ts.add(10);
ts.add(5);
ts.add(7);
ts.add(20);
// 정렬되어서 순서대로 출력해줌
for(int n : ts) {
System.out.println(n);
}
}
}
put()
get()
remove()
keySet()
메소드로 전체 키를 Set 컬렉션으로 얻음 ➡ 반복자(Iterator
)를 사용해 키를 하나씩 얻음 ➡ get()
메소드로 값을 얻음entrySet()
메소드로 모든 Map.Entry를 Set 컬렉션으로 얻음 ➡ 반복자를 통해 Map.Entry를 하나씩 얻음 ➡ getKey()
와 getValue()
메소드로 키와 값을 얻음hashCode()
와 equals()
메소드를 재정의해서 동등 객체 조건을 지정해야 한다.public class HashMapExample {
public static void main(String[] args) {
HashMap<Integer, String> hm = new HashMap<Integer, String>();
//Map<Integer, String> map = Collections.synchronizedMap(hm); // 수동으로 동기화
hm.put(100, "hong");
hm.put(101, "park");
hm.put(103, "choi");
System.out.println(hm.get(103));
Set<Integer> kset = hm.keySet(); // keySet(): key를 set객체에 담아서 리턴
for(int k : kset) {
System.out.println(k);
}
Set<Map.Entry<Integer, String>> eset = hm.entrySet();
Iterator<Map.Entry<Integer, String>> sit = eset.iterator();
while(sit.hasNext()) {
Map.Entry<Integer, String> entry = sit.next();
Integer key = entry.getKey(); // key값 가져오기
String value = entry.getValue(); // value값 가져오기
System.out.println(key + ":" + value);
}
System.out.println();
// 실제로 많이 쓰이는 것은 key에서 value를 찾아내는 것
for (String value : hm.values()) {
System.out.println(value);
}
}
}
hashCode()
와 equals()
메소드를 재정의해서 동등 객체 조건을 지정해야 한다.synchronized
) 메소드로 구성되어 있어서 멀티 스레드 환경에서 안전하다load()
메소드 호출load()
메소드는 FileReader
객체를 매개값으로 받는다.public class PropertiesExample {
public static void main(String[] args) throws IOException {
Properties prop = new Properties();
prop.setProperty("driver", "oracle.jdbc.OracleDriver");
prop.setProperty("url", "jdbc:oracle:thin:@localhost:1521:xe");
prop.setProperty("username", "hr");
prop.setProperty("password", "hr");
}
}
#database set
#Tue Feb 02 17:24:34 KST 2021
password=hr
driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
username=hr
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
public class PropertiesExample2 {
public static void main(String[] args) throws IOException {
Properties prop = new Properties();
prop.load(new FileReader("db.properties"));
String driver = prop.getProperty("driver");
String url = prop.getProperty("url");
String username = prop.getProperty("username");
String password = prop.getProperty("password");
System.out.println("driver: " + driver);
System.out.println("url: " + url);
System.out.println("username: " + username);
System.out.println("password: " + password);
}
}
descendingKeySet()
: 내림차순으로 정렬된 키의 NavigableSet
객체 리턴import java.util.TreeSet;
public class TreeSetExample {
public static void main(String[] args) {
TreeSet<Integer> ts = new TreeSet<Integer>(); // Integer는 int(기본변수)를 클래스화 시켜주는(boxing) 레퍼런스 클래스
ts.add(10);
ts.add(5);
ts.add(7);
ts.add(20);
// 정렬되어서 순서대로 출력해줌
for(int n : ts) {
System.out.println(n);
}
}
}
Map.Entry
를 저장descendingKeyMap()
: 내림차순으로 정렬된 NavigableMap
의 객체 리턴// 특정 Map.Entry를 찾는 예제와 정렬 메소드 사용 예제
import java.util.NavigableMap;
import java.util.TreeMap;
public class TreeMapExample1 {
public static void main(String[] args) {
TreeMap<Integer,String> scores = new TreeMap<Integer,String>();
scores.put(new Integer(87), "홍길동");
scores.put(new Integer(98), "이동수");
scores.put(new Integer(75), "박길순");
scores.put(new Integer(95), "신용권");
scores.put(new Integer(80), "김자바");
// Map.Entry<Integer, String> entry = null;
//
// entry = scores.firstEntry();
// System.out.println("가장 낮은 점수: " + entry.getKey() + "-" + entry.getValue());
//
// entry = scores.lastEntry();
// System.out.println("가장 높은 점수: " + entry.getKey() + "-" + entry.getValue() + "\n");
//
// entry = scores.lowerEntry(new Integer(95));
// System.out.println("95점 아래 점수: " + entry.getKey() + "-" + entry.getValue());
//
// entry = scores.higherEntry(new Integer(95));
// System.out.println("95점 위의 점수: " + entry.getKey() + "-" + entry.getValue() + "\n");
//
// entry = scores.floorEntry(new Integer(95));
// System.out.println("95점 이거나 바로 아래 점수: " + entry.getKey() + "-" + entry.getValue());
//
// entry = scores.ceilingEntry(new Integer(85));
// System.out.println("85점 이거나 바로 위의 점수: " + entry.getKey() + "-" + entry.getValue() + "\n");
//
// while(!scores.isEmpty()) {
// entry = scores.pollFirstEntry();
// System.out.println(entry.getKey() + "-" + entry.getValue() + "(남은 객체 수: " + scores.size() + ")");
// }
NavigableMap<Integer,String> dscores = scores.descendingMap();
for(Integer k : dscores.keySet()) {
System.out.println("key: " + k + ", value: " + dscores.get(k));
}
}
}
synchronizedXXX()
: 비동기화된 메소드를 동기화된 메소드로 래핑하는 Collections의 메소드