感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

Listの整理・まとめ

<スポンサーリンク>

パーフェクトJavaで最も素晴らしいのは「コレクションと配列」の章だと思う。
コレクションがまるで意味不明だった時に、これを読んで目の前がパーッと開けたような気持ちになれた。

パーフェクトJava (PERFECT SERIES) (PERFECT SERIES 2)

パーフェクトJava (PERFECT SERIES) (PERFECT SERIES 2)

  • 作者: アリエル・ネットワーク株式会社,井上誠一郎,永井雅人,松山智大
  • 出版社/メーカー: 技術評論社
  • 発売日: 2009/09/24
  • メディア: 大型本
  • 購入: 26人 クリック: 360回
  • この商品を含むブログ (35件) を見る

復習したのでまとめ。何回でも読み直したい。ただ、やっぱり本に書いてあるイメージ図が秀逸なので、気になる人は本を読んでみてください。

★★
・コレクションとは、モノの集まりを表現するモノであり、かつ、モノの集まりに対する操作を提供するモノである。

・基本的かつ汎用性の高いデータ構造やアルゴリズムをJavaはコレクションフレームワークとして提供している

・コレクション型のジョブジェクトを生成するコードの構文

コレクションのインターフェース型<要素の型> 変数 = new コレクションのインターフェースを実装した具象クラス<要素の型>;
List<String> list = new ArrayList<String>();
Map<String,String> map = new HashMap<String,String>();
Set<String> set = new HashSet<String>();

Listのサンプル

package collection;

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

public class ListSample1 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("mizky");
		list.add("takaki");
		list.add("naoki");

		//すべてのリストの要素を表示する
		for (String name : list) {
			System.out.println(name);
		}

	}
}

結果

mizky
takaki
naoki

この例では、ArrayListの中にStringオブジェクトである"mizky"や"takaki"を参照するポインタが格納されているイメージをするとよい。


・コレクションの要素の型には任意の参照型を指定できるが、基本型は指定できない。
代わりに数値ラッパークラスを使う。

例えば、

List<int> list = new ArrayList<int>();

としたらコンパイルエラーとなる。

List<Integer> list = new ArrayList<Integer>();

これならOKである。

では、基本型とは?
変数が値そのものを保持する。
全部で8つあって、言語仕様が変わらない限り、Javaの基本型は8つのままである。
・boolean
・byte
・char
・short
・int
・long
・float
・double
の8つ。

int i;
と書いたときの読み方は、「int型の変数iを宣言した」と読む。

オブジェクトは、オブジェクトの場所を示す位置情報(アドレス)がある。
「参照」とは、この位置情報を指し示すこと。
参照型変数とは、オブジェクトの位置情報を格納する変数のこと。


・なぜインターフェースで宣言するのか。
これは僕がパーフェクトJavaを読んで一番感動した部分です。
160ページの6-2-4。

ListとArrayListの違いは、Listがインターフェース型で、
ArrayListが具象クラス型である点。
インターフェースはオブジェクトの振る舞いを規定した規則(契約)である。
「変わりにくいもの」をインターフェースにする。
一方、具象クラスは本質的に実装を持つため、変化しやすい存在である。
インターフェースは本質的に変化しにくい。
Listと書くことは、ArrayListと書くよりも変更の影響を受けにくいコードになる。

変更の影響を受けにくいコードを書く

これは拡張や保守に強いということ。
インターフェースを通じて参照型変数を宣言することにはこんな意味があるのだ。

・Listインターフェースの代表的なメソッド
add
contains
get
indexOf
lastIndexOf
remove
set
size

■ArrayListとLinkedListの使用方針(パーフェクトJava p.165)
・要素の読み込みが中心の場合、ArrayListの方が効率的
・要素の挿入や削除の頻度が高い場合、LinkedListのほうが効率的
・要素の書き換え処理が多い場合、ArrayListの方が効率的
・リストの先頭への追加や削除はLinkedListでは常套手段だが、ArrayListでは禁じ手である

・リストのサーチ
一般的に、リストの検索をする場合は先頭要素から順番に比較して探す。
これをリニアサーチ(線形探索)と呼ぶ。
・リストの検索の例

package collection;

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

public class ListSample1 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("mizky");
		list.add("takaki");
		list.add("naoki");

		//すべてのリストの要素を表示する
		for (String name : list) {
			System.out.println(name);
		}

		System.out.println("--------------");
		//要素からnaokiを検索する
		for (String name : list) {
			if("naoki".equals(name)) {
				System.out.println("naoki is found!");
			}
		}
	}
}

ソート済みのリストであれば、リニアサーチよりもバイナリサーチ(2分探索)の方が効率的に要素を探すことができる。