ArrayList,HashSet,HashMapを巡る.(全面)
6003 ワード
前言:ネット上のループを見て、多くのブログの内容が少ないので、リストだけを言ったり、setやmapだけを言ったりして、整理したいので、いくつかを整理します.まとめもしましたが、皆さんにも役に立つことを願っています.以下のdemoの完全なコードはgithub上でダウンロードできます(リンクアドレス)
PS:以上がList遍歴の4つの方式です.人はandroidにとってデータ量は大きくなく、効率も悪くなく、自分の都合のいいものを使っていると考えています. 理論上、方式1は最も速いが、同時問題を考慮する必要がある.削除操作を行うにはiteratorしか使用できません. foreachとfor:foreachは最初から最後まで、後ろから遍歴してはいけません.foreachループでは反復変数に値を割り当てることはできません(反復変数の内容を与えることができます).たとえば、Userリファレンスを変更することはできません.このリファレンスでUser内部データを変更することができます.
PS:setはnull要素を追加することができ、重複する要素を追加することはできない(重複要素はhashCodeとequalsを判断の根拠とする)、add(Object)の場合、setがObjectのhashCodeと同じ要素が存在しなければ直接add.存在する場合はequalsメソッドを呼び出して2つの要素を比較し、trueを返すと同じ要素として、そうでない場合は異なる要素として、要素をセットに追加します.重複要素検証を具体的に追加するには、ケースのCollectionsDemoを参照し、Studioクラスを変更すると検証できます.
PS:mapは一般的にIterator遍歴またはfor-each遍歴を用いる
削除問題ループをループするときに削除を使用する場合は、コレクション参照を直接使用して削除操作を行うとConcurrentModificationException異常が放出され、Iteratorのremoveメソッドを呼び出す必要があります.例:{@link ListTraverseDemo#testTraverseRemove()} 添加元素問題setは重複する元素を添加することができず(重複元素はhashCodeとequalsを判断根拠とする)、add(Object)の場合、setがObjectのhashCodeと同じ元素が存在しなければ直接add.mapが同じkeyを追加して存在する場合、そのvalueは前のvalueを上書きします. null要素listとsetを追加できますか?mapのkeyとvalueはすべてできます. PS:set内部はmapを用いて実現され,格納要素の使用,setのvalueはmapのkey,setはmapのvalueとして参照される.線城安全問題ArrayList,HashMap,HashSetはいずれも安全ではない.Collectionsのメソッドを使用して、synchronizedMap(map)、synchronizedList(list)、synchronizedSet(set)のセキュリティタイプのセットに変換できます.
PS:内部は実は装飾モードを使用しています:この集合クラスを継承し、強化方法、書き換え操作の方法でsynchronizedを使用して被装飾オブジェクトを呼び出す操作方法.
私はただ主な注意点をざっとまとめただけで、能力は限られていて、もし不当なところがあれば、皆さんの指摘を歓迎して、もし無視しやすくて間違いを犯しやすい注意点があれば、補充して提出することを歓迎します.
(一)リストを遍歴する
List list = getArrayList();
/**
* , for
*/
for (int i = 0, len = list.size(); i < len; i++) {
String s = list.get(i);
System.out.println(s);
}
/**
* , for
*/
for (String s : list) {
System.out.println(s);
}
/**
* , for Iterator
*/
for(Iterator iterator = list.iterator(); iterator.hasNext();){
String value = iterator.next();
System.out.println(value);
}
/**
* , while Iterator( 3 )
*/
Iterator iterator = list.iterator();
while (iterator.hasNext()){
String s = iterator.next();
System.out.println(s);
}
/**
* List,
* @return List
*/
public static List getArrayList() {
List list = new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
return list;
}
PS:以上がList遍歴の4つの方式です.
(二)HashSetを巡る
public static void main(String[] args) {
Set set = getHashSet();
/**
* 1, for
*/
for (String value : set) {
System.out.println(value);
}
/**
* 2, Iterator
*/
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
String value = iterator.next();
System.out.println(value);
}
/**
* 3, for Iterator, 2 ,
*/
for (Iterator iterator2 = set.iterator(); iterator2.hasNext(); ) {
String value = iterator.next();
System.out.println(value);
}
}
/**
* Set,
*
* @return Set
*/
public static Set getHashSet() {
Set set = new HashSet<>();
set.add("aa");
set.add("bb");
set.add("cc");
return set;
}
PS:setはnull要素を追加することができ、重複する要素を追加することはできない(重複要素はhashCodeとequalsを判断の根拠とする)、add(Object)の場合、setがObjectのhashCodeと同じ要素が存在しなければ直接add.存在する場合はequalsメソッドを呼び出して2つの要素を比較し、trueを返すと同じ要素として、そうでない場合は異なる要素として、要素をセットに追加します.重複要素検証を具体的に追加するには、ケースのCollectionsDemoを参照し、Studioクラスを変更すると検証できます.
(三)Mapを遍歴する
public static void main(String[] args) {
Map map = getHashMap();
/**
* 1, for-each。
*/
for (Map.Entry entry : map.entrySet()) {
System.out.println("key:" + entry.getKey() + ",value:" + entry.getValue());
}
/**
* 2, Iterator ( )
*/
Iterator> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry entry = iterator.next();
System.out.println("key:" + entry.getKey() + ",value:" + entry.getValue());
}
/**
* 3, Iterator ( )
*/
Iterator iterator1 = map.entrySet().iterator();
while (iterator1.hasNext()) {
Map.Entry entry = (Map.Entry) iterator1.next();
System.out.println("key:" + entry.getKey() + ",value:" + entry.getValue());
}
/**
* 4, ( )
*/
for (String key : map.keySet()) {
String value = map.get(key);
System.out.println("key:" + key + ",value:" + value);
}
/**
* 5, key value
*/
for (String key : map.keySet()) {
System.out.println("key:" + key);
}
for (String value : map.values()) {
System.out.println("value:" + value);
}
}
/**
* Map,
*
* @return Map
*/
public static Map getHashMap() {
Map map = new HashMap<>();
map.put("a", "a_value");
map.put("b", "b_value");
map.put("c", "c_value");
return map;
}
PS:mapは一般的にIterator遍歴またはfor-each遍歴を用いる
まとめ
PS:内部は実は装飾モードを使用しています:この集合クラスを継承し、強化方法、書き換え操作の方法でsynchronizedを使用して被装飾オブジェクトを呼び出す操作方法.
私はただ主な注意点をざっとまとめただけで、能力は限られていて、もし不当なところがあれば、皆さんの指摘を歓迎して、もし無視しやすくて間違いを犯しやすい注意点があれば、補充して提出することを歓迎します.