Map 컬렉션의 특징 및 주요 메소드

특징

키(key)와 값(value)로 구성된 Map.Entry 객체를 저장하는 구조

키와 값은 모두 객체

키는 중복될 수 없지만 값은 중복 저장 가능

구현클래스

HashMap,    Hashtable,    LinkedHashMap,    Properties,    TreeMap

기능 

메소드 

설명 

객체

추가 

  V put(K key, V value) 

  주어진 키와 값을 추가, 저장이 되면 값을 리턴 

객체

검색 

 boolean containsKey(Object key)

   주어진 키가 있는지 여부

  boolean containsValue(Object value) 

  주어진 값이 있는지 여부 

  Set<Map.Entry<K,V>> entrySet() 

  키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아서 리턴 

  V get(Object key) 

  주어진 키의 값을 리턴 

  boolean isEmpty() 

  컬렉션이 비어있는지 여부 

  Set<K> keySet() 

  모든 키를 Set 객체에 담아서 리턴

  int size() 

  저장된 키의 총 수를 리턴 

  Collection<V> values() 

  저장된 모든 값 Collection에 담아서 리턴 

 객체

삭제

  void clear() 

  모든 Map.Entry(키와 값)를 삭제 

  V remove(Object key) 

   주어진 키와 일치하는 Map.Entry 삭제, 

  삭제가 되면 값을 리턴



객체 추가, 찾기 삭제

Map<String, Integer> map = ~ ;
map.put ("김나박", 30);           //객체추가
int score = map.get("홍길동")  //객체 찾기
map.remove("홍길동")             //객체 삭제

전체 객체를 대상으로 반복해서 얻기

Map<K,V> map = ~ ;

Set<K> keySet = map.keySet();

Iterator<K> keyIterator = keySet.iterator();


while(keyIterator.hasNext()){

K Key = key.Iterator.next();

V value = map.get(key);

}




Set<Map.Entry<K,V> entrySet = map.entrySet();

Iterator<Map.Entry<K.V>> entryIterator = entrySet.iterator();


while(entryIterator.hasNext()){

Map.Entry<K, V> entry = entryIterator.next();

K key = entry.getKey();

V value = entry.getValue();

}



HashMap

특징

키 객체는 hashCode()와 equals()를 재정의해서 동등 객체가 될 조건을 정해야 한다.

키 타입은 String를 많이 사용

String은 문자열이 같을 경우 동등 객체가 될수 있도록
hashCode()와 equals() 메소드가 재정의 되어 있기 때문

Exam

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class HashMapExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();

map.put("김나박", 85);
map.put("김범수", 90); //중복저장 키가 같음
map.put("박정현", 80);
map.put("김범수", 95); //중복저장 키가 같음 새로운 값으로 대체

System.out.println("총 Entry 수 " + map.size());
System.out.println(map.get("김범수"));

System.out.println();

Set<String> keySet = map.keySet();
Iterator<String> keyIterator = keySet.iterator();

while (keyIterator.hasNext()) {
String key = keyIterator.next();
Integer value = map.get(key);
System.out.println("\t" + key + ":" + value);
}
System.out.println();

map.remove("김범수");
System.out.println("총 Entry 수 : " + map.size());

Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
Iterator<Map.Entry<String, Integer>> entryIterator = entrySet.iterator();
while (entryIterator.hasNext()) {
Map.Entry<String, Integer> entry = entryIterator.next();
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println("\t" + key + ": " + value);
}
map.clear(); // 전체 삭제
System.out.println("총 Entry 수 : " + map.size());
}
} 결과 총 Entry 수 3 95 김범수:95 김나박:85 박정현:80 총 Entry 수 : 2 김나박: 85 박정현: 80 총 Entry 수 : 0

Exam2

public class Student {
public int sno;
public String name;

public Student(int sno, String name) {
this.sno = sno;
this.name = name;
}

@Override
public boolean equals(Object obj) {
if (obj instanceof Student) {
Student student = (Student) obj;
return sno == student.sno && name.equals(student.name);
} else {
return false;
}
}

@Override
public int hashCode() {
return sno + name.hashCode();
}
}
import java.util.HashMap;
import java.util.Map;

public class HashMapExample2 {
public static void main(String[] args) {
Map<Student, Integer> map = new HashMap<>();

map.put(new Student(1, "김나박"), 95);
map.put(new Student(1, "김나박"), 90);

System.out.println("총 Entry 수 : " + map.size());

System.out.println(map.get(new Student(1,"김나박")));

}
}



Hashtable

특징

키 객체는 hashCode()와 equals() 를 재정의해서 동등 객체가 될 조건을 정해야 한다.

Hashtable은 스레드 동기화(synchronization)가 되어 있기때문에

복수의 스레드가 동시에 Hashtable에 접근해서 객체를 추가, 삭제하더라도 스레드에 안전(thread safe)하다. 


Exam 

import java.util.Hashtable;
import java.util.Map;
import java.util.Scanner;

public class HashtableExample {
public static void main(String[] args) {
Map<String, String> map = new Hashtable<>();
map.put("spring", "12");
map.put("summer", "123");
map.put("fall", "1234");
map.put("winter", "12345");

Scanner scanner = new Scanner(System.in);

while (true) {
System.out.println("아이디와 비밀번호를 입력해 주세요");
System.out.print("아이디: ");
String id = scanner.nextLine();

System.out.print("비밀번호: ");
String password = scanner.nextLine();
System.out.println();

if (map.containsKey(id)) {
if (map.get(id).equals(password)) {
System.out.println("로그인 되었습니다.");
break;
} else {
System.out.println("비밀번호가 틀렸습니다.");
}
} else {
System.out.println("아이디가 존재하지 않습니다.");
}
}
}
} 결과 아이디와 비밀번호를 입력해 주세요 아이디: spring 비밀번호: 13 비밀번호가 틀렸습니다. 아이디와 비밀번호를 입력해 주세요 아이디: spring2 비밀번호: 13 아이디가 존재하지 않습니다. 아이디와 비밀번호를 입력해 주세요 아이디: spring 비밀번호: 12 로그인 되었습니다.



Properties

특징

키와 값을 String 타입으로 제한한 Map 컬렉션이다.

Properties는 프로퍼트(~.properties) 파일을 읽어 들일 때 주로 사용한다.


프로퍼티(~.properties) 파일

옵션 정보, 데이터베이스 연결 정보,  국제화(다국어) 정보를 기록한 텍스트 파일로 활용

애플리케이션에서 주로 변경이 잦은 문자열을 저장해서 유지 보수를 편하게 만들어줌

database.properties       키 = 값으로 구성된 프로퍼티

driver = oracle.jdbc.OracleDriver
url = jdbc:oracle:thin@localhost:1521:orcl
username = scott
password = tiger


키와 값이 = 기호로 연결되어 있는 텍스트 파일로 ISO 8859-1 문자셋으로 저장

한글은 유니코드(Unicode)로 변환되어 저장

contry = 대한민국  X          ->   contry = \xB300\xD55C\xBBFC\xAD6D


Properties 객체 생성

파일 시스템 경로를 이용

Properties properties = new Properties();
properties.load(new FileReader("C:/~/database.properties"));    ----------  파일의 경로


ClassPath를 이용

String path = 클래스.class.getResource("database.properties").getPath();    
path = URLDecoder.decode(path, "utf-8");      -------------      경로에 한글이 있을 경우
Properties properties = new Properties();
properties.load(new FileReader(path));

String path = A.class.getResource("config/database.properties").getPath();

값 읽기

String value = properties.getProperty("key");



Exam

import java.io.FileReader;
import java.net.URLDecoder;
import java.util.Properties;

public class PropertiesExample {
public static void main(String[] args) throws Exception {
Properties properties = new Properties();

String path = PropertiesExample.class.getResource("database.properties").getPath();

path = URLDecoder.decode(path, "utf-8"); //한글이 있을수 있으니 디코더사용
properties.load(new FileReader(path));

String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
String username = properties.getProperty("username");
String password = properties.getProperty("password");
System.out.println("driver = " + driver);
System.out.println("url = " + url);
System.out.println("username = " + username);
System.out.println("password = " + password);
}


Set  컬렉션의 특징 및 주요 메소드

 특징

수학의 집합에 비유될 수 있다.

저장 순서가 유지되지 않는다.

객체를 중복해서 저장할 수 없고, 하나의   null만 저장할 수 있다.

구현 클래스

HashSet,    LinkedHashSet,    TreeSet

주요 메소드

기능 

메소드 

설명 

객체

 추가 

  boolean add(E e) 

  주어진 객체를 저장, 객체가 성공적으로 저장되면
  true를 리턴하고 중복 객체면 fasle 를 리턴 

객체

 검색

  boolean contains(Object o) 

  주어진 객체가 저장되어 있는지 여부 

  isEmpty() 

  컬렉션이 비어 있는지 조사 

  Iterator<E> iterator() 

  저장된 객체를 한번씩 가져오는 반복자 리턴 

  int size() 

  저장되어 있는 전체 객체수 리턴 

객체

 삭제 

  void clear() 

  저장된 모든 객체를 삭제 

  boolean remove(Object o )

  주어진 객체를 삭제 



객체 추가 및 삭제

Set<String> set = ...;
set.add("홍길동");          객체추가
set.add("김나박");            객체 추가
set.remove("홍길동");     객체 삭제

Set 컬렉션은 인덱스로 객체를 검색해서 가져오는 메소드가 없다.

대신, 전체 객체를 대상으로 한번씩 반복해서 가져오는 반복자(Iterator)를 제공한다.

Set<String> set  = ...;

Iterator<String> iterator = set.iterator();


리턴타입 

메소드명 

설명 

boolean 

  hasNext() 

  가져올 객체가 있으면 true를 반환하고 없으면  false를 반환한다. 

 E

  next() 

   컬렉션에서 하나의 객체를 가져온다.

void 

  remove() 

  Set 컬렉션에서 객체를 제거한다. 



Set<String> set = ...;

Iterator<String> iterator = set.iterator();                                                                    

while(iterator.hasNext()){

//String 객체를 하나 가져옴

String str= iterator.next();

}   저장된 객체 수 만큼 루핑한다. 

    == 

Set<String set = ...;


for(String str : set) {



반복자를 통한 객체 제거

while(iterator.hasNext()){

String str= iterator.next();

if(str.equals("홍길동")){

iterator.remove();

}

}




HashSet

특징

동일 객체 및 동등 객체는 중복 저장하지 않는다.

동등 객체 판단 방법


Exam1

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class HashSetExample1 {
public static void main(String[] args) {
Set<String> set = new HashSet<>();

set.add("Java");
set.add("JDBC");
set.add("Servlet/JSP");
set.add("Java"); //같은 객체이기 떄문에 저장이 안됨
set.add("iBATIS");

int size = set.size();
System.out.println("총 객체수: " + size);

Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println("\t" + element);
}

set.remove("JDBC");
set.remove("iBATIS");

System.out.println("총 객체수: " + set.size());

for (String element : set) {
System.out.println("\t" + element);
}

set.clear();
if (set.isEmpty()) {
System.out.println("비어 있습니다.");
} else {
System.out.println("비어 있지 않습니다.");
}
}
} 결과 총 객체수: 4 Java JDBC Servlet/JSP iBATIS 총 객체수: 2 Java Servlet/JSP 비어 있습니다.

Exam2

public class Member {
public String name;
public int age;

public Member(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public boolean equals(Object obj) {
if (obj instanceof Member) {
Member member = (Member) obj;
return member.name.equals(name) && member.age == age;
} else {
return false;
}
}

@Override
public int hashCode() {
return name.hashCode() + age;
}
}
import java.util.HashSet;
import java.util.Set;

public class HashSetExample2 {
public static void main(String[] args) {
Set<Member> set = new HashSet<>();

set.add(new Member("김나박", 30));
set.add(new Member("김나박", 30));
// Member클래스의  hashCode()와 equals()를 재정의해서 동등한객체를 만들어 줌으로써
// 동등한 객체.. 때문에 1개의 객체만 저장이됨

System.out.println("총 객체수" + set.size());
}
} //결과 총 객체수1


List 컬렉션의 특징 및 주요 메소드

특징

인덱스로 관리

중복해서 객체 저장 기능

구현 클래스

ArrayList

Vector

LinkedList

주요 메소드


 기능

메소드 

설명 

객체

추가

 

boolean add(E e) 

  주어진 객체를 맨 끝에 추가 

void add(int index, E element) 

  주어진 인덱스에 객체를 추가 

set(int index, E element) 

  주어진 인덱스에 저장된 객체를 주어진 객체로 바꿈 

객체

검색 

boolean contains(Object o)

  주어진 객체가 저장되어 있는지 여부 

E get(int index)     *

  주어진 인덱스에 저장된 객체를 리턴 

isEmpty() 

  컬렉션이 비어 있는지 조사 

int size()     *

  저장되어있는 전체 객체수를 리턴 

객체

삭제 

void clear() 

  저장된 모든 객체를 삭제 

E remove(int index) 

  주어진 인덱스에 저장된 객체를 삭제 

boolean remove(Object o)  

  주어진 객체를 삭제 



객체 추가, 찾기, 삭제

Exam

import java.util.ArrayList;
import java.util.List;

public class test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("김나박"); //맨끝에 객체 추가
list.add("박효신"); //맨끝에 객체 추가
list.add(0, "홍길동"); //저장된 인덱스에 객체 삽입
String index1 = list.get(1); //인덱스로 객체 찾기
System.out.println("index1 = " + index1); //출력
System.out.println(); //공백

//list를 반복하며 객체를 꺼내서 출력
for (int i = 0; i < list.size(); i++) {
System.out.println("list.get(" + i + ") = " + list.get(i));
}
System.out.println(list.size()); //리스트의 사이즈
System.out.println(); //공백

list.remove(0); //인덱스로 객체삭제
list.remove("김나박"); // 객체 삭제

//list를 반복하며 객체를 꺼내서 출력
for (int i = 0; i < list.size(); i++) {
System.out.println("list.get(" + i + ") = " + list.get(i));
}
System.out.println(list.size()); //리스트의 사이즈
}
}

//결과

index1 = 김나박 list.get(0) = 홍길동 list.get(1) = 김나박 list.get(2) = 박효신 3 list.get(0) = 박효신 1



ArrayList

List<E> list = new ArrayList<E>();
 E = 타입 파라미터 

기본적으로 10개의 저장할 수 있는  내부 배열 생성

 1

 2

10 

 

 

 

 

 

 

 

 

 

 



저장 용량 (capacity)

초기 : 10

초기 용량 지정 가능            List<E> list = new ArrayList<E>(30);        30개의 배열

저장 용량을 초과한 객체들이 들어오면 자동적으로 늘어난다.

객체 제거

바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨진다.

0

  2

1번 삭제시->

0

 1

 

 

 

 

 



Exam

import java.util.ArrayList;
import java.util.List;

public class ArrayListExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();

list.add("Java");
list.add("JDBC");
list.add("Servlet/JSP");
list.add(2, "DataBase");
list.add("iBATIS");
int size = list.size();
System.out.println("총 객체수 = " + size);
System.out.println();

String skill = list.get(2);
System.out.println("2: " + skill);
System.out.println();

for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
System.out.println(i + ": " + str);
}
System.out.println();


list.remove(2); //삭제
list.remove(2); //삭제
list.remove("iBATIS"); //삭제
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
System.out.println(i + ": " + str);
}
System.out.println();
}
} 결과 총 객체수 = 5 2: DataBase 0: Java 1: JDBC 2: DataBase 3: Servlet/JSP 4: iBATIS 0: Java 1: JDBC


고정된 객체들로 구성된 List 생성

List<T> list = Arrays.asList(T... a);

Exam

import java.util.Arrays;
import java.util.List;

public class ArraysAsListExample {
public static void main(String[] args) {

List<String> list1 = Arrays.asList("김나박", "김범수", "박효신");
for (String name : list1) {
System.out.println("name = " + name);
}

List<Integer> list2 = Arrays.asList(new Integer(1), 2, 3);
for (int value : list2) {
System.out.println("value = " + value);
}
}
} 결과 name = 김나박 name = 김범수 name = 박효신 integer = 1 integer = 2 integer = 3


Vector

List<E> list = new Vector<E>();

특징

Vector는 스레드 동기화(synchronization)가 되어 있기 때문에 

복수의 스레드가 동시에 Vecctor에 접근해서 객체를 추가, 삭제하더라도 스레드에 안전(thread safe)하다.


Arrays List =    public boolean add(...) { ... }
                        vs 
Vector       =  public sysnchronized boolean add( ... ) { ... }                         Thread의 동기화불록 참고


Exam

import java.util.List;
import java.util.Vector;

public class VectorExample {
public static void main(String[] args) {
List<Board> list = new Vector<>();

list.add(new Board("제목1", "내용1", "글쓴이1"));
list.add(new Board("제목2", "내용2", "글쓴이2"));
list.add(new Board("제목3", "내용3", "글쓴이3"));
list.add(new Board("제목4", "내용4", "글쓴이4"));
list.add(new Board("제목5", "내용5", "글쓴이5"));

list.remove(2);
list.remove(3);

for (int i = 0; i < list.size(); i++) {
Board board = list.get(i);
System.out.println(board.subject + "\t" + board.content + "\t" + board.writer);
}
}
} 결과 제목1 내용1 글쓴이1 제목2 내용2 글쓴이2 제목4 내용4 글쓴이4


LinkedList

    List<E> list = new LinkedList<E>();

특징

인접 참조를 링크해서 체인처럼 관리

특정 인덱스에서 객체를 제거하거나 추가하게 되면 바로 앞뒤 링크만 변경

빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList보다 좋은 성능 발휘

Exam

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<>();
List<String > list2 = new LinkedList<>();

long startTime;
long endTime;

//특정위치에 데이터를 10000번 삽입시간 차이
//ArrayList
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");

//LinkedList
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");
} }

결과
ArrayList 걸린 시간: 22325130 ns LinkedList 걸린 시간: 3664420 ns



+ Recent posts