1.集合是什么?
Java集合類存放于 java.util 包中,是一個(gè)用來存放對(duì)象的容器。
注意:①、集合只能存放對(duì)象。比如存一個(gè) int 型數(shù)據(jù) 1放入集合中,其實(shí)它是自動(dòng)轉(zhuǎn)換成 Integer 類后存入的,Java中每一種基本類型都有對(duì)應(yīng)的引用類型。
②、集合存放的是多個(gè)對(duì)象的引用,對(duì)象本身還是放在堆內(nèi)存中。
③、集合可以存放不同類型,不限數(shù)量的數(shù)據(jù)類型。集合的元素個(gè)數(shù)是可變的。
2.集合的類型
Collection抽象接口,集合類型主要有3種:set(集)、list(列表,數(shù)組)和map(映射)。
3.Collection接口方法
定義一個(gè)集合:
Collection<String> list = new ArrayList<>();
- 添加元素
//添加元素
list.add("jack");
list.add("merry");
System.out.println(list);
- 刪除元素
list.remove("merry");
System.out.println(list);
- 獲取元素個(gè)數(shù)
//獲取元素個(gè)數(shù)
System.out.println(list.size());
- 判斷是否包含某一個(gè)元素
if (list.contains("jack")){
System.out.println("有jack");
} else{
System.out.println("沒有jack");
}
- 判讀是否為空
if (list.isEmpty()){
System.out.println("是空的");
} else {
System.out.println("不是空的");
}
- 判斷兩個(gè)集合是否相同
Collection<String> list2 = new ArrayList<>();
list2.add("jack");
list2.add("merry");
if (list.equals(list2)){
System.out.println("兩個(gè)集合相同");
} else {
System.out.println("兩個(gè)集合不相同");
}
- 清空集合
list.clear();
System.out.println(list);
3.1集合的遍歷
<1>.使用Iterator來遍歷
hasNext 判斷是否有元素
next 獲取下一個(gè)對(duì)象
remove 刪除當(dāng)前遍歷過的對(duì)象
Collection<String> list2 = new ArrayList<>();
Iterator iterator = list2.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
<2>.for-each 增強(qiáng)for循環(huán) 快速循環(huán)
Collection<String> list2 = new ArrayList<>();
for (String obj: list2) {
System.out.println(obj);
}
<3>.for-i循環(huán)
Collection<String> list2 = new ArrayList<>();
for (int i = 0; i < list2.size(); i++) {
System.out.println(((ArrayList<String>) list2).get(i));
}
3.2、List(有序、可重復(fù))
繼承于Collection
List里存放的對(duì)象是有序的,同時(shí)也是可以重復(fù)的,List關(guān)注的是索引,擁有一系列和索引相關(guān)的方法,查詢速度快。因?yàn)橥鵯ist集合里插入或刪除數(shù)據(jù)時(shí),會(huì)伴隨著后面數(shù)據(jù)的移動(dòng),所有插入刪除數(shù)據(jù)速度慢。
ArrayList 是連續(xù)的內(nèi)存空間
優(yōu)點(diǎn):訪問方便。 缺點(diǎn):刪除添加效率低
LinkedArrayList 內(nèi)部使用鏈表實(shí)現(xiàn),不一定連續(xù)(基本不連續(xù))
優(yōu)點(diǎn):增加刪除效率高。 缺點(diǎn):訪問不方便
ArrayList的使用:
ArrayList<Integer> score = new ArrayList<>();
score.add(2);
score.add(3);//在末尾添加
score.add(0,1);//在指定位置插入
System.out.println(score);
訪問指定元素:
score.get(1);
修改一個(gè)元素:
score.set(0,0);
System.out.println(score);
刪除:
score.remove(0);//刪除指定元素
System.out.println(score);
score.remove((Integer)2);//刪除指定的對(duì)象
System.out.println(score);
score.clear();
System.out.println(score);
- 將一個(gè)集合里面的內(nèi)容添加到當(dāng)前的集合中:
ArrayList<Integer> a2 = new ArrayList<>();
a2.add(1);
a2.add(2);
a2.add(3);
score.addAll(a2);
System.out.println(score);
- 取兩個(gè)集合的交集:
ArrayList<Integer> a3 = new ArrayList<>();
a3.add(1);
a3.add(2);
score.retainAll(a3);//取兩個(gè)集合的交集
System.out.println(score);
- 訪問某個(gè)對(duì)象在集合里面的索引:
ArrayList<Integer> a4 = new ArrayList<>();
a4.add(1);
a4.add(2);
a4.add(2);
a4.add(1);
System.out.println(score.indexOf(1));//第一次出現(xiàn)的位置
System.out.println(score.lastIndexOf(1));//最后一次出現(xiàn)的位置
- 將ArrayList轉(zhuǎn)化為普通數(shù)組:
Integer[] objects = new Integer[a4.size()];
a4.toArray(objects);
for (Integer i: objects) {
System.out.println(i);
}
- 獲取集合某個(gè)范圍的子集合:
List<Integer>integers = a4.subList(1,3);
System.out.println(integers);
3.3 Lambda表達(dá)式
Lambda表達(dá)式,也可稱為閉包,是一個(gè)匿名函數(shù),即沒有函數(shù)名的函數(shù),它是推動(dòng)java8 發(fā)布的最重要的新特性。
Lambda允許把函數(shù)作為一個(gè)方法參數(shù)(函數(shù)作為參數(shù)傳遞進(jìn)方法中)。
使用Lambda表達(dá)式可以使代碼變得更簡(jiǎn)潔緊湊。
舉一個(gè)例子來使用一下。先定義一個(gè)數(shù)組,添加幾個(gè)元素:
ArrayList<Integer> nums = new ArrayList<>();
nums.add(1);
nums.add(2);
nums.add(3);
nums.add(4);
使用如下:
- 方法一
//Lambda表達(dá)式
nums.removeIf(obj -> obj % 2 == 0);
- 方法二
for (int i = 0; i < nums.size(); i++) {
Integer obj = nums.get(i);
if (obj % 2 == 0){
nums.remove(obj);
i--;
}
}
System.out.println(nums);
//執(zhí)行結(jié)果
[1, 3]
閉包 enclusure 把函數(shù)作為一個(gè)方法的參數(shù)
定義一個(gè)接口,這個(gè)接口里面只有一個(gè)方法。
interface Show{
void customShow(int element);
}
定義一個(gè)類實(shí)現(xiàn)這個(gè)接口。
class YANClass implements Show{
@Override
public void customShow(int element) {
System.out.println(element);
}
}
定義一個(gè)類ArrayClass,寫一個(gè)方法,其中一個(gè)參數(shù)為接口類型,并調(diào)用接口定義的方法。
//閉包 enclusure 把函數(shù)作為一個(gè)方法的參數(shù)
class ArrayClass{
public void test(int[] target, Show s){
for (int element: target){
s.customShow(element);
}
}
}
1.使用方式:定義一個(gè)類實(shí)現(xiàn)接口
ArrayClass ac = new ArrayClass();
int[] num = {1,2,3,4,5,6};
YANClass yc = new YANClass();
ac.test(num, yc);
2.使用匿名類
ArrayClass ac = new ArrayClass();
int[] num = {1,2,3,4,5,6};
ac.test(num, new Show() {
@Override
public void customShow(int element) {
System.out.println(element);
}
});
3.使用Lambda表達(dá)式 :如果參數(shù)是一個(gè)接口類,且接口里面只有一個(gè)方法,可以省略方法名。
ArrayClass ac = new ArrayClass();
int[] num = {1,2,3,4,5,6};
ac.test(num, (int element) -> {
System.out.println(element);
});
4.如果只有一個(gè)參數(shù) 參數(shù)類型可以省略
ArrayClass ac = new ArrayClass();
int[] num = {1,2,3,4,5,6};
ac.test(num, element -> {
System.out.println(element);
});
5.如果代碼塊里面只有一行代碼,大括號(hào)可以省略
ArrayClass ac = new ArrayClass();
int[] num = {1,2,3,4,5,6};
ac.test(num, element -> System.out.println(element));
3.4、Set(無序、不能重復(fù))
Set里存放的對(duì)象是無序,不能重復(fù)的,集合中的對(duì)象不按特定的方式排序,只是簡(jiǎn)單地把對(duì)象加入集合中。
3.5、Map(鍵值對(duì)、鍵唯一、值不唯一, 鍵不能相同,值可以相同)
Map集合中存儲(chǔ)的是鍵值對(duì),鍵不能重復(fù),值可以重復(fù)。根據(jù)鍵得到值,對(duì)map集合遍歷時(shí)先得到鍵的set集合,對(duì)set集合進(jìn)行遍歷,得到相應(yīng)的值。
4.JAVA集合類型四種常見輸出方式:
1、Iterator:迭代輸出,是使用最多的輸出方式。
2、ListIterator:是Iterator的子接口,專門用于輸出List中的內(nèi)容。
3、foreach輸出:JDK1.5之后提供的新功能,可以輸出數(shù)組或集合。
4、for循環(huán)。
代碼示例如下:
for的形式:for(int i=0;i<arr.size();i++){...}
foreach的形式: for(int i:arr){...}
iterator的形式:
Iterator it = arr.iterator();
while(it.hasNext()){ object o =it.next(); ...}