集合-1(Collection、迭代器、Collections、泛型)
1. Collection
Collection是整個(gè)集合框架的基礎(chǔ),作用只是提供維護(hù)一組對象的基本接口。
1.1 創(chuàng)建集合
父類引用指向子類對象
Collection<元素類型> 變量名=new ArrayList<元素類型>();//只可存儲(chǔ)<>指定的類型Collection 變量名=new ArrayList();//集合元素默認(rèn)為Object,任何元素類型都可存儲(chǔ)1.2 求元素個(gè)數(shù)
size():返回Collection中元素的個(gè)數(shù)
- length:數(shù)組的屬性,返回?cái)?shù)組中元素個(gè)數(shù)
- length():字符串的方法,返回其中元素個(gè)數(shù)
1.3 遍歷方式
通用獲取方式:
1、無get方法,得用Object[] toArray(),轉(zhuǎn)換為數(shù)組后,才可用get();
2、iterator(),可返回一個(gè)迭代器對象,可通過迭代對象來迭代集合。
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í),都自動(dòng)裝箱了
- 存儲(chǔ)時(shí),提升為了Object,取出時(shí)要使用元素的特有內(nèi)容時(shí),應(yīng)向下轉(zhuǎn)型。
- 如果集合中存儲(chǔ)的是多種對象,此時(shí)進(jìn)行向下轉(zhuǎn)型是會(huì)發(fā)生類型轉(zhuǎn)換異常ClassCastException
2. 迭代器
Iterator是一個(gè)對象,工作是遍歷并選擇序列中的對象。創(chuàng)建代價(jià)小,又稱為輕量級(jí)的容器。
2.1使用步驟
2.2 ListIterator
ListIterator只存在于List中,可用List.ListIterator()獲取
支持在迭代器件向List中添加或刪除元素,并且可以在List中雙向滾動(dòng)。
2.3區(qū)別
Iterator和ListIterator的區(qū)別:
- Iterator只能正向遍歷集合,適用于獲取移除元素;
- ListIterator繼承自Iterator,專門針對List,可以從兩個(gè)方向來遍歷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());}} }出錯(cuò):
并發(fā)修改異常。這通常是由于使用Iterator遍歷容器的同時(shí)又對容器做增加或刪除操作導(dǎo)致的,或者由于多線程操作導(dǎo)致,當(dāng)一個(gè)線程使用迭代器遍歷容器的同時(shí),另外一個(gè)線程對這個(gè)容器進(jìn)行增加后刪除操作。
主要原因:當(dāng)容器調(diào)用iterator()返回Iterator對象時(shí),把容器中的包含對象的個(gè)數(shù)賦值給了一個(gè)變量expectedModCount,在調(diào)用next()時(shí)會(huì)比較變量expectedModeCount與容器中實(shí)際對象的個(gè)數(shù)modCount是否相等,若二者不等,則會(huì)拋出ConcurrentModificationException。
解決方法:在遍歷過程中把需要?jiǎng)h除的對象保存在一個(gè)集合中,等遍歷結(jié)束后再調(diào)用removeAll()來刪除,或者使用iter.remove()。
多線程情況的解決方法:
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中不能修改集合,否則會(huì)發(fā)生并發(fā)修改異常——增強(qiáng)for底層是迭代器
3. Collections
此類完全由在 collection 上進(jìn)行操作或返回 collection 的靜態(tài)方法組成。
如果為此類的方法所提供的 collection 或類對象為 null,則這些方法都將拋出 NullPointerException。
3.1 Collection和Collections
Collection:結(jié)合體系的最頂層,包含了集合體系的共性
Collections:一個(gè)工具類,構(gòu)造方法私有,方法為static,用于操作Collection
3.2 常用方法
static? int binarySearch(List list,T key):使用二分搜索法搜索指定列表,以獲得指定對象在指定列表中地索引。
- 前提:list有序,
static void copy(List des,List src):?將所有元素從一個(gè)列表復(fù)制到另一個(gè)列表。
- 目標(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ā)生了變化
返回值為一個(gè)新對象,說明被操作的對象一般不會(huì)發(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ù)類型,首先編譯不會(huì)通過
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 类加载、类加载器、反射
- 下一篇: 集合-2(Set(HashSet、Tre