読者です 読者をやめる 読者になる 読者になる

うさがにっき

読書感想文とプログラムのこと書いてきます

Collectionについて

概要

Collectionについてモヤモヤしてたところをまとめる
Collection (Java Platform SE 6)

詳細

配列とCollectionの相互変換

配列からCollection(List)に変換するにはArrays.asListを利用する

String[] str = {"1", "2", "3"};
List<String> list = Arrays.asList(str);

list.set(0, "4");
System.out.println(list);					// 4, 2, 3
System.out.println(Arrays.toString(str));		// 4, 2, 3

list.add("5");		// エラー
list.remove(0);		// エラー

ただし、asListメソッドは表面上配列をList化しているにすぎない
list.set()を使えば元の配列に影響を与えるし、add, removeもできない

もし配列要素をコピーし新たなリストを作成するならCollections.addAllメソッドを使う

String[] str = {"1", "2", "3"};
List<String> list = new ArrayList<String>();
Collections.addAll(list, str);

list.set(0, "4");
list.add("5");		
list.remove(1);		

System.out.println(list);				// 4, 3, 5
System.out.println(Arrays.toString(str));	// 1, 2, 3

リストへの変更が元の配列に影響を与えず、追加削除も問題なく行える

逆にCollectionから配列への変更はCollection#toArray()を使う
toArrayメソッドでは個別の要素がコピーされるので、変換元リストへの変更は配列に影響を与えない

Collectionのラッピング

Collectionのマルチスレッド対応

Collectionの実装クラスはマルチスレッドに対応していない
これは1つのスレッドからしか使われないのに、マルチスレッド対応(排他処理)するとパフォーマンスの低下につながるから
その代わりとしてCollectionには標準のCollectionをマルチスレッド対応に変換するメソッドが各種用意されている

例えば標準のリストをマルチスレッド対応リストに変換するときは

List<String> list = Collections.synchronizedList(new ArrayList<String>());
変更不可Collection

CollectionにfinalをつけてもCollection要素の書き換えは防げない
変更不可Collectionを作りたい場合には以下のメソッドを使う

こんな感じで使う

List<String> uList = Collections.unmodifiableList(list);

だが、変更不能Collectionも要素が参照型である場合、その内容の変更を制限することはできない
定数として利用したい場合は要素は必ず基本型かString型にしなければならない

空のCollection

戻り値をCollectionとするメソッドでは、中身が空の場合にもnullを返すのではなく空のCollectionを返すようにしてあげると受け取り側がnullチェックしなくていいので楽になる
Collectionには空のCollectionを作成するメソッドがある

これらの実体はあらかじめ用意された定数なのでオブジェクトの生成を抑えられるのも利点

参考

AndroidエンジニアのためのモダンJava

AndroidエンジニアのためのモダンJava

広告を非表示にする