java 集合Collection使用解讀

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(); ...}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 今天陪孩子一天,有兩點(diǎn)感觸。 一是好好說話很重要。 兒子想喝水,爸爸帶了熱水,等了很久,水還是很熱。兒子有點(diǎn)抓狂,...
    白露秋月閱讀 1,369評(píng)論 11 23
  • 晚上全家人一起聚餐,首先服務(wù)員端上了一盤花生毛豆,這時(shí)兒子把花生和毛豆扒了皮放在碗里,我問兒子這是干什么??jī)鹤痈嬖V...
    爸爸愛媽咪閱讀 319評(píng)論 0 0
  • 成堆的靈魂拖著肉體在夜中穿梭 紙醉金迷的歡笑聲與哭泣聲填滿天空 有人來,有人往 灰色的風(fēng)刮過臉龐 我遠(yuǎn)遠(yuǎn)的看見你的...
    卡米攝影閱讀 100評(píng)論 0 0

友情鏈接更多精彩內(nèi)容