<List정리>
1.ArrayList
컬렉션에서 가장 많이 사용한다. ArrayList에 객체를 추가하면 내부 배열에 객체가 저장이 된다.
일반 배열과의 차이점은 ArrayList는 제한없이 객체를 추가할 수 있다.
List 컬렉션은 객체 자체를 저장하는 것이 아니라 객체의 번지를 저장한다.(위치)
또한 객체를 중복저장 할 수 있는데, 이 경우에는 각각 따로 2개가 저장되는 것이 아닌 같은 값이 하나로 저장된다.
null 또한 저장이 가능하다.
<ArrayList 컬렉션 생성 예시> |
List<E> list = new ArrayList<E>(); //E에 지정된 타입의 객체만 저장한다. |
List<E> list = new ArrayList<>(); //E에 지정된 타입의 객체만 저장한다. |
List list = new ArrayList(); //모든 타입의 객체를 저장한다. |
타입 파라미어 E에는 ArrrayList에 저장하고 싶은 객체 타입을 지정하면 된다.
List에 지정한 객체 타입과 동일하다면 ArrayList<>와 같이 객체 타입을 생략할 수도 있다.
그리고 객체 타입을 모두 생략하면 모든 종류의 객체 타입을 저장할 수 있다.
ArrayList 컬렉션에 객체를 추가하면 인덱스 0번부터 차례로 저장이 된다. 특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨진다. 마찬가지로 삽입하는 경우에는 모두 1씩 밀려난다.
그렇기 때문에 빈번하게 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList 사용이 좋지 않다.
(객체의 수가 많다면 전부 다 움직여야 하기 때문)
대신 이런 경우엔 LinkedList를 사용하는 것이 좋다.
**Private로 변수 선언시 생성자 함수 호출과 getter, setter를 생성해줘야 한다.
<객체 추가 예시>
클래스 이름이 Board 일 때
list.add(new Board("제목1","내용1","글쓴이1"));
* --ArrayList 특징--
*삽입, 삭제가 자주 일어나지 않거나 >> 중간 삽입시 모든 데이터를 뒤로 하나씩 미루고, 삭제시에 하나씩 전부 당김.
*데이터의 양이 많지 않을 때 사용한다.
*
*But !! 데이터의 양이 많고, 읽기 전용인 경우 그리고 순차 검색인 경우는 가장 빠른 성능을 보여준다.
*(쉽게 말해 변동 없이 단순히 출력만 해야하는 경우..)
따라치기는 하고 있지만 이해가 안되는 부분도 많고 상당히 힘들다,,, 아직 무슨이유로 이렇게 쓰이는지도 모르는 것들이 너무 많다. ㅋㅋ 그냥 공식처럼 쓰기만 할 뿐 억지로 이해하려고 하면 머리아파서 다음것도 못할 수 밖에 없는 거 같다.
<Vector>
ArrayList와 동일한 내부 구조이다.
차이점은 Vector는 동기화된 메소드이기 때문에, 멀티스레드가 동시에 Vector()메소드를 실행할 수 없다는 것이다.
그렇기 때문에 멀티 스레드 환경에서는 안전하게 객체를 추가 또는 삭제가 가능하다.
스레드 하나가 접근하면 나머지는 기다리고 있어야 한다.
Vector 컬렉션 생성은 List 생성 예시에서 List만 Vector로 바꿔주면 된다(new ArrayList > new Vector)
●동기화(Synchronize)란?
-여러 스레드가 접근할 때 서로 충돌이 나지 않기 위해 해준다.
-동기화를 한다는 것은 스레드로부터 추가/삭제가 이루어져도 내부의 데이터 처리는 안전하게 한 번에 하나의 스레드만 처리되도록 보장한다는 의미이다. / 데이터가 처리가 안정적으로 이루어지도록 보장한다는 것이다.
*이때 멀티스레드가 아닌 경우 ArrayList 사용이 바람직하다.
-단일 스레드의 경우 자동으로 동기화를 하는 것이 오히려 성능 저하를 일으킨다.
<LinkedList>
ArrayList와 사용 방법은 동일하지만 내부 구조는 완전히 다르다.
ArrayList는 내부 배열에 객체를 저장하지만, LinkedList는 인접 객체를 체인처럼 연결해서 관리한다.
삽입/삭제가 빈번할 때 사용하면 좋다.
<Set>
* 집합은 데이터의 모음일 뿐 '순서가 보장되지 않는다'
* 그러므로 중복을 허용하지 않는다.
* 데이터가 입력될 때 기존 데이터가 있는지 확인한다.
* 이때 사용하는 알고리즘이 Hash알고리즘이다.
* Hash는 패스워드 검증시에 사용한다.
* Hash는 검색속도가 굉장히 빠르다.
*--List--에 저장시 중복 객체도 저장하고 입력받은 순서 그대로 저장 및 출력하게 된다.
<HashCode>
해시코드를 간단하게 말하면, 해시 알고리즘에 의해 생성된 정수 값이다. 이렇게 정수로 변환된 해시는 배열의
인덱스,위치,데이터 값을 저장하거나 검색할 때 사용된다.
1)해시 함수(Hash Function)
임의의 데이터를 고정된 길이의 값으로 리턴해주는 함수.
해시 자료구조의 장,단점과 용도
1)장점
-데이터 저장/일기 속도가 빠름(검색 속도가 빠름)
-해시는 키에 대한 데이터가 있는지 확인이 쉬움
2)단점
-일반적으로 저장공간이 많이 필요하다.
-여러 키에 해당하는 주소(인덱스)가 동일한 경우 충돌을 해결하기 위한 별도 자료구조 필요
3)용도
-검색이 많이 필요한 경우
-저장,삭제,읽기가 빈번한 경우
*해시코드 작동 방식
1단계로 해시코드로 먼저 분류를 한다.
해시코드가 다르다면 다른객체로 인식.
혹시나 해시코드가 같아도 다른객체일 수 있기 때문에 equals로 물리적인 주소값을 비교한다.
(equals는 부담되는 방식이rl에 해시코드로 먼저 대부분 분류를 한다.)
-정확한 값(위치)을 갖고 있기 때문에 10억개 이던지 100억개 이던지 금방 찾을 수 있다.
Member 객체의 내용(이름,나이)로 객체가 같은지 다른지 비교하기 위해서는
* Object 로부터 상속받은 hashCode()와 equals()를 overriding 해야 한다.
* overriding 하지 않으면 각각 객체의 해시값과 객체의 주소를 가지고 비교하지만
* 아래처럼 overriding 하면 객체내의 필드 내용으로 비교한다.
하루 적고 포기한 대단한놈