帶你輕松搞定Java面向?qū)ο蟮木幊?-數(shù)組,集合框架
一、數(shù)組
1.數(shù)組的定義
數(shù)組是為了解決同類數(shù)據(jù)整合擺放而提出的,可以理解為一組具有相同類型的變量的集合,它的每個(gè)元素都具有相同的數(shù)據(jù)類型。
2.數(shù)組的聲明
1.<data_type>[] <array_name>; 2.<data_type> <array_name>[];
例如定義保存學(xué)生成績(jī)的語(yǔ)法:
1.float[] scores; 2.float scores[];
雖說(shuō)兩種寫法都沒錯(cuò),但是按照J(rèn)ava語(yǔ)言的變成習(xí)慣,推薦各位采用第一種寫法,即把中括號(hào)放在數(shù)據(jù)類型和變量名中間。
注意:
- 數(shù)組的類型實(shí)際上是指數(shù)組元素的取值類型。對(duì)于同一個(gè)數(shù)組,其所有元素的數(shù)據(jù)類型都是相同的。
- 項(xiàng)目數(shù)組名的書寫規(guī)則應(yīng)符合標(biāo)識(shí)符的書寫規(guī)定。
- 數(shù)組名不能與其他變量名相同。
- 在數(shù)組聲明中包含數(shù)組長(zhǎng)度永遠(yuǎn)是不合法的,如float[] scores;。因?yàn)?,聲明的時(shí)候并沒有實(shí)例化任何對(duì)象(沒有分配空間),只有在實(shí)例化對(duì)象時(shí),JVM才分配空間,這時(shí)才與長(zhǎng)度有關(guān)。
3.數(shù)組的初始化
數(shù)組有兩種初始化
- 靜態(tài)初始化
靜態(tài)初始化的方式是在聲明數(shù)組變量的同時(shí)進(jìn)行的。這種方式不僅定義了數(shù)組中包含的元素的數(shù)量,而且制定了每個(gè)元素的值。
注意,靜態(tài)初始化應(yīng)該在一條語(yǔ)句內(nèi)完成,不能分開寫。
例如:
float[] scores = {93.5f,83,61,80}; int[] arr ={1,2,3,4,5};
- 動(dòng)態(tài)初始化
動(dòng)態(tài)初始化的方式是在聲明數(shù)組時(shí)就必須定義數(shù)組的大小,以及每個(gè)元素的初始值。如果要定義的數(shù)組長(zhǎng)度或數(shù)組數(shù)據(jù)只有在運(yùn)行時(shí)才能決定,就要使用動(dòng)態(tài)初始化。
注意,動(dòng)態(tài)初始化時(shí)也可以使用變量的值來(lái)定義數(shù)組大小
例如:
int[] arr; arr = new int[10]; char[] c = new char[100]; int[] d = new int[]{1,2,3,4};
抽象類的使用原則如下:
(1)抽象方法必須為public或者protected(因?yàn)槿绻麨閜rivate,則不能被子類繼承,子類便無(wú)法實(shí)現(xiàn)該方法),缺省情況下默認(rèn)為public;
(2)抽象類不能直接實(shí)例化,需要依靠子類采用向上轉(zhuǎn)型的方式處理;
(3)抽象類必須有子類,使用extends繼承,一個(gè)子類只能繼承一個(gè)抽象類;
(4)子類(如果不是抽象類)則必須覆寫抽象類之中的全部抽象方法(如果子類沒有實(shí)現(xiàn)父類的抽象方法,則必須將子類也定義為為abstract類。)
二、集合概述
在java.util包中提供了所有用到的集合類。
集合 簡(jiǎn)單來(lái)說(shuō)就是存儲(chǔ)對(duì)象的容器
集合中可存儲(chǔ)任意類型的對(duì)象,最重要的是長(zhǎng)度可變
不過(guò)集合類存放的都是對(duì)象的引用,而非對(duì)象本身,集合也不能存儲(chǔ)基本數(shù)據(jù)類型
下圖是集合框架:
三、Collection接口
1.Collection接口概述
Collection是單向集合。Set接口、List接口都是Collection接口的子接口
2.集合框架的三個(gè)組件
集合類主要有Set、List、Map
- Set(集):無(wú)序、不可重復(fù)
- List(列表):有序,可重復(fù) 常用的列表類有Vector、Stack、LinkedList、ArrayList
- Map(映射):保存的是鍵值對(duì)(key-value),映射中存儲(chǔ)的每個(gè)對(duì)象(value)都有一個(gè)相關(guān)的關(guān)鍵字(key)對(duì)象。一個(gè)Map對(duì)象的每一個(gè)關(guān)鍵字應(yīng)是惟一的(否則key可能對(duì)應(yīng)多個(gè)value),就是說(shuō)key-value是單向一對(duì)一的關(guān)系 常用的映射類有HashTable、HashMap、TreeMap
由于Set和List都是Collection的子接口,那么Set和List的所有實(shí)現(xiàn)類都實(shí)現(xiàn)了下面所示的Collection的方法
方法 | 摘要 |
---|---|
boolean add(E e) | 確保此集合包含指定的元素(可選操作) |
boolean addAll(Collection<? extends E> c) | 將指定集合中的所有元素添加到此集合(可選操作) |
void clear() | 從此集合中刪除所有元素(可選操作) |
boolean contains(Object o) | 如果此集合包含指定的元素,則返回 true ) |
boolean containsAll(Collection<?> c) | 如果此集合包含指定 集合中的所有元素,則返回true |
boolean isEmpty() | 如果此集合不包含元素,則返回 true |
Iterator iterator() | 返回此集合中的元素的迭代器 |
boolean remove(Object o) | 從該集合中刪除指定元素的單個(gè)實(shí)例(如果存在)(可選操作) |
Object[] toArray() | 返回一個(gè)包含此集合中所有元素的數(shù)組 |
T[] toArray(T[] a) | 返回包含此集合中所有元素的數(shù)組; 返回的數(shù)組的運(yùn)行時(shí)類型是指定數(shù)組的運(yùn)行時(shí)類型 |
3.Iterator接口
所謂的“Collection是所有集合類的跟接口”,并不意味著Collection就是“根”。其實(shí),Collection是Iterator接口的子接口,只不過(guò)Iterator(迭代器)不屬于集合的范疇而已,那么Iterator接口作用是什么呢?
Iterator叫做“迭代器”,它允許訪問(wèn)一個(gè)容器(container)對(duì)象中的各個(gè)元素,而又不需要公開該對(duì)象的內(nèi)部細(xì)節(jié),從定義上看,迭代器為容器而生。由Collection接口繼承了Iterator,所以所有集合對(duì)象都可以被迭代,Collection接口內(nèi)定義了 iterator() 方法,能獲得一個(gè)Iterator迭代器,從而實(shí)現(xiàn)對(duì)集合的迭代。
迭代器的用法:
Iterator it = Collection.iterator(); while(it.hasNext()){ Object obj = it.next(); }
Iterator如何對(duì)ArrayList進(jìn)行迭代
public class IteratorDemo { public static void main(String[] args) { //創(chuàng)建List集合對(duì)象 List<String> alist = new ArrayList<String>(); alist.add("a"); alist.add("b"); alist.add("c"); alist.add("d"); //設(shè)定迭代內(nèi)容為String對(duì)象 Iterator<String> it = alist.iterator(); while(it.hasNext()){ //此時(shí)就可以直接使用String來(lái)接收返回值了 String s = it.next(); System.out.println(s); } } }
四、List接口
List繼承了Collection,是有序的列表,該接口定義的元素是有序的且可重復(fù)的。在List接口下使用最多的就是ArryList實(shí)現(xiàn)類和LinkList實(shí)現(xiàn)類。
1.ArrayList類
ArrayList類是List接口的大小可變數(shù)組的實(shí)現(xiàn)(繼承AbstractList,同時(shí)實(shí)現(xiàn)List接口)。
ArrayList是動(dòng)態(tài)數(shù)組,所以保持了數(shù)組的特性。在ArrayList執(zhí)行查詢操作將非常快,但如果執(zhí)行增加(特別是插入)、刪除操作,效率低下。
ArrayList類的特點(diǎn)如下:
- 大小是可變的,是自動(dòng)增長(zhǎng)的,可動(dòng)態(tài)的增加或減少元素,可存儲(chǔ)null值
- 實(shí)現(xiàn)了ICollection 和 IList 接口
- 它是非同步的集合類
- 元素可以重復(fù)
構(gòu)造方法
在這里我只寫一種構(gòu)造方法
ArrayList<Object> alist = new ArrayList<Object>;
ArrayList類的方法:
方法 | 摘要 |
---|---|
boolean add(E e) | 將指定的元素追加到此列表的末尾 |
void add(int index, E element) | 在此列表中的指定位置插入指定的元素。 |
boolean addAll(Collection<? extends E> c) | 按指定集合的Iterator返回的順序?qū)⒅付现械乃性刈芳拥酱肆斜淼哪┪?/td> |
boolean addAll(int index, Collection<? extends E> c) | 將指定集合中的所有元素插入到此列表中,從指定的位置開始 |
void clear() | 從此集合中刪除所有元素 |
Object clone() | 返回此 ArrayList實(shí)例的淺拷貝 |
boolean contains(Object o) | 如果此集合包含指定的元素,則返回 true ) |
void ensureCapacity(int minCapacity) | 如果需要,增加此 ArrayList實(shí)例的容量,以確保它可以至少保存最小容量參數(shù)指定的元素?cái)?shù) |
void forEach(Consumer<? super E> action) | 對(duì) Iterable的每個(gè)元素執(zhí)行給定的操作,直到所有元素都被處理或動(dòng)作引發(fā)異常 |
E get(int index) | 返回此列表中指定位置的元素 |
int indexOf(Object o) | 返回此列表中指定元素的第一次出現(xiàn)的索引,如果此列表不包含元素,則返回-1 |
boolean isEmpty() | 如果此列表不包含元素,則返回 true |
E remove(int index) | 刪除該列表中指定位置的元素 |
boolean remove(Object o) | 從列表中刪除指定元素的第一個(gè)出現(xiàn)(如果存在) |
E set(int index, E element) | 用指定的元素替換此列表中指定位置的元素 |
int size() | 返回此列表中的元素?cái)?shù) |
List subList(int fromIndex, int toIndex) | 返回此列表中指定的 fromIndex (包括)和 toIndex之間的獨(dú)占視圖 |
Object[] toArray() | 以正確的順序(從第一個(gè)到最后一個(gè)元素)返回一個(gè)包含此列表中所有元素的數(shù)組 |
T[] toArray(T[] a) | 以正確的順序返回一個(gè)包含此列表中所有元素的數(shù)組(從第一個(gè)到最后一個(gè)元素); 返回的數(shù)組的運(yùn)行時(shí)類型是指定數(shù)組的運(yùn)行時(shí)類型 |
2.LinkedList類
ArrayList類用于創(chuàng)建鏈表數(shù)據(jù)結(jié)構(gòu)對(duì)象。與ArrayList一樣,LinkedList也實(shí)現(xiàn)了List接口,這說(shuō)明可根據(jù)索引來(lái)查詢集合內(nèi)的元素。
由于LinkedList實(shí)現(xiàn)了雙向循環(huán)鏈表,所以可以很快捷地插入或刪除元素;但由于鏈表的特性,如果對(duì)LinkedList執(zhí)行查詢,那么效率也非常低。可以說(shuō)ArrayList和LinkedList是互補(bǔ)關(guān)系
構(gòu)造方法
在這里我只寫一種構(gòu)造方法
LinkedList<Object> llist = new LinkedList<Object>;
LinkedList類的方法:
方法 | 摘要 |
---|---|
boolean add(E e) | 將指定的元素追加到此列表的末尾 |
void add(int index, E element) | 在此列表中的指定位置插入指定的元素 |
boolean addAll(Collection<? extends E> c) | 按照指定集合的迭代器返回的順序?qū)⒅付现械乃性刈芳拥酱肆斜淼哪┪?/td> |
boolean addAll(int index, Collection<? extends E> c) | 將指定集合中的所有元素插入到此列表中,從指定的位置開始 |
void addFirst(E e) | 在該列表開頭插入指定的元素 |
void addLast(E e) | 將指定的元素追加到此列表的末尾 |
void clear() | 從列表中刪除所有元素 |
boolean contains(Object o) | 如果此列表包含指定的元素,則返回 true |
E element() | 檢索但不刪除此列表的頭(第一個(gè)元素) |
E get(int index) | 返回此列表中指定位置的元素 |
E getFirst() | 返回此列表中的第一個(gè)元素 |
E getLast() | 返回此列表中的最后一個(gè)元素 |
int indexOf(Object o) | 返回此列表中指定元素的第一次出現(xiàn)的索引,如果此列表不包含元素,則返回-1 |
int lastIndexOf(Object o) | 返回此列表中指定元素的最后一次出現(xiàn)的索引,如果此列表不包含元素,則返回-1 |
ListIterator listIterator(int index) | 從列表中的指定位置開始,返回此列表中元素的列表迭代器(按適當(dāng)?shù)捻樞颍?/td> |
E remove() | 檢索并刪除此列表的頭(第一個(gè)元素) |
E remove(int index) | 刪除該列表中指定位置的元素 |
boolean remove(Object o) | 從列表中刪除指定元素的第一個(gè)出現(xiàn)(如果存在) |
E removeFirst() | 從此列表中刪除并返回第一個(gè)元素 |
E removeLast() | 從此列表中刪除并返回最后一個(gè)元素 |
E set(int index, E element) | 用指定的元素替換此列表中指定位置的元素 |
int size() | 返回此列表中的元素?cái)?shù) |
Object[] toArray() | 以正確的順序(從第一個(gè)到最后一個(gè)元素)返回一個(gè)包含此列表中所有元素的數(shù)組 |
T[] toArray(T[] a) | 以正確的順序返回一個(gè)包含此列表中所有元素的數(shù)組(從第一個(gè)到最后一個(gè)元素); 返回的數(shù)組的運(yùn)行時(shí)類型是指定數(shù)組的運(yùn)行時(shí)類型 |
五、Set接口
Set接口 繼承Collection接口。他存儲(chǔ)的是無(wú)序的,惟一的集合元素
1.HashSet類
實(shí)現(xiàn)了Set接口,是基于HashMap實(shí)現(xiàn),存儲(chǔ)不重復(fù),無(wú)序值
HashSet 是根據(jù)對(duì)象的哈希值來(lái)確定元素在集合中的存儲(chǔ)位置,元素再插入時(shí)就確定了存儲(chǔ)位置,因此,元素在集合中的存儲(chǔ)位置時(shí)固定的(無(wú)序是指輸出順序 與存出順序不一致),具有良好的存儲(chǔ)和查詢性能(存儲(chǔ)速度快)。
構(gòu)造方法
在這里我只寫一種構(gòu)造方法
Set ss = new HashSet();
HashSet 類常用的方法:
方法 | 摘要 |
---|---|
boolean add(E e) | 將指定的元素添加到此集合(如果尚未存在) |
boolean remove(Object o) | 如果存在,則從該集合中刪除指定的元素 |
int size() | 返回此集合中的元素?cái)?shù)(其基數(shù)) |
六、Map接口
Map接口 是一個(gè)根接口,他存儲(chǔ)的是鍵-值對(duì)(key-value),其中key不允許重復(fù),value允許重復(fù)。
1.HashMap類
HashMap類 實(shí)現(xiàn)了Map接口,存儲(chǔ)的是無(wú)序的鍵-值對(duì)(key-value)。
- HashMap的key是用Set集合來(lái)存放,所以想做到key不允許重復(fù),key對(duì)應(yīng)的類需要重寫hashCode()和equals()方法
- HashMap是線程不安全
- HashMap中的元素的位置是不定時(shí)的更新,即元素位置不固定
構(gòu)造方法
在這里我只寫一種構(gòu)造方法
HashMap map = new HashMap();
HashMap 類常用的方法:
方法 | 摘要 |
---|---|
V put(K key, V value) | 將指定的值與此映射中的指定鍵相關(guān)聯(lián) |
V get(Object key) | 返回到指定鍵所映射的值,或 null如果此映射包含該鍵的映射 |
int size() | 返回此地圖中鍵值映射的數(shù)量 |
V remove(Object key) | 從該地圖中刪除指定鍵的映射(如果存在) |
七、泛型
為什么要使用泛型程序設(shè)計(jì)?以常用的ArrayList類為例,在使用ArrayList的時(shí)候常遇到以下兩個(gè)問(wèn)題
- 當(dāng)獲取一個(gè)值的時(shí)候必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換
- 當(dāng)向其中放入值的時(shí)候沒有任何約束,只要是對(duì)象就行。
這樣,如果處理數(shù)據(jù)類型時(shí)稍微出現(xiàn)一點(diǎn)問(wèn)題,程序就會(huì)報(bào)錯(cuò)!
泛型提供了一個(gè)解決方案:類型參數(shù)(type parameters)。如果ArrayList類有一個(gè)類型參數(shù)指示元素的類型,就沒有問(wèn)題了
ArrayList<String> arr = new ArrayList<String>();
這時(shí)程序員可以很方便的分辨其中元素的類型,編譯器也可以很好的利用這個(gè)信息。所以當(dāng)調(diào)用get()方法時(shí),不需要執(zhí)行類型轉(zhuǎn)換,編譯器就可以返回值類型為String。
String str = arr.get(0);
編譯器還知道ArrayList < String> 中add()方法有一個(gè)類型為String的參數(shù)。這將比直接使用Object類型的參數(shù)安全。如果在嘗試向其中放入非String的數(shù)據(jù),編譯器就會(huì)發(fā)出通知,以避免發(fā)生錯(cuò)誤。
arr.add(new Integer(1));
總結(jié)
本篇文章的內(nèi)容就到這了,希望大家可以喜歡,也希望大家可以多多關(guān)注腳本之家的其他精彩內(nèi)容!
相關(guān)文章
java實(shí)現(xiàn)兩個(gè)線程交替打印的實(shí)例代碼
在本篇文章里小編給大家整理的是一篇關(guān)于java實(shí)現(xiàn)兩個(gè)線程交替打印的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們參考下。2019-12-12Java Spring循環(huán)依賴原理與bean的生命周期圖文案例詳解
這篇文章主要介紹了Spring循環(huán)依賴原理與bean的生命周期圖文案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09SpringBoot2+Netty+WebSocket(netty實(shí)現(xiàn)websocket支持URL參數(shù))問(wèn)題記錄
Netty?是一個(gè)利用?Java?的高級(jí)網(wǎng)絡(luò)的能力,隱藏其背后的復(fù)雜性而提供一個(gè)易于使用的?API?的客戶端/服務(wù)器框架,這篇文章主要介紹了SpringBoot2+Netty+WebSocket(netty實(shí)現(xiàn)websocket,支持URL參數(shù)),需要的朋友可以參考下2023-12-12Java中for(;;)和while(true)的區(qū)別
這篇文章主要介紹了 Java中for(;;)和while(true)的區(qū)別,文章圍繞for(;;)和while(true)的相關(guān)自來(lái)哦展開詳細(xì)內(nèi)容,需要的小伙伴可以參考一下,希望對(duì)大家有所幫助2021-11-11SpringBoot如何接收Post請(qǐng)求Body里面的參數(shù)
這篇文章主要介紹了SpringBoot如何接收Post請(qǐng)求Body里面的參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03OutOfMemoryError內(nèi)存不足和StackOverflowError堆棧溢出示例詳解
這篇文章主要為大家介紹了OutOfMemoryError內(nèi)存不足和StackOverflowError堆棧溢出示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09