728x90

ArrayList
- 배열 기반, 데이터의 추가와 삭제 유용하지 못함, 순차적인 추가 삭제는 제일 빠름, 인덱스가 있어 임의의 요소에 대한 접근성이 뛰어남.
- 대량의 자료를 추가/삭제하는 경우에 내부적인 처리량이 늘어나서 상당한 성능저하를 가져온다.
- 각 데이터의 인덱스를 가지고 있기 때문에, 필요한 데이터의 접근이 한번만에 가능하다.
  많은 데이터를 한 번에 다 가져와서 여러번 참조해 쓸 때 최상의 성능을 나타낸다.
- 레퍼런스 타입의 데이터만 저장할 수 있다.
- 데이터 내용의 중복이 가능하다. null값을 허용한다.

ArrayList<String> list = new ArrayList<String>();
list.add("apple")'; // 추가
String str = list.get(2); // 데이터 가져오기
list.remove(1); // 데이터 삭제
list.set(0, "오렌지"); // 데이터 수정
int index = list.indexOf("apple"); // 인덱스 알아내기


ArrayList<Calendar_Item> list = new ArrayList<Calendar_Item>();

와 같이 String 대신에 Calendar_Item 이 오면 데이터 수정을 어떻게 해야 할까?

Calendar_Item item = new Calendar_Item();
item.setYear(year);
item.setMonth(month);
item.setDay(day);
item.setWeekday(weekday);
item.setColor(color);
item.setName(name);

item.setKey(key);

list.set(0,item);

즉, String 값 대신에 Calendar_Item item 값을 넣어주면 된다.

초보자로서 이렇게 생각하는 것이 참 어렵다.


검색으로 index 값인 0 를 찾아내는 로직이 구조상 속도가 빠르지 않는거 같다.

public int getIndexOfList(String search_key) {
    for (int temp = 0; temp < list.size(); temp++) {
        String key = list.get(temp).getKey();
        if (key != null && key.equals(search_key)) {
            return temp;
        }
    }
    return -1;
}

하나의 index 값을 찾아내는데 ArrayList 배열 전체를 순환하면서 일치하는 걸 찾아낸다.

검색으로 찾아야 할 데이터가 많다면 속도 저하는 당연히 발생할 것이다.



컬렉션 프레임웍에서는 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화하였다.

컬렉션에 저장된 각 요소에 접근하는 기능을 가진 Iterator 인터페이스를 정의하고, Collection 인터페이스에는 Iterator를 반환하는 iterator()를 정의하고 있다.

List list = new ArrayList();
Iterator it = list.iterator();
while(it.hasNext()){
    System.out.println(it.next());
}



HashMap

- Map 인터페이스의 한 종류로, key와 value 를 묶어 하나의 entry 로 저장한다는 특징을 갖는다.

- key는 중복을 허용하지 않고, value는 중복 허용한다.

  동일한 key 가 입력되면, 나중에 입력된 데이터(key, value)로 덮어 씌워진다.

- Map에 종류에는 Hashtable, HashMap, LinkedHashMap, SortedMap, TreeMap 등이 있다.

- 배열과 연결이 결합된 형태, 추가, 삭제, 검색, 접근성이 모두 뛰어남, 검색에는 최고 성능을 보인다.
HashMap<키의타입, 데이터의 타입> 해쉬테이블 이름 = new HashMap<키의 타입, 데이터의 타입>();
- 해쉬 테이블에 저장할 데이터 타입과, 키 타입 두 가지 데이터 타입을 정해야 한다.
- HashMap<String, Integer> hashtable = new hashmap<String, Integer>();
- hashtable.put("apple", new Integer(100)); // 해쉬 테이블에 데이터 저장
- Integer num = hashtable.get("apple"); // 해쉬테이블에 저장된 데이터를 읽어온다.
- hashtable.remove("apple"); // 해쉬테이블에 있는 데이터 삭제

※ 멀티쓰레드에서는 HashTable을 쓴다


* Map 인터페이스의 주요 메소드


HashMap 메소드 

설명 

put() 

- 키(Key)와 값으로 구성된 새로운 데이터를 추가한다. 

get() 

- 지정한 키(Key)에 해당하는 데이터를 반환한다. 

remove() 

- 지정한 키(Key)에 해당하는 데이터를 삭제한다. 

containKey() 

- 지정한 키(Key)가 존재하는지 여부를 반환한다. 

containsValue() 

- 지정한 값이 존재하는지 여부를 반환한다. 

size() 

- Map의 요소 개수를 반환한다. 

isEmpty() 

- Map이 비어 있는지의 여부를 반환한다. 



*



출처: http://hyeonstorage.tistory.com/230 [개발이 하고 싶어요]

* Map 인터페이스의 주요 메소드


HashMap 메소드 

설명 

put() 

- 키(Key)와 값으로 구성된 새로운 데이터를 추가한다. 

get() 

- 지정한 키(Key)에 해당하는 데이터를 반환한다. 

remove() 

- 지정한 키(Key)에 해당하는 데이터를 삭제한다. 

containKey() 

- 지정한 키(Key)가 존재하는지 여부를 반환한다. 

containsValue() 

- 지정한 값이 존재하는지 여부를 반환한다. 

size() 

- Map의 요소 개수를 반환한다. 

isEmpty() 

- Map이 비어 있는지의 여부를 반환한다. 



*



출처: http://hyeonstorage.tistory.com/230 [개발이 하고 싶어요]

* Map 인터페이스의 주요 메소드


HashMap 메소드 

설명 

put() 

- 키(Key)와 값으로 구성된 새로운 데이터를 추가한다. 

get() 

- 지정한 키(Key)에 해당하는 데이터를 반환한다. 

remove() 

- 지정한 키(Key)에 해당하는 데이터를 삭제한다. 

containKey() 

- 지정한 키(Key)가 존재하는지 여부를 반환한다. 

containsValue() 

- 지정한 값이 존재하는지 여부를 반환한다. 

size() 

- Map의 요소 개수를 반환한다. 

isEmpty() 

- Map이 비어 있는지의 여부를 반환한다. 




출처: http://hyeonstorage.tistory.com/230 [개발이 하고 싶어요]

* Map 인터페이스의 주요 메소드

HashMap 메소드 

설명 

put(Object Key, Object Value)

 - 키(Key)와 값으로 구성된 새로운 데이터를 추가한다. 

get(Object Key)

 - 지정한 키(Key)에 해당하는 데이터를 반환한다. 

remove(Object Key)

 - 지정한 키(Key)에 해당하는 데이터를 삭제한다. 

boolean containsKey(Object Key)

출처: http://vaert.tistory.com/107 [Vaert Street]

boolean containsKey(Object Key)

 - 지정한 키(Key)가 존재하는지 여부를 반환한다. 

boolean containsValue(Object Value)

 - 지정한 값이 존재하는지 여부를 반환한다. 

clear()

 - HashMap에 저장된 모든 객체를 제거한다

Object clone()

 - 현재 HashMap을 복제하여 반환한다.
    newmap = (HashMap)map.clone();

newmap = (HashMap)map.clone();

출처: http://vaert.tistory.com/107 [Vaert Street]

int size() 

 - HashMap에 저장된 요소의 개수를 반환한다. 

isEmpty() 

 - Map이 비어 있는지의 여부를 반환한다. 

Collection values()

 - HashMap에 저장된 모든 값을 컬렉션 형태로 반환한다.


HashTable과 HashMap의 차이는 null 값을 허용하는데에 있다.
HashTable은 null 값을 허용하지 않지만, HashMap은 null 값을 허용한다.

HashMap의 경우 동기화를 지원하지 않지만 Hashtable은 동기화를 지원하여 다중 스레드 환경에서 사용하면 된다.
보통은 HashMap을 활용하고 동기화가 필요한 시점에서는 Java 5부터 제공하는 ConcurrentHashMap을 사용하는 것이 더 좋은 방법이라 표현한다.
HashMap은 저장된 요소들의 순회를 위해 Fail-Fast Iterator를 반환한다.
Hashtable은 같은 경우 Enumeration을 반환한다.


there are many differences between HashMap and Hashtable classes that are given below.

HashMapHashtable

1) HashMap is non synchronized. It is not-thread safe and can't be shared between many threads without proper synchronization code.

Hashtable is synchronized. It is thread-safe and can be shared with many threads.

2) HashMap allows one null key and multiple null values.

Hashtable doesn't allow any null key or value.

3) HashMap is a new class introduced in JDK 1.2.

Hashtable is a legacy class.

4) HashMap is fast.

Hashtable is slow.

5) We can make the HashMap as synchronized by calling this code
Map m = Collections.synchronizedMap(hashMap);

Hashtable is internally synchronized and can't be unsynchronized.

6) HashMap is traversed by Iterator.

Hashtable is traversed by Enumerator and Iterator.

7) Iterator in HashMap is fail-fast.

Enumerator in Hashtable is not fail-fast.

8) HashMap inherits AbstractMap class.

Hashtable inherits Dictionary class.



ArrayList 다음에 <T>,<String>,<Integer>,<Class명> 라고 쓰여진 형식을 많이 보았을 것이다.

이 <>를 제네릭(Generics)이라 하는데, 이 <>안에 어떠한 타입을 선언해주어 해당 ArrayList, List 등이 사용할 객체의 타입을 지정해준다는 뜻이다. 이는 다룰 객체의 타입을 미리 명시하여 객체의 형변환을 사용할 필요없게 하며, 내가 사용하고 싶은 데이터 타입만 사용할 수 있게 해주는 효과가 있다.


ArrayList 의 제네릭스로 HashMap<String,String> 을 사용한 예제다.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;

public class ArrayList_EX01 {

    public static void main(String[] args) {
        ArrayList <HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();
        HashMap<String, String> map = new HashMap<String,String>();
        map.put("1", "고양이");
        map.put("3", "송아지");
        map.put("2", "강아지");
        //key, value로 String의 값들을 넣어준다.
        list.add(map);

        for(int i = 0; i < list.size(); i++){
            // ArrayList 사이즈 만큼 for문을 실행한다.
            System.out.println("list 순서 " + i + "번쨰");
            for( Entry<String, String> elem : list.get(i).entrySet() ){
                // list 각각 HashMap받아서 출력한다.
                System.out.println( String.format("키 : %s, 값 : %s", elem.getKey(), elem.getValue()) );
            }
        }

    }
}


'안드로이드 > Java 문법' 카테고리의 다른 글

[Java] 정보은닉과 캡슐화  (0) 2017.10.16
자바 기본 데이터형과 크기  (0) 2017.10.11
Java 클래스(Class) ★★★★★  (0) 2017.05.04
Java foreach 문  (0) 2017.03.01
자바 배열과 기본 문법  (0) 2016.07.11
블로그 이미지

Link2Me

,