日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

集合-1(Collection、迭代器、Collections、泛型)

發(fā)布時(shí)間:2024/10/14 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 集合-1(Collection、迭代器、Collections、泛型) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. Collection

Collection是整個集合框架的基礎(chǔ),作用只是提供維護(hù)一組對象的基本接口。

1.1 創(chuàng)建集合

父類引用指向子類對象

Collection<元素類型> 變量名=new ArrayList<元素類型>();//只可存儲<>指定的類型Collection 變量名=new ArrayList();//集合元素默認(rèn)為Object,任何元素類型都可存儲

1.2 求元素個數(shù)

size():返回Collection中元素的個數(shù)

  • length:數(shù)組的屬性,返回?cái)?shù)組中元素個數(shù)
  • length():字符串的方法,返回其中元素個數(shù)

1.3 遍歷方式

通用獲取方式:

  • 判斷集合中有沒有元素
  • 有,取出,回1——迭代
  • 沒有,結(jié)束
  • 1、無get方法,得用Object[] toArray(),轉(zhuǎn)換為數(shù)組后,才可用get();

    2、iterator(),可返回一個迭代器對象,可通過迭代對象來迭代集合。

    1.4 常用方法

    boolean add(E e)

    void clear()

    boolean contains(Object o)

    boolean remove(Object o)

    boolean isEmpty()

    int size()

    Object[] toArray()

    Iterator<E> iterator()

    1.5 注意

    • 集合中存放的其實(shí)是對象的地址
    • 集合中存基本數(shù)值時(shí),都自動裝箱了
    • 存儲時(shí),提升為了Object,取出時(shí)要使用元素的特有內(nèi)容時(shí),應(yīng)向下轉(zhuǎn)型。
    • 如果集合中存儲的是多種對象,此時(shí)進(jìn)行向下轉(zhuǎn)型是會發(fā)生類型轉(zhuǎn)換異常ClassCastException

    2. 迭代器

    Iterator是一個對象,工作是遍歷并選擇序列中的對象。創(chuàng)建代價(jià)小,又稱為輕量級的容器。

    2.1使用步驟

  • 使用本容器的iterator()返回一個Iterator,然后通過Iterator的next()返回第一個元素;
  • 使用Iterator的hasNext()判斷容器中是否還有元素,如果有,可以使用next()獲取下一個元素;
  • 可以通過remove()刪除迭代器返回的元素。
  • 2.2 ListIterator

    ListIterator只存在于List中,可用List.ListIterator()獲取

    支持在迭代器件向List中添加或刪除元素,并且可以在List中雙向滾動。

    2.3區(qū)別

    Iterator和ListIterator的區(qū)別:

    • Iterator只能正向遍歷集合,適用于獲取移除元素;
    • ListIterator繼承自Iterator,專門針對List,可以從兩個方向來遍歷List,同時(shí)支持元素的修改

    2.3 使用

    import java.util.ArrayList; import java.util.Collection; import java.util.Iterator;public class Main {public static void main(String[] args) {Collection c=new ArrayList();c.add("hello");c.add("world");c.add("java");if(c.contains("java"))c.add("android");for(Iterator it=c.iterator();it.hasNext();) {System.out.println(it.next());}} }

    運(yùn)行結(jié)果

    import java.util.ArrayList; import java.util.Collection; import java.util.Iterator;public class Main {public static void main(String[] args) {Collection c=new ArrayList();c.add("hello");c.add("world");c.add("java");Iterator it=c.iterator();while(it.hasNext()) {String s=(String)it.next();if(s.equals("java"))c.add("android");}for(Iterator is=c.iterator();is.hasNext();) {System.out.println(is.next());}} }

    出錯:

    并發(fā)修改異常。這通常是由于使用Iterator遍歷容器的同時(shí)又對容器做增加或刪除操作導(dǎo)致的,或者由于多線程操作導(dǎo)致,當(dāng)一個線程使用迭代器遍歷容器的同時(shí),另外一個線程對這個容器進(jìn)行增加后刪除操作。

    主要原因:當(dāng)容器調(diào)用iterator()返回Iterator對象時(shí),把容器中的包含對象的個數(shù)賦值給了一個變量expectedModCount,在調(diào)用next()時(shí)會比較變量expectedModeCount與容器中實(shí)際對象的個數(shù)modCount是否相等,若二者不等,則會拋出ConcurrentModificationException。

    解決方法:在遍歷過程中把需要刪除的對象保存在一個集合中,等遍歷結(jié)束后再調(diào)用removeAll()來刪除,或者使用iter.remove()。

    多線程情況的解決方法:

  • JDK 1.5引入了線程安全的容器,比如ConcurrentHashMap和CopyOnWriteArrayList。可以使用這些線程安全的容器替代費(fèi)線程安全的容器。
  • 在使用迭代器遍歷容器時(shí)對容器的操作放在synchronized代碼塊中,但是當(dāng)引用程序并發(fā)程度比較高時(shí),這會嚴(yán)重影響程序性能。
  • 2.4? 增強(qiáng)for循環(huán)

    for(數(shù)據(jù)類型 變量名:數(shù)組或集合){

    ? ?? ....

    }

    int[] arr={3,1,0,9}; for(int i:arr){System.out.println(i+1); }

    將arr中的元素值賦給i,i+1改變的是i的值,不是arr中元素的值。

    好處:代碼少,方便對容器的遍歷;

    缺點(diǎn):無索引,不可操作容器內(nèi)的元素。

    在增強(qiáng)for中不能修改集合,否則會發(fā)生并發(fā)修改異常——增強(qiáng)for底層是迭代器

    3. Collections

    此類完全由在 collection 上進(jìn)行操作或返回 collection 的靜態(tài)方法組成。

    如果為此類的方法所提供的 collection 或類對象為 null,則這些方法都將拋出 NullPointerException。

    3.1 Collection和Collections

    Collection:結(jié)合體系的最頂層,包含了集合體系的共性

    Collections:一個工具類,構(gòu)造方法私有,方法為static,用于操作Collection

    3.2 常用方法

    static? int binarySearch(List list,T key):使用二分搜索法搜索指定列表,以獲得指定對象在指定列表中地索引。

    • 前提:list有序,

    static void copy(List des,List src):?將所有元素從一個列表復(fù)制到另一個列表。

    • 目標(biāo)列表的長度至少等于源列表

    static void fill(List list,T obj):使用指定元素替換指定列表中的所有元素。

    static void reverse(List list):反轉(zhuǎn)指定列表中元素的順序。

    static void shuffle(List list):使用默認(rèn)隨機(jī)源對指定列表進(jìn)行置換。

    static void sort(List list):?根據(jù)元素的自然順序?qū)χ付斜戆瓷蜻M(jìn)行排序。

    static void swap(List list,int i,int j):在指定列表的指定位置處交換元素。

    返回值為void,說明備操作對象本身發(fā)生了變化

    返回值為一個新對象,說明被操作的對象一般不會發(fā)生變化。(特殊:Buffer的append())

    4. 泛型

    用來靈活地將數(shù)據(jù)類型應(yīng)用到不同的類、方法和接口中。

    將數(shù)據(jù)類型作為參數(shù)傳遞。

    public class Box<T> {// T stands for "Type"private T t;public void set(T t) { this.t = t; }public T get() { return t; } }

    4.1 定義格式

    修飾符? class? 類名<代表泛型的變量>{ ? }

    ArrayList<String>——編譯時(shí)限制arr.add(arg)若arg是String類型,編譯成功;若不是,編譯失敗

    但編譯后的class文件無泛型。——所以Java是偽泛型

    可以保證安全性嗎?——可以,因?yàn)椴环系臄?shù)據(jù)類型,首先編譯不會通過

    4.2 使用格式

    創(chuàng)建對象時(shí),確定泛型的類型。

    4.3 含有泛型的方法

    定義: 修飾符 <代表泛型的變量> 返回值類型 方法名(參數(shù)){...}

    使用:調(diào)用方法時(shí),確定泛型的類型

    4.4 好處

    避免了類型轉(zhuǎn)換的麻煩,將運(yùn)行時(shí)的ClassCastException轉(zhuǎn)移到了編譯時(shí)期的編譯失敗。

    4.5 泛型的通配

    :可匹配所有的數(shù)據(jù)類型

    Collection<?> coll

    Collection c=new ArrayList();——此處未規(guī)定泛型類型,所以是默認(rèn)類型Object

    此時(shí)使用增強(qiáng)for時(shí),for(Object obj:數(shù)組或集合)

    ?

    總結(jié)

    以上是生活随笔為你收集整理的集合-1(Collection、迭代器、Collections、泛型)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。