본문 바로가기

Language/[Java]

(91)
[Java] ConcurrentHashMap,HashTable Map interface를 구현한 3가지 구현체들의 차이는 간략하게 아래와 같다. HashMap : 동기화를 지원하지 않는다 HashTable : 엄청 초반에 만들어졌고, 동기화를 지원한다. ConcurrentHashMap: 동기화를 지원하고 HashTable 보다 성능이 좋다 그러면 ConcurrentHashMap이 왜 성능이 더 좋은지 알아보자 HashTable은 empty체크나 사이즈 체크 등 주요메서드들에 전부 syncronized처리가 되어있고, 한개의 쓰레드만 사용가능하게끔 락을 걸어놨다 예) 예시로, hashTable에서 put을 한다고 가정해보자 HashTable에서는 전체 메소드에 쓰레드 락이 걸려있고 ConcurrentHashTable에는 put 메서드 내, 이미 데이터가 존재하여, 교..
[Java] TreeMap(이진 탐색 트리) 이진 트리를 기반으로한 Map 컬렉션이다. 같은 Tree 구조로 이루어진 TreeSet과의 차이점은 TreeSet은 그냥 값만 저장한다면, TreeMap은 키와 값이 저장된 Map Entry를 저장한다는 것이다. 키는 저장과 동시에 자동 오름차순으로 정렬되고 숫자타입을 경우에는 값, 문자열 타입을 경우에는 유니코드로 정렬한다. 부모키값과 비교해서 키값이 낮은 것은 왼쪽에 저장하는 식이다. HashMap보다 성능이 떨어진다. TreeMap은 데이터를 저장할때 즉시 정렬하기에 추가,삭제가 HashMap보다 오래걸린다. 정렬된 상태로 Map을 유지해야하거나, 정렬된 데이터를 조회하는 범위검색이 필요한 경우 TreeMap을 사용하는 것이 좋다. 이진트리의 문제점을 보완한 레드블랙트리로 이루어져있다. 데이터가 들..
[JAVA] LinkedHashMap 순서를 유지하는 해시맵 LinkedHashMap은 Java의 HashMap을 확장하는 클래스이다. HashMap은 해시함수를 통해, 인덱스를 매핑을 하고 해당 인덱스에 저장을 하는 구조로 이루어져있다. 따라서 순서를 보장하지 않는다 LinkedHashMap을 통하면 순서를 유지할 수 있다. 해당 유지할 수 있는 이유는, doubly linked list로 삽입한 값들을 관리하고, 삽입한 순서대로 값을 가져오고자 할때 사용할 수 있기 때문이다. head와 tail로 데이터들을 관리하고, 신규로 데이터가 들어오면 다음 노드를 이어붙여주는 방식으로 구현이 되어있다.
[Java] HashMap Java 에서 HashMap은 key-value 값으로 이루어져 있고, key를 사용하여, value 값을 얻어낸다. Key는 중복을 허용하지 않고, Value는 중복을 허용한다. HashMap의 내부구조는 배열로 되어있고, Key는 직접 내부의 인덱스가 될 수 있으며 이를 버킷이라고 한다. 인덱스를 구하기 위해서는, 해시함수를 사용하는데 Hashcode % M 으로 산출할 수 있으나, 동일한 key값이 발생할 수 있고, 이를 해시 충돌이라고 한다. 이를 방지하기 위해서는 Open Addressing 방식과 Separate Chaning 방식이 있고, 해시 맵은 후자를 사용한다. Separate Chaning(동일한 해시값이 있을 경우, LinkedList로 관리하고, 8개 이상인 경우 Tree로 변경하..
[Java] 함수형 프로그래밍 함수형 프로그래밍으로 하게되면, 눈에 좀더 보기 편하고, 어떤 값들이 어떤 세팅을 주게 되는지를 편하게 볼수 있다는 장점이 있다. -Java 8에서 사용가능한 기술들이 있는데 아래와 같다. - 인터페이스의 디폴트 메소드 default 메소드를 사용하면, 인터페이스에서, 추상 메소드가 아닌 구현된 메소드를 사용할수 있다. public interface Calculator { public int plus(int i, int j); public int multiple(int i, int j); default int exec(int i, int j){ //default로 선언함으로 메소드를 구현할 수 있다. return i + j; } } - 메소드 레퍼런스, 생성자 레퍼런스 메소드 레퍼런스로 표현하는 것은 C..
Thread와 상태제어 메소드 스레드는 상태단계 들을 가지고 있다. 실행 대기 상태 : 아직 스케쥴링 되지 않아서, 실행을 기다리고 있는 상태 실행 상태 : 실행 대기 상태에 있는 스레드 중에서 스레드 스케쥴링으로 선택된 스레드가 CPU를 점유하고, run()메소드를 실행하는 상태 종료 상태 : run()메소드가 종료되어 더이상 실행할 코드가 없어져 스레드의 실행을 멈추는 것 일시 정지 상태 : 스레드가 실행할 수 없는 상태로 WAITING,TIMED_WAITING,BLOCKED 세가지 상태가 존재한다. 경우에 따라서, 스레드는 실행 대기 상태가 아닌, 일시정지 상태로 가기도한다. - Waiting : 다른 스레드가 통지할때까지 기다리는 상태 - Timed_waiting : 주어진 시간 동안 기다리는 상태, sleep,wait,joi..
[Java] final,finally,finalize 차이점 1. Final 변수나 참조에 적용 가능하다. -변수인 경우, 값 변경이, 참조에 적용하면 다른 객체를 가르키는것이 불가하다 -메서드에 적용하면, 해당 메서드를 상속 받는 하위 클래스에서 오버라이딩이 불가하다.(사용은 가능하나, 변경은 불가 ) -클래스에 적용하면, 해당 클래스를 다른 클래스가 상속 받을 수 없다. 즉, final 클래스의 하위 클래스를 정의 할 수 없다. 2. Finally Finally는 try-catch 블록 뒤에 둘 수 있는 선택적인 블록인데, try-catch 문이 끝나기 전에 항상 꼭 실행되어야 하는 로직이 있을 경우 finally 절에 두면된다. 예외가 던져지더라도, 항상 실행될 코드를 지정하기 위해 사용된다. finally 블록은 try와 catch 블록이 전부 실행된 후,..
[Java] 제네릭이란? 제네릭 : 클래스에서 사용할 타입을 외부에서 설정하는 것이다. 장점 : 컴파일 시점에, 잘못된 타입 사용을 미리 방지할 수 있다. (메소드,파라미터, 리턴타입등을 설정할 수 있다) 와일드 카드 : 해당 클래스에 대한 제한을 상속 관계까지 둘수있다. -? extends 상위타입 -? supper 하위타입 등등, 해당 상속관계의 클래스로 클래스타입을 설정할 수 있다.