'2015/11/07'에 해당되는 글 5건

  1. 2015.11.07 LinkedHashMap, TreeMap, HashMap
  2. 2015.11.07 Comparable 인터페이스에 대한 이해
  3. 2015.11.07 자바 Garbage Collection(GC) 튜닝
  4. 2015.11.07 자바의 시간 API
  5. 2015.11.07 Commons DBCP

Map인터페이스를 구현한 하위 클래스들 HashMap과 LinkedHashMap과 TreeMap은 분명한 몇 가지 차이가 있다.

Map 인터페이스를 구현하였으므로, Key - Value Store형태로 저장하여, 사용할 수 있다는 공통점이 있다.

다음과 같은 차이점이 있다.


<입력되는 순서로 저장 보장>

HashMap

들어 간 순서로 저장되지 않으며, 출력되는 순서가 일치하는 것을 보장하지 않는다.

HashTable

들어 간 순서로 저장되지 않으며, 출력되는 순서가 일치하는 것을 보장하지 않는다.

LinkedHashMap

들어 간 순서대로 저장되어 출력되는 순서가 일치하는 것을 보장한다.

TreeMap

들어 간 순서대로 저장되지 않으며, 정렬된 순서로 저장되어 출력된다.

    public static void main(String[] args) {
        HashMap<Integer, String> hashMap = new HashMap<Integer, String>();
        Hashtable<Integer, String> hashTable = new Hashtable<Integer, String>();
        TreeMap<Integer, String> treeMap = new TreeMap<Integer, String>();
        LinkedHashMap<Integer, String> linkedHashMap = new LinkedHashMap<Integer, String>();
        
        // HashMap, TreeMap, LinkedHashMap에 각각 2 -> 3 -> 1 순서대로 입력함
        hashMap.put(2String.valueOf(2));
        hashTable.put(2String.valueOf(2));
        treeMap.put(2String.valueOf(2));
        linkedHashMap.put(2String.valueOf(2));
        
        hashMap.put(3String.valueOf(3));
        hashTable.put(3String.valueOf(3));
        treeMap.put(3String.valueOf(3));
        linkedHashMap.put(3String.valueOf(3));
        
        hashMap.put(1String.valueOf(1));
        hashTable.put(1String.valueOf(1));
        treeMap.put(1String.valueOf(1));
        linkedHashMap.put(1String.valueOf(1));
        
        // 출력
        System.out.println("--HashMap--");
        for(Entry<Integer, String> entry : hashMap.entrySet()){
            Integer key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + " : " + value);
        }
        
        System.out.println("--HashTable--");
        for(Entry<Integer, String> entry : hashTable.entrySet()){
            Integer key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + " : " + value);
        }
        
        System.out.println("--TreeMap--");
        for(Entry<Integer, String> entry : treeMap.entrySet()){
            Integer key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + " : " + value);
        }
        
        System.out.println("--LinkedHashMap--");
        for(Entry<Integer, String> entry : linkedHashMap.entrySet()){
            Integer key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + " : " + value);
        }
    }
cs


--HashMap--
1
2
3
--HashTable--
3
2
1
--TreeMap--
1
2
3
--LinkedHashMap--
2
3
1
cs


위의 결과로 봤을 때 HashMap과 HashTable 역시 정렬되는 것 같지만, 하나는 오름차순, 하나는 내림차순으로 정렬된다. 그냥 맘 편하게 안 된다고 생각하자.


<구조 및 성능>

HashMap

검색성능 O(1) 시간복잡도, 해시테이블과 비교하여 동기화(Synchronized) 지원하지 않지만 성능은 더 빠름

HashTable 

검색성능 O(1) 시간복잡도, 해시맵과 비교하여 동기화(Synchronized) 지원하지만 성능은 더 느림

LinkedHashMap

검색성능 O(1) 시간복잡도, 더블링크드리스트 자료구조로 이루어짐

TreeMap

검색성능 O(log(n)) 시간복잡도, Red Black Tree 자료구조로 이루어짐


<Null Keys and values>

HashMap

하나의 null Key와 여러 개의 null values를 허용한다.

HashTable

null Key 또는 null Value를 허용하지 않는다. => Null Pointer Exception 발생

LinkedHashMap

하나의 null Key와 여러 개의 null values를 허용한다.

TreeMap

null Key 또는 null Value를 허용하지 않는다. => Null Pointer Exception 발생




'JAVA' 카테고리의 다른 글

자바 예외 처리  (0) 2015.11.21
GC(Garbage Collection)의 대상은 누구인가?  (0) 2015.11.10
Comparable 인터페이스에 대한 이해  (0) 2015.11.07
자바 Garbage Collection(GC) 튜닝  (0) 2015.11.07
자바의 시간 API  (0) 2015.11.07
Posted by slender ankles
,


'JAVA' 카테고리의 다른 글

GC(Garbage Collection)의 대상은 누구인가?  (0) 2015.11.10
LinkedHashMap, TreeMap, HashMap  (0) 2015.11.07
자바 Garbage Collection(GC) 튜닝  (0) 2015.11.07
자바의 시간 API  (0) 2015.11.07
Commons DBCP  (0) 2015.11.07
Posted by slender ankles
,

자바 성능 튜닝

성능에 영향을 미치는 요인은 크게 두 가지로 나눌 수 있다.

GC, HotSpot

 

* 2GB의 힙을 사용하는 JVM8GB의 힙을 사용하는 JVM의 차이는 어떻게 나타날까?

2GB의 힙을 사용하는 JVMGC를 처리하는 “STOP-THE-WORLD”가 짧을 것이므로 성능 상 유리할 수 있다.

반면에 8GB의 힙은 GC를 처리하는 시간은 길지 모르나 2GB의 힙에 비해 GC가 덜 빈번하게 일어나 성능 상 유리할 수도 있다.

 

32bit JVM vs 64bit JVM

동일 조건이라면 32bit JVM이 성능 상 더 유리하다.

?)

 

웹 서버의 가장 좋은 GC알고리즘은 무엇인가?

모든 경우는 아니지만 대부분 Concurrent Mark Sweep GC알고리즘이 성능이 가장 좋다. 이유는 낮은 딜레이가 중요하기 때문이다.

 

New 영역과 Old영역의 GC

New 영역의 GC보다 Old 영역에서 일어나는 Full GC가 일반적으로 시간이 오래 걸리기 때문에 New GC에서 충분한 크기를 잡아주는 것 역시 중요하다.

New영역이 너무 커져버려도 반응 속도가 느려 질 수 있다.

NEW영역에서의 GC의 메커니즘은 한 서바이버 영역에서 다른 서바이버 영역으로 복사가 일어나므로 이 또한 "STOP THE WORLD"가 발생한다.

'JAVA' 카테고리의 다른 글

LinkedHashMap, TreeMap, HashMap  (0) 2015.11.07
Comparable 인터페이스에 대한 이해  (0) 2015.11.07
자바의 시간 API  (0) 2015.11.07
Commons DBCP  (0) 2015.11.07
자바 classpath  (0) 2015.11.03
Posted by slender ankles
,

자바의 시간 API

JAVA 2015. 11. 7. 16:25

자바의 날짜와 시간 API의 문제점

자바에서는 날짜와 시간 API에 대한 악평이 자자했다. 그래서 JODA TIME이라는 외부 라이브러리를 이용하곤 했었는데, 자바 8에서는 이러한 날짜와 시간 API의 문제점을 개선한 API를 제공한다.

 

무엇이 문제였나?

1) 그레고리력으로 바뀌면서 발생한 율리우스력의 누적된 시간적 문제가 고려되지 않은 부분

2) 썸머타임이 적용되는 부분에 대한 고려되지 않은 부분

 ...

JDK의 기본 날짜 클래스의 문제점

1) 불변 객체가 아니다(Not Immutable)

날짜 클래스의 set메서드를 통해 날짜를 지정할 수 있게 되어있다. 이 것은 여러 가지 문제점을 만들어낸다.

예를 들어 어떤 스레드에서 set메서드를 통해 날짜를 바꾸고, 또 다른 스레드에서 set메서드를 통해 날짜를 바꾸게 되면 데이터의 무결성을 보장하기가 어렵게 된다.

이를 해결 하기 위해서는 각 객체를 복사해서 반환하는 방법으로 문제를 해결해야 한다.

2) 일관성 없는 요일 상수

Calendar.get(Calendar.DAY_OF_WEEK) 함수에서 반환한 요일은 int 값으로, 일요일이 1로 표현된다. 따라서 수요일은 4이고, 보통 Calendar.WEDNESDAY 상수와 비교해서 확인한다. 그런데 calendar.getTime() 메서드로 Date 객체를 얻어와서 Date.getDay() 메서드로 요일을 구하면 일요일은 0, 수요일은 3이 된다. 두 개의 클래스 사이에 요일 지정값에 일관성이 없는 것이다.

 

어떻게 개선되었는가?

1) 불변 객체가 되었다.

2) LocalDate, LocalTime 등으로 지역 시간과 시간대가 지정되었다.

3) 월의 int 값과 명칭이 일치한다. 1월은 int 1이다.

 

spring framework에서도 기본적으로 조다 타임을 제공한다.

새로운 자바 8에서의 시간 api는 조다 타임의 영향을 받아 제공되었다.

 

'JAVA' 카테고리의 다른 글

Comparable 인터페이스에 대한 이해  (0) 2015.11.07
자바 Garbage Collection(GC) 튜닝  (0) 2015.11.07
Commons DBCP  (0) 2015.11.07
자바 classpath  (0) 2015.11.03
Java finalize  (0) 2015.10.26
Posted by slender ankles
,

Commons DBCP

JAVA 2015. 11. 7. 16:20

Commons DBCP

 커넥션 풀의 BasicDataSource setter 메서드를 통해 세팅을 할 때 1.x버젼과 2.x버젼이 호환이 되는가?

 안 되는 부분 있음.

내부적으로 커넥션 풀이 어떻게 저장되어 있는지?



 

maxActive, initalSize, minIdle, maxIdle

 maxWait이란 무엇인가?

maxWait속성은 커넥션 풀에서 커넥션이 고갈 됐을 때 커넥션 반납을 대기하는 시간(밀리초)이며 기본 값은 무한정이다.

 

TPS(Transaction Per Seconds)

 

무조건 커넥션을 많이 사용하면 되는 것 아닌가?

커넥션을 많이 사용하게 되면 시스템이 사용할 수 있는 자원의 범위와 부딪힐 수 있게 된다.


'JAVA' 카테고리의 다른 글

자바 Garbage Collection(GC) 튜닝  (0) 2015.11.07
자바의 시간 API  (0) 2015.11.07
자바 classpath  (0) 2015.11.03
Java finalize  (0) 2015.10.26
Call By Value vs Call By Reference  (0) 2015.09.14
Posted by slender ankles
,