오늘은 ArrayList에 대해서 알아보자
크기가 가변적으로 변하는 선형 리스트 이다. 배열과 같은 순차리스트이며 인덱스로 내부의 객체를 관리한다는 점에서 비슷하지만 다른점은 크기가 변하지 않는 배열과 달리 ArrayList는 저장 용량이 부족해지면 자동적으로 부족한 크기 만큼 저장 용량이 늘어난다. 순서가있고 중복을 허용한다.
ArrayList<Book> library = new ArrayList<>(); //타입 파라미터 생략 가능
ArrayrList<Integer> num = new ArrayList<Integer>(); // int타입만 사용이 가능하다
ArrayrList<Integer> num = new ArrayList<Integer>(10); // 용량을 10으로 지정한다
ArrayList<Integer> list2 = new ArrayList<Integer>(Arrays.asList(1,2,3)); // 생성시 값을 추가한다
ArrayList<Integer> num = new ArrayList<Integer>();
num.add(1) // 1값 추가
ArrayList<Book> b = new ArrayList<>();
b.add(new Book("셜록홈스", "아서 코난 도일")); //ArrayList에 index와 value 추가
class Book {
String bookName;
String writeName;
public Book(String name, String write) {
bookName = name;
writeName = write;
}
}
인덱스 값을 추가하지 않으면 ArrayList 맨뒤에 값이 추가되며 중간에 추가할 경우 해당 인덱스 부터 나머지 인덱스 까지 한칸씩 밀려난다 추가가 자주 되면 성능이 느려지기 때문에 자주 추가할 경우 LinkedList를 사용하는것도 좋은 방법 이다.
b.remove(1); // 1번째 인덱스 삭제
b.clear(); // 전체 삭제
System.out.println(b.size());
public class Main {
public static void main(String[] args) {
ArrayList<Book> b = new ArrayList<>();
b.add(new Book("셜록홈스", "아서 코난 도일"));
for (int i = 0; i < b.size(); i++) {
Book book = b.get(i);
System.out.println(book.toString());
}
}
}
class Book {
String bookName;
String writeName;
public Book(String name, String write) {
bookName = name;
writeName = write;
}
@Override
public String toString() {
return "Book [bookName=" + bookName + ", writeName=" + writeName + "]";
}
}
// Book [bookName=셜록홈스, writeName=아서 코난 도일] 출력된다
반복자, 컬렉션 프레임워크의 저장된 요소를 임의로 담았다가 출력한다.
for문처럼 사용한다
ArrayList<Book> b = new ArrayList<>();
b.add(new Book("셜록홈스", "아서 코난 도일"));
b.add(new Book("아르테미스", "앤디 뮈어"));
System.out.println("iterator 이용.");
Iterator<Book> it = b.iterator();// 요소를 할당하여 iterator 초기화
while (it.hasNext()) {// 다음의 값이 있는지
Book b1 = (Book) it.next();// 요소를 가져와서 객체 초기화
// 명시적 형변환의 이유는 next메소드 리턴값이 object이기 때문이다.
b1.toString2();
//[bookName=셜록홈즈, writer=아서 코난 도일]
//[bookName=아르테미스, writer=앤디 뮈어]이 출력된다
class Book {
String bookName;
String writer;
public Book(String bn, String w) {
bookName = bn;
writer = w;
}
public void toString2() {
System.out.println(" [bookName=" + bookName + ", writer=" + writer + "]");
}
}
중복을 허용하지 않고 순서가 보장되지 않는다. 중복을 걸러내는 과정은 hashcode메소드와 equal메소드를 이용하는데 hashcode메소드를 호출하고 해시 코드를 얻어낸 다음 저장되어있는 객체들의 해시코드와 비교한뒤 같은 코드가 있다면 equals메소드로 두 객체를 비교하고 true가 나오면 저장하지 않는다
public class Main {
public static void main(String[] args) {
HashSet<Book> library = new HashSet<>();
library.add(new Book("셜록홈즈", "아서 코난 도일"));
library.add(new Book("아르테미스", "앤디 뮈어"));
System.out.println("현재 요소 갯수" + library.size());
// 중복 허용 확인
library.add(new Book("셜록홈즈", "아서 코난 도일"));
System.out.println("현재 요소 갯수" + library.size());
Iterator<Book> it = library.iterator();
while(it.hasNext()) {
Book b1 = (Book) it.next();
b1.toString2();
}
//같은 값이 중복 추가 되었다
}
}
class Book {
String bookName;
String writer;
public Book(String bn, String w) {
bookName = bn;
writer = w;
}
public void toString2() {
System.out.println(" [bookName=" + bookName + ", writer=" + writer + "]");
}
//중복을점검하는법 : 객체 동등 처리
//equals , hashCode
@Override
public int hashCode() {
return bookName.hashCode(); // 책의 이름이 저장된 메모리주소가 같다면 객체는 동등하다고 처리한다
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Book) {
Book b1 = (Book) obj;
if (b1.bookName.equals(bookName)) { //들어온 책의 이름과 배열의 책의 이름이 같다면 동일하다면 트루 리턴
return true;
}
}
return false;
}
}