17、java中的集合(4)
生活随笔
收集整理的這篇文章主要介紹了
17、java中的集合(4)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?????? 之前單列集合只說過了List系列的集合,接下來再說一下Set集合系列,Set集合是無序集合(存取順序不一致),不允許添加相同元素,Set的實現依賴于Map集合,可以將Set集合看作Map集合鍵的集合,Map中是不可能包含兩個鍵相同的鍵值對,所以Set集合不允許相同元素也是為此, Set集合的基本實現類有HashSet、TreeSet、LinkedHashSet等,接下來詳細介紹。
?????? HashSet,其實現依賴于HashMap,操作HashSet中的功能方法到最后都是調用的HashMap中的方法,各個功能方法比較容易理解,其源碼如下:
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable {//底層維護一個HashMap,用于存儲數據private transient HashMap<E,Object> map;// 虛擬值,以與備份映射中的對象關聯private static final Object PRESENT = new Object();//-----------------------構造方法-----------------------////構造HashSet就相當于實例化HashMappublic HashSet() {map = new HashMap<>();}public HashSet(int initialCapacity, float loadFactor) {map = new HashMap<>(initialCapacity, loadFactor);}public HashSet(int initialCapacity) {map = new HashMap<>(initialCapacity);}//保證有序HashSet(int initialCapacity, float loadFactor, boolean dummy) {map = new LinkedHashMap<>(initialCapacity, loadFactor);}//-----------------------功能方法-----------------------////迭代器public Iterator<E> iterator() {return map.keySet().iterator();}//添加方法,其實是給map添加一個鍵值對,鍵是添加的元素,值是一個虛擬值,用于組合構建鍵值對public boolean add(E e) {return map.put(e, PRESENT)==null;}//刪除方法,調用的是map中根據key刪除鍵值對的方法public boolean remove(Object o) {return map.remove(o)==PRESENT;} }?????? TreeSet集合和LinkedHashSet分別依賴于TreeMap集合和LinkedHashMap集合,Map集合中對雙列集合的功能方法,在set集合中對單列集合均可使用。
?????? 為了方便操作集合,java提供了一個工具類Collections,類中定義多個靜態方法用來直接操作集合可以實現集合的排序、查找、復制、替換、截取等。
?????? 最后說一下遍歷集合的一些方式,代碼如下:
public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("aaa");list.add("bbb");list.add("ccc");//方式一:遍歷集合,然后根據下標獲取到每一個位置上的元素,以完成遍歷for (int i = 0; i < list.size(); i++) {System.out.println("方式一:"+list.get(i));}//方式二:使用foreach,俗稱增強for循環for (String string : list) {System.out.println("方式二:"+string);}//方式三:使用迭代器//實現原理如下邊迭代器實現代碼Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {//list.add(2, "555");//報錯System.out.println("方式三:"+iterator.next());}System.out.println("---------------------------------------------------");Map<String, Object> map = new HashMap<String, Object>();map.put("111", "aaa");map.put("222", "bbb");map.put("333", "ccc");//方式一:通過map內部方法將map中的元素封裝到一個Set中,Set中元素的類型確定: Set<Entry<String, Object>>//然后使用Entry類中的方法+set集合遍歷來遍歷map集合Set<Entry<String, Object>> entrySet = map.entrySet();for (Entry<String, Object> entry : entrySet) {System.out.println("方式一:"+entry.getValue());}//方式二:獲取map集合中key的集合,然后根據key獲取對應value值Set<String> keySet = map.keySet();for (String key : keySet) {System.out.println("方式二:"+map.get(key));}}-----------------------------迭代器實現代碼----------------------------------- //單列集合都實現了Iterable接口,所以需要實現迭代方法iterator public interface Iterable<T> { Iterator<T> iterator(); }//使用ArrayList中的迭代器實現為例 public Iterator<E> iterator() {return new Itr();}//迭代器的具體實現 private class Itr implements Iterator<E> {int cursor; // 記錄下一個要返回元素的索引 int lastRet = -1; int expectedModCount = modCount;// 修改次數,用來記錄修改的次數是否發生了變化//判斷是否還有下一個元素public boolean hasNext() {return cursor != size;}//檢查集合列表是否被修改,在使用迭代器遍歷集合時不允許使用集合方法修改集合內容,否則報錯final void checkForComodification() {if (modCount != expectedModCount)throw new ConcurrentModificationException();}//獲取到下一個返回的元素public E next() {checkForComodification();int i = cursor;if (i >= size)throw new NoSuchElementException();//獲取到ArrayList集合底層維護的那個存儲數據的數組,也就是獲取到數組的一個副本//這也是為什么使用迭代器遍歷時不能修改集合的原因,操作的是副本Object[] elementData = ArrayList.this.elementData;if (i >= elementData.length)throw new ConcurrentModificationException();cursor = i + 1;return (E) elementData[lastRet = i];}//迭代器中提供了一個remove方法,可用于迭代時刪除元素public void remove() {if (lastRet < 0)throw new IllegalStateException();checkForComodification();try {ArrayList.this.remove(lastRet);cursor = lastRet;lastRet = -1;expectedModCount = modCount;} catch (IndexOutOfBoundsException ex) {throw new ConcurrentModificationException();}} }集合的基本使用到這里也就介紹完了。
總結
以上是生活随笔為你收集整理的17、java中的集合(4)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 16、java中的集合(3)
- 下一篇: 18、java中的泛型