일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 데이터베이스
- dbeaver
- 자바 Random클래스
- 자바 추상메서드
- 자바 내부 클래스
- 자바 문자열 클래스
- 코딩
- Java 추상 메서드
- 자바 예제
- Java문자열 클래스
- 자바 Wrapper클래스
- Java thorw
- oracle
- 자바 String클래스
- Java다운캐스팅
- DBMS
- Java 내부 클래스
- Express
- nodejs
- Java객체배열
- 자바 try-catch
- Java try-catch
- Java업캐스팅
- 자바 스트링클래스
- database
- java super( )
- db
- 자바 제어문
- 오라클
- Java추상클래스
- Today
- Total
코딩이란 무엇일까
[Java/자바]Set,List 본문
안녕하세요 오늘은 자바에서 컬렉션 프레임 웍의 인터페이스 중 하나의 Set, List에 대해 알아보도록 할게요!ㅋ
Set(집합)?
Set은 요소들을 집합적으로 모아놓은 자료구조를 말합니다.
Set의 특징
1.Set은 중복 값을 허용하지 않습니다. 예를들어 1이라는 값이 들어가 있는데 1이 또 들어올 수 없는 것이지요.
2. 저장 순서를 유지하지 않습니다. 1-> 2-> 3-> 4 이렇듯 순서가 따로 있지 않습니다.
Set을 구현한 클래스
Set을 구현한 클래스는 HashSet과 TreeSet 이렇게 있습니다.
[1] HashSet
⇒ Set과 동일하게 중복이 없고, 순서가 없다
사용자 | 설명 |
HashSet( ) | HashSet클래스의 기본 생성자 |
HashSet(Collection c) | 컬렉션의 요소로 HashSet객체 생성 |
HashSet(int capcity) | capacity 용량을 갖는 객체 생성 |
❗중복된 요소 add( ) 시, 집합에 추가되지 않고 false값으로 반환됩니다.
[2] TreeSet
⇒ Set과 동일하게 중복이 없으나, 정렬 기능이 추가된 형태입니다.
데이터 추가 시, 기존 데이터보다 작다면 기준의 왼쪽에
기준 데이터보다 크다면 기준의 오른쪽에 위치합니다.
⇒ 이진 탐색 트리의 구조를 갖고 있습니다.
이진 탐색 트리 구조 사진
위의 사진과 같이 값이 하나 들어오면 두 개로 나누어집니다.
첫 번째 값보다 작다면 왼쪽 크다면 오른쪽
따라서 HashSet과 TreeSet의 가장 큰 차이점은 정렬 기능이 추가되었다는 것입니다.
HashSet과 TreeSet의 예시 코드
import java.util.HashSet;
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSet1 {
public static void main(String[] args) {
HashSet hs= new HashSet(); //HashSet객체 생성
hs.add("apple"); // 값 추가하기
hs.add("banana"); // 값 추가하기
hs.add("tomato"); // 값 추가하기
hs.add("grape"); // 값 추가하기
hs.add("potato");// 값 추가하기
TreeSet ts= new TreeSet(); //TreeSet객체 생성
ts.add("apple"); // 값 추가하기
ts.add("banana"); // 값 추가하기
ts.add("tomato"); // 값 추가하기
ts.add("grape"); // 값 추가하기
ts.add("potato"); // 값 추가하기
Iterator it= hs.iterator(); //Interator를 사용하여 HashSet객체를 가져옵니다.
System.out.println("<hash Set출력>");
while(it.hasNext()) { //hasNext는 값이 있을 때 까지라는 의미를 갖습니다.
//따라서 값이 있을 때 까지 while문을 반복합니다.
System.out.print(" "+it.next()); //next( )는 다음 값을 가져옵니다.
}
System.out.println();
Iterator it2=ts.iterator(); //위와 같이 Interator을 사용하여 출력해줍니다.
System.out.println("<Tree Set출력>");
while(it2.hasNext()) {
System.out.print(" "+it2.next());
}
System.out.println();
System.out.println("현재 TreeSet의 크기"+ts.size()); //.size는 크기를 가져옵니다.
//Hash Set은 순서가 없음
//Tree Set은 알파벳 순으로 알파벳순으로 정렬이 되어있음
}
}
출력 결과
위의 출력 결과를 통해 HashSet은 정렬이 되어있지 않습니다. 심지어 넣은 순서도 지켜지지 않아 있죠
하지만 TreeSet은 알파벳 순으로 넣어졌습니다. 정렬 기준은 아스키코드를 통해 이루어졌기 때문에 알파벳 순으로 정렬이 되었습니다.
List(리스트)
리스트는 위의 Set과 다르게 데이터를 일렬로 늘어놓은 구조를 말합니다.
배열의 상위 호완이라고 생각하시면 좋습니다.
List의 특징
1. 순서가 있습니다.
2. 중복을 허용합니다.
⚠️List인터페이스를 구현한 클래스 ArrayLisy, LinkedList가 있습니다.
List 인터페이스의 주요 메서드 | 메서드 설명 |
add(int index,E elem) | index 위치에 elem추가 |
get(int index) | index 위치에 있는 요소 반환 |
indexOf(Object o) | 요소 o가 있는 위치 반환 |
listiterator( ) | Listiterator( )반환 |
remove(int index) | index 위치 요소 삭제 후 삭제값 반환 |
set(int index,E elem) | index위치 요소를 elem으로 변경 |
ArrayList
ArrayList는 배열과 마찬가지로 인덱스 번호를 사용하여 데이터를 관리합니다.
요소를 추가할 시 0번 인덱스부터 차례대로 요소를 저장합니다.
ArrayList 사용해 보기
import java.util.ArrayList;
public class ArrayList1 {
public static void main(String[] args) {
ArrayList list1= new ArrayList<>(10);
list1.add("A");
list1.add("C");
list1.add("E");
list1.add("D");
System.out.println("초기 상태:");
System.out.println(list1);
System.out.print("인덱스 1위치에 B추가:");
list1.add(1,"B"); // 1위치에 B를 추가하겠다.
System.out.println(list1); //1위치부터 원래 있던 값이 밀림
System.out.print("인덱스 2위치의 값 삭제:");
list1.remove(2); //인덱스 2위치의 값 삭제
System.out.println(list1);
//index2의 값 가져오기
System.out.println("인덱스 2위치의 값 반환:"+list1.get(2));
}
}
```
출력 결과
LinkedList
요소들이 서로 연결되어 있습니다.
ArrayList와 사용방법은 똑같지만 내부구조는 정말 다릅니다.
ArrayList는 내부 배열에 객체를 저장해서 관리하지만, LinkedList는 인접 참조를 링크해서 체인처럼 관리합니다.
ArrayList와 LinkedList의 차이
ArrayList는 배열 형태로 되어있다 설명했습니다. 따라서 객체 중간에 있는 값을 삭제하거나 객체 중간에 값을 넣으면
앞뒤의 값이 하나씩 밀리게 됨으로 삭제, 추가는 LinkedList에 비해 시간이 오래 걸리게 됩니다. 한마디로 안에 내부의 값이 전체적인 변동이 있다는 말이죠
LinkedList는 메모리 주소 값을 참조하기 때문에 앞뒤의 링크 즉, 주소만 바뀌고 나머지의 주소 값은 변경되지 않습니다.
따라서 값을 중간에 삭제, 추가는 ArrayList에 비해 상대적으로 속도가 빠릅니다.
실제 속도 비교를 위해 코드를 작성해 보겠습니다.
코드
import java.util.*;
public class TimeCheck {
public static void main(String[] args) {
ArrayList al=new ArrayList();
LinkedList ll= new LinkedList();
long start=System.currentTimeMillis();
for(int i=0;i<100000;i++) {
al.add(0,String.valueOf(i));//i를 문자열로 변환하여 값을 추가시켜줌
}
long end =System.currentTimeMillis();
System.out.println("ArrayList 작업시간:"+(end-start));
start=System.currentTimeMillis();
for(int i=0;i<100000;i++) {
ll.add(0,String.valueOf(i)); //i를 문자열로 변환하여 값을 추가시켜줌
}
end=System.currentTimeMillis();
System.out.println("LinkedList 작업시간:"+(end-start));
}
}
출력 결과
컴퓨터에 따라 다르겠지만 대략 이 정도의 차이가 나는 것을 볼 수 있습니다.
구분 | 순차적으로 추가/삭제 | 중간에 추가/삭제 | 검색 |
ArrayList | 빠르다 | 느리다 | 빠르다 |
LinkedList | 느리다 | 빠르다 | 느리다 |
이상으로 글 마치겠습니다.
글 읽어주셔서 감사합니다.
'Java' 카테고리의 다른 글
[Java/자바]Map(맵) (6) | 2022.10.13 |
---|---|
[Java/자바]큐(Queue),스택(Stack) (2) | 2022.10.13 |
[Java/자바]제네릭(Generic) (0) | 2022.10.12 |
[Java/자바]Wrapper클래스, Random클래스 (0) | 2022.10.07 |
[Java/자바]기본 API클래스 (String 클래스)알아보기 (0) | 2022.10.07 |