ねっとぱんだ-プログラミング勉強ブログ-

Webデザイン、プログラミングの勉強ブログ。

【java】コレクション・フレームワークとArrayList(再)

コレクションフレームワークに含まれるクラス/インターフェース

参考
https://rat.cis.k.hosei.ac.jp/article/java/lesson/collection1.html

java.util.Collection

List
順序付きリストのインターフェース
ArrayList
配列を用いたjava.util.Listの実装
LinkedList
リンクリストを用いたjava.util.Listの実装
Set
重複を許さない集合のインターフェース
HashSet
ハッシュを用いたjava.util.Setの実装
TreeSet
二分探索木を用いたjava.util.Setの実装

Map

  • キーと値のペアを表現
Map
キーと値のペアを表す構造のインターフェース
HashMap
キーの検索にハッシュを用いたjava.util.Mapの実装
TreeMap
キーの検索に二分探索木を用いたjava.util.Mapの実装

ArrayListとLinkedListの違い

  • ArrayList
    • 要素を配列で保持している
      • 配列がメモリ上でインデックス化されている
      • インデックスの修正、コピーに対するコストが要素数に比例して大きくなる
      • 要素がメモリ上のインデックスに保管されているため、n番目の要素へのアクセスが早い

「データベースからデータを大量に読み込み、以後それを順に参照しつつ複雑な計算を行うような場合」に適している

  • LinkedList
    • 要素を数珠つなぎに保持している
      • 前後の要素に対するリファレンスを保持している
        • 要素の追加、削除はリファレンスの変更のみでOKのため、コストが一定
        • ある要素が何番目かが分からないため、n番目の要素に対して1から順にたどる必要がある

「プログラム中で発生するデータの入れ物として使われ、時折データベースへ書き出してデータの永続化が図られるような用途」に適している

宣言
参考
http://qiita.com/Mura-Mi/items/e52c28ab7cb5db140d53

Listで宣言する場合とArrayList(or LinkedList)で宣言する場合がある。

ArrayListのメソッドはArrayListで宣言した場合でだけ使える

import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;

public class Box{
	private ArrayList<String> fruits;
	
    //初期値としてfruitsをArrayListとする
	void Box(String name){
		this.fruits = new ArrayList<>();
	}
	
	//引数に渡されたArrayListをfruitsに入れる
	void refleshBox(ArrayList<String> newFruits){
		this.fruits = newFruits;
	}
	
	//保持しているfruitsの値を返す(getter)
	ArrayList<String> getAllFruits(){
		return this.fruits;
	}
	
	public static void main(String args[]){
		Box A = new Box();
		
		//新しいLinkedyListを作る
		LinkedList<String> newFruits = new LinkedList();
		newFruits.add("apple");
		newFruits.add("banana");
		newFruits.add("melon");

	}
}

上記ではLinkedListをrefreshBoxメソッドに渡そうとした時、引数がArrayListである為、格納できない。

		//引数がArrayListの為LinkedListを受け取れない
		A.refleshBox(newFruits);
		//LinkedListで宣言すると、ArrayListは受け取れない
		LinkedList<String> fruits = A.getAllFruits();

Listで宣言する場合

import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;

public class Box{
	private List<String> fruits;
	
	//初期値としてfruitsをArrayListとする
	void Box(){
		this.fruits = new ArrayList<>();
	}
	
	//List型ならどれでも格納できる
	void refleshBox(List<String> newFruits){
		this.fruits = newFruits;
	}
	
	//保持しているfruitsの値を返す(getter)
	List<String> getAllFruits(){
		return this.fruits;
	}
	
	public static void main(String args[]){
		Box A = new Box();
		
		//新しいLinkedListを作る
		LinkedList<String> newFruits = new LinkedList<>();
		newFruits.add("apple");
		newFruits.add("banana");
		newFruits.add("melon");

	}
}

上記では引数もListで宣言している為、LinkedListをrefleshBoxメソッドの引数に渡しても受け取れる

		//LinkedListをfruitsに格納できる
		A.refleshBox(newFruits);
		//List型なら全て格納できる
		List<String> fruits = A.getAllFruits();