java集合框架詳解
1.java集合框架概述
java SE包含了由一組類和接口組成的java集合框架(java Collection Framework,簡(jiǎn)稱JCF),其主要功能是用來(lái)將存儲(chǔ)的數(shù)據(jù)以某種結(jié)構(gòu)組織,并以特定的方式來(lái)訪問(wèn)這些數(shù)據(jù),其目標(biāo)是提供一個(gè)處理對(duì)象集合的通用框架,減少程序員處理不同對(duì)象集合時(shí)的編碼量。
集合類中的一些區(qū)別,除了它們是否支持重復(fù)元素操作外,還包括元素是否有順序,以及是否允許添加null元素。java集合框架中根據(jù)這三個(gè)區(qū)別,將對(duì)象的存儲(chǔ)方式分為三種類型,分別是:
- Set(集):對(duì)象容器中的對(duì)象沒(méi)有順序,且不能重復(fù)。
- List(列表):對(duì)象容器中的對(duì)象按照索引順序排序,而且可以有重復(fù)的對(duì)象。
- Map(映射):對(duì)象容器中的元素包含一對(duì)“鍵對(duì)象-值對(duì)象”映射,其中鍵對(duì)象不能重復(fù),值對(duì)象可以重復(fù)。
為支持對(duì)象的排序和遍歷訪問(wèn)操作,java集合框架中又提供了幾個(gè)接口:
- 接口SortedSet為Set類型容器提供拍戲功能。
- 接口SortedMap為Map類型容器提供對(duì)鍵對(duì)象的排序。
- 接口Comparable和comparator用來(lái)實(shí)現(xiàn)集合中對(duì)象的排序。
2.Collection接口和Iterator接口
Collection接口中定義了Collection對(duì)象共有的一些基本方法
| 方法 | 描述 |
| int size() | 返回當(dāng)前集合中包含的元素個(gè)數(shù) |
| isEmpyt() | 判斷集合中是否含有元素 |
| boolean contains(Objact o) | 判斷集合中是否含有某一指定元素 |
| add(Objact o) | 向集合中添加某一個(gè)元素 |
| remove(Objact o) | 從集合中刪除某一元素 |
| Iterator iterator() | 返回一個(gè)遍歷器,用來(lái)訪問(wèn)集合中的各個(gè)元素 |
Iterator接口是一種用于遍歷集合的接口。
| 方法 | 描述 |
| hasNext() | 如果集合中還有更多元素,該方法返回true |
| next() | 返回集合中的下一個(gè)元素 |
| remove() | 刪除Iterator返回的最后一個(gè)元素 |
1.List接口
List接口繼承自Collection接口,它有如下特點(diǎn):
- List中的元素是有順序的。
- List通常允許重復(fù)元素。
- List的實(shí)現(xiàn)類通常支持null元素。
- 可以通過(guò)索引訪問(wèn)List對(duì)象容器中的元素。
List接口最常用的實(shí)現(xiàn)類是ArrayList類和LinkedList類。
1).ArrayList
程序?qū)嵗?nbsp;
package lei;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add(1);
list.add("zhangsan");
list.add(false);
list.add('a');
list.add(0, "lisi");
list.add(1);
list.remove(1);
list.remove(2);
list.set(0, "wangwu");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
Object類定義的equals()方法只有在傳遞給該方法的對(duì)象與調(diào)用該方法的對(duì)象是同一對(duì)象的時(shí)候,才會(huì)返回true??梢酝ㄟ^(guò)重寫(xiě)equals()方法來(lái)把具有相同狀態(tài)的兩個(gè)對(duì)象被看做是同一對(duì)象。
2).LinkedList
| 方法 | 描述 |
| void addFirst | 在鏈表開(kāi)頭添加一個(gè)對(duì)象 |
| void addLast | 在鏈表末尾添加一個(gè)對(duì)象 |
| getFirst() | 返回鏈表中的第一個(gè)元素 |
| getLast() | 返回鏈表中的最后一個(gè)元素 |
| removeFirst() | 刪除鏈表中的第一個(gè)元素 |
| removeLast() | 刪除鏈表中的最后一個(gè)元素 |
程序?qū)嵗?/p>
package lei;
import java.util.LinkedList;
import java.util.List;
public class Test2 {
public static void main(String[] args) {
LinkedList l=new LinkedList<>();
l.add("zhangsan");
l.add("lisi");
l.addFirst(1);
l.addLast(4);
System.out.println(l.getFirst());
System.out.println(l.getLast());
l.removeFirst();
l.removeLast();
for (int i = 0; i < l.size(); i++) {
System.out.println(l.get(i));
}
}
}
LinkedList與ArrayList的選擇
如果列表需要快速存取,但不經(jīng)常進(jìn)行元素的插入和刪除操作,那么選擇ArrayList會(huì)好一些;如果需要對(duì);列表進(jìn)行頻繁的插入和刪除操作,那么就應(yīng)該選擇LinkedList。
2.set接口
set接口繼承自Collectiion接口,同時(shí)也繼承了Collection接口的全部方法。set接口有以下特點(diǎn):
- Set類型容器中不能包含重復(fù)元素。當(dāng)加入一個(gè)元素到容器中時(shí),要比較元素的內(nèi)容是否存在重復(fù)的,所以加入Set類型對(duì)象容器的對(duì)象必須重寫(xiě)equals()方法。
- 元素能能有順序,也可能沒(méi)有順序。
- 因?yàn)樵乜赡軟](méi)有順序,所以不能基于下標(biāo)訪問(wèn)Set中費(fèi)元素。
實(shí)現(xiàn)Set接口最常用的是HashSet類和TreeSet類。
1).Hashset
Hashset類是基于哈希算法的Set接口實(shí)現(xiàn),它主要有如下幾個(gè)特點(diǎn):
- 當(dāng)遍歷Hashset時(shí),其中的元素是沒(méi)有順序的。
- Hashset中不允許出現(xiàn)重復(fù)元素。這里的重復(fù)元素是指有相同的哈希碼,并且用equals()方法進(jìn)行比較時(shí),返回true的兩個(gè)對(duì)象。
- 允許包含null元素。
如果我們編寫(xiě)的類重新定義了equals方法,那么這個(gè)類也必須重新定義hashCode()方法,并且保證當(dāng)兩個(gè)對(duì)象用equals方法比較結(jié)果為true時(shí),這兩個(gè)對(duì)象的hashCode()方法的返回值相等。
程序?qū)嵗?/p>
package lei;
import java.util.HashSet;
import java.util.Set;
public class Test4 {
public static void main(String[] args) {
Set<String> set=new HashSet<String>();
set.add("zhangsan");
set.add("lisi");
for(String s:set){
System.out.println(s);
}
}
}
2).TreeSet
TreeSet類不僅實(shí)現(xiàn)類Set接口,還實(shí)現(xiàn)了SortedSet接口,從而保證集合中的對(duì)象按照一定的順序排序。當(dāng)向TreeSet集合中添加一個(gè)對(duì)象時(shí),會(huì)把它插入到有序的對(duì)象序列中,但是這種排序并不是按照對(duì)象添加的順序排序,而是按照一定的算法來(lái)排序。
TreeSet使用元素的自然順序?qū)υ剡M(jìn)行排序,或者根據(jù)創(chuàng)建Set時(shí)提供的Comparator進(jìn)行排序。TreeSet支持自然排序和自定義排序兩種排序方式。
3.Map接口
Map(映射)接口是java集合框架中不同于Collection接口的另一個(gè)重要接口,它對(duì)應(yīng)的是在一種從鍵(Key)到值(Value)的對(duì)應(yīng)關(guān)系的集合。Map類型的對(duì)象容器里面保存著兩組對(duì)象,一組對(duì)象用于保存Map里的Key,另外一組用于保存Value。Key和Value可以升級(jí)任何引用類型的數(shù)據(jù)。Key不能重復(fù),但是Value可以重復(fù)。
1).HashMap
HashMap是基于哈希算法的Map接口的實(shí)現(xiàn)。HashMap將它的鍵保存在哈希表中進(jìn)行維護(hù),鍵是唯一的。但是,HashMap并不保證鍵以特定順序排列,特別是不保證順序永久不變。
HashMap類實(shí)現(xiàn)了Map接口,從而具有Map接口的所有方法。
package day1228;
import java.util.*;
public class HashMapDemo {
public static void main(String[] args) {
// 創(chuàng)建一個(gè)新的HashMap
Map<String, String> map = new HashMap<String, String>();
map.put("a1", "xiao");
map.put("b2", "xiaol");
map.put("a4", "xiaosd");
map.put("b1", "12a");
map.put("a3", "1");
// 使用iterator遍歷 鍵和值
System.out.println("之前的Map值是:");
Set<String> keys = map.keySet();
for (Iterator<String> i = keys.iterator(); i.hasNext();) {
String key = i.next();
String value = map.get(key);
System.out.println(key + "=" + value);
}
// 刪除鍵為"a4"的值
System.out.println("\n刪除鍵值為a4的元素");
map.remove("a4");
// //使用iterator遍歷 鍵和值
System.out.println("\n之后的Map值:");
keys = map.keySet();
for (Iterator<String> i = keys.iterator(); i.hasNext();) {
String key = i.next();
String value = map.get(key);
System.out.println(key + "=" + value);
}
}
}
2).TreeMap
TreeMap類是基于紅黑樹(shù)算法的Map接口實(shí)現(xiàn)。TreeMap中鍵的存放方式與TreeSet相似,它將鍵存放在樹(shù)中,鍵的順序按照自然順序或者自定義順序兩種方式排列。
程序?qū)嵗?/p>
package day1228;
import java.util.*;
public class TreeMapDemo {
public static void main(String[] args) {
//創(chuàng)建一個(gè)新的TreeMap
Map<Integer, String> map = new TreeMap<Integer, String>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");
map.put(4, "four");
map.put(5, "five");
//使用iterator顯示鍵和值
System.out.println("之前的map值為:");
Set<Integer> keys=map.keySet();
for(Object key:keys){
String value=map.get(key);
System.out.println(key+"="+value);
}
//刪除鍵為3的值
System.out.println("\n刪除鍵值為3的元素");
map.remove(3);
//使用iterator顯示鍵和值
System.out.println("\n之后的值Map為:");
for(Object key:keys){
String value=map.get(key);
System.out.println(key+"="+value);
}
}
}
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
- JAVA集合框架工具類自定義Collections集合方法
- 簡(jiǎn)單了解java集合框架LinkedList使用方法
- Java集合框架迭代器Iterator實(shí)現(xiàn)原理解析
- Java集合框架Collections原理及用法實(shí)例
- JAVA集合框架Map特性及實(shí)例解析
- 通過(guò)實(shí)例學(xué)習(xí)Java集合框架HashSet
- Java集合框架源碼分析之LinkedHashMap詳解
- Java集合框架LinkedList詳解及實(shí)例
- Java集合框架中迭代器Iterator解析
- Java集合框架之Collection接口詳解
- 一道Java集合框架題 多種解題思路
- Java基礎(chǔ)詳解之集合框架工具Collections
相關(guān)文章
簡(jiǎn)單易用的Spring?Boot郵件發(fā)送demo
本文將介紹如何使用Spring?Boot發(fā)送郵件,我們將演示如何配置SMTP郵件服務(wù)器,創(chuàng)建一個(gè)郵件模板,以及如何使用JavaMailSender發(fā)送郵件,我們還將介紹如何測(cè)試我們的郵件發(fā)送代碼2023-12-12
Java構(gòu)造方法實(shí)例詳解(動(dòng)力節(jié)點(diǎn)java學(xué)院整理)
其實(shí)java構(gòu)造方法很簡(jiǎn)單,下面通過(guò)示例給大家分享java構(gòu)造方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-04-04
IDEA中springboot提示java:找不到符號(hào)符號(hào):變量log問(wèn)題
這篇文章主要介紹了IDEA中springboot提示java:找不到符號(hào)符號(hào):變量log問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
SpringMVC中的HandlerMappingIntrospector工具類詳解
這篇文章主要介紹了SpringMVC中的HandlerMappingIntrospector工具類詳解,這是一個(gè)Spring MVC助手類,用于集合應(yīng)用所配置的HandlerMapping(url pattern和請(qǐng)求處理handler之間的映射)表,用于獲取針對(duì)某個(gè)請(qǐng)求的如下信息,需要的朋友可以參考下2023-12-12
Java二叉樹(shù)的遍歷思想及核心代碼實(shí)現(xiàn)
今天小編就為大家分享一篇關(guān)于Java二叉樹(shù)的遍歷思想及核心代碼實(shí)現(xiàn),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01

