關於java集合,你看這一篇就夠了,由淺到深給你講的明明白白! 集合概述 ArrayList集合 JDK8的forEach遍歷集合 Set接口 Map接口 Map集合遍歷 最後

集合概述

java集合就像一個容器,這些對象可以是任意的數據類型,且長度可變。集合按照其存儲結構可以分爲兩大類,即單列集合Collection,和雙列集合Map。
這兩種集合特點如下:
(1)Collection:單列集合接口,用於存儲一系列元素。
Collection集合有兩個重要的子接口,分別是List和Set。其中List集合的特點是元素有序,可重複;Set集合的特點是元素無序並且不可重複。List接口的主要實現類有ArrayList和ListedList;Set接口的主要實現類有HashSet和TreeSet。
(2)Map:雙列集合的根接口,用於存儲具有鍵(Key),值(Value)映射關係的元素。
Map集合中每個元素都包含一對鍵值,並且Key是唯一的,在使用Map集合時可以通過指的Key找到對應的Value。Map接口的主要實現類有HashMap和TreeMap。



List接口

List接口繼承於Collection接口,在List集合中允許出現重複的元素,在程序中可以通過索引來訪問集合中的指定元素,另外List集合還有一個特點就是存取有序。

ArrayList集合

ArrayList內部封裝了一個長度可變的數組對象(初始容量爲8,按1.5倍擴容),在ArrayList中進行增刪改查效率會比較低,但是在遍歷和查找元素時顯得非常高效。
LinkedList集合
爲了克服ArrayList增刪效率低的問題,可以用LinkedList,該集合內有一個雙向循環鏈表,增刪效率較高。

Collection集合遍歷

Iterator遍歷集合

Iterator對象被稱爲迭代器,用來訪問Collection中的元素。在使用迭代器對集合元素迭代是,如果調用了remove的方法去刪除元素,,會出現異常。原因是集合中刪除元素會導致迭代器語氣的迭代次數發生改變,導致迭代器的結果不準確。

public class Test1 {
    public static void main(String[] args) {
//        創建ArrayList對象
        ArrayList list = new ArrayList();
//        添加元素
        list.add("data_1");
        list.add("data_2");
        list.add("data_3");
        Iterator iterator = list.iterator();
        while (iterator.hasNext()){
        //hasNext()判斷集合中是否存在下一個元素
            Object object = iterator.next();
        //如果存在,則調用next()將其取出,否則說明已經到達了集合末尾,停止遍歷
            System.out.println(object);
        }
    }
}
//輸出結果爲
data_1
data_2
data_3

foreach遍歷集合

foreach是一種簡介的for循環,也被稱爲增強for循環。foreach循環用於遍歷數組或集合中的元素,具體語法格式如下

for( 容器中的元素類型 臨時變量 : 容器變量 ){
//執行語句
}
public class Test1 {
    public static void main(String[] args) {
//        創建ArrayList對象
        ArrayList list = new ArrayList();
//        添加元素
        list.add("data_1");
        list.add("data_2");
        list.add("data_3");
        for (Object object : list) {
            System.out.println(object);
        }
    }
}

foreach也存在侷限性,當時用foreach循環時,不能對集合中元素進行修改。

JDK8的forEach遍歷集合

在JDK8中,根據Lambda表達式的特性還增加了一個forEach方法來遍歷集合,演示如下

public class Test1 {
    public static void main(String[] args) {
//        創建ArrayList對象
        ArrayList list = new ArrayList();
//        添加元素
        list.add("data_1");
        list.add("data_2");
        list.add("data_3");
        list.forEach(obj-> System.out.println("迭代器集合元素"+obj));
        }
    }
//輸出結果爲
迭代器集合元素data_1
迭代器集合元素data_2
迭代器集合元素data_3

Set接口

Set接口簡介

Set接口中的元素無序,並且保證存入的元素不會重複。Set接口主要有兩個實現類,分別是HashSet和TreeSet,其中HashSet是根據對象的哈希值來確定元素集合中的存儲位置,因此具有良好的存取和查找性能。TreeSet則以二叉樹的方式來存儲元素,它可以實現對集合中的元素排序。

HashSet集合

HashSet是set接口的一個實現類,它所存儲的元素是不可重複的,並且元素都是無序的。當想HashSet集合中添加元素時,首先會調用hashcode方法來確定元素的存儲位置,然後再調用元素對象的equals()方法來確保該位置沒有重複元素。

public class Test1 {
    public static void main(String[] args) {
        HashSet hashSet = new HashSet();
        hashSet.add("Jack");
        hashSet.add("Rose");
        hashSet.add("Eve");
        hashSet.add("Rose");
        hashSet.forEach(obj-> System.out.println(obj));
        }
    }
    //輸出結果爲
    Eve
    Rose
    Jack

向集合中存入元素時,爲了保證HashSet正常工作,要求在存入對象是,需要重寫Object類中的hashCode()和equals()方法。上個例子將字符串存入HashSet時,String類已經默認重寫了hashCode的方法,但是有時候傳入自定義類型的對象存入HashSet,需要重寫方法。

package Demo01;

import java.util.ArrayList;
import java.util.*;

/**
 * @author Dell
 */
public class Test1 {
    public static void main(String[] args) {
        HashSet hashSet = new HashSet();
        hashSet.add(new Student("2","zhang"));
        hashSet.add(new Student("8","name"));
        hashSet.add(new Student("4","jack"));
        hashSet.add(new Student("6","row"));
        hashSet.forEach();
        }
    }
class Student{
    String id;
    String name;

    public Student(String id, String name) {
        this.id = id;
        this.name = name;

    }
    @Override
    public String toString(){
        return id+" "+name;
    }
    @Override
    public int hashCode(){
        return id.hashCode();
    }
    @Override
    public boolean equals(Object object){
        if(this == object){     //判斷是否是同一個對象
            return true;        //如果是,返回true
        }
        if(!(object instanceof Student)){       //判斷對象是爲Student類型
            return false;       //如果不是,返回false
        }
        Student student = (Student) object;         //將對象強轉爲Student類型
        boolean b = this.id.equals(student.id);     //判斷id值是否相同
        return b;                                   //返回判斷結果
    }
}
//輸出結果爲
[2 zhang, 4 jack, 6 row, 8 name]


TreeSet接口

TreeSet採用平衡二叉樹來存儲元素,這樣的結構可以保證TreeSet集合中沒有重複的元素,且可以排序。集合中的元素在進行比較時,都會調用compareTo()方法,該方法是Comparable定義的。在向TreeSet傳入自定義數據時,沒有實現Comparable接口。爲了解決這個問題java提供了兩種方法分別爲自然排序和定製排序。

//自然排序
package Demo01;

import java.util.ArrayList;
import java.util.*;

/**
 * @author Dell
 */
public class Test1 {
    public static void main(String[] args) {
        TreeSet treeSet = new TreeSet();
        treeSet.add(new Teacher("jack",18));
        treeSet.add(new Teacher("rose",19));
        treeSet.add(new Teacher("tom",19));
        treeSet.add(new Teacher("rose",19));
        System.out.println(treeSet);

        }
    }
//    定義Teacher類實現Comparable接口
class Teacher implements Comparable{
    String name;
    int age;

    public Teacher(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString(){
        return name +":"+age;
    }
//    重寫Comparable接口的compareTo()的方法
    @Override
    public int compareTo(Object obj){
        Teacher teacher = (Teacher) obj;
//     定義比較方式,先比較年齡,再比較名稱name
        if(this.age- teacher.age>0){
            return 1;
        }
        if(this.age- teacher.age==0){
            return this.name.compareTo(teacher.name);
        }
        return -1;
    }
}
//輸出結果爲
[jack:18, rose:19, tom:19]

Teacher類實現了Comparable接口,並重寫compareTo()方法。在compareTo()方法中,首先針對age值進行修改,根據比較結果返回-1和1,當age相同時,再對name進行比較。教師Teacher對象首先按照年齡升序排序,年齡相同時會按照姓名進行升序排序,並且TreeSet集合會將重複的元素去掉。

//定製排序
package Demo01;

import java.util.*;

/**
 * @author Dell
 */
public class Test1 {
    public static void main(String[] args) {
//      1.創建集合時,傳入Comparator接口實現定製排序規則
        TreeSet treeSet = new TreeSet(new MyComparator());
        treeSet.add("jack");
        treeSet.add("hello");
        treeSet.add("tom");
        System.out.println(treeSet);
//      2.創建集合時,使用Lambda表達式定製排序規則
        TreeSet treeSet1 = new TreeSet((obj1,obj2)->{
            String s1 = (String) obj1;
            String s2 = (String) obj2;
            return s1.length() - s2.length();
        });
        treeSet1.add("jack");
        treeSet1.add("tom");
        treeSet1.add("hello");
        System.out.println(treeSet1);
        }
    }
class MyComparator implements Comparator{
    @Override
    public int compare(Object obj1, Object obj2){ //定製排序方式
        String str1 = (String) obj1;
        String str2 = (String) obj2;
        int temp = str1.length()-str2.length();
        return temp;
    }
}

Map接口

Map接口簡介

Map接口是一個雙列集合,它的每個元素都包含一個鍵對象Key和值對象Value,鍵和值對象之間存在一種對應關係,稱爲映射。Map中key和value可以是任意數據類型,並且鍵對象Key不允許重複,在訪問Map集合中的元素時,只要指定了Key,就能找到對應的Value。

HashMap集合

HashMap集合時Map接口的一個實現類,它用於存儲鍵值映射關係,該集合的鍵和值允許爲空,但鍵不能重複,且集合中的元素是無序的。

Map集合遍歷

Iterator迭代器遍歷Map集合

使用Iterator遍歷集合需要先將Map集合轉換爲Iterator接口對象,然後進行遍歷。由於Map集合中元素是有鍵值對構成的,所以使用Iterator遍歷,有兩種方法,即keySet()和entrySet()
keySet()方法需要將Map集合中所有的鍵對象轉換爲Set單列集合,接着將含鍵對象的Set集合轉換爲Iterator接口對象,然後遍歷Map集合中所有的鍵,再根據鍵獲取相應的值。

//該方法是keySet()方法
import java.util.*;

/**
 * @author Dell
 */
public class Test1 {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("3", "Jack");
        map.put("1", "Rock");
        map.put("2", "Tom");
        Set keySet = map.keySet();//獲取鍵的集合
        Iterator iterator = keySet.iterator();//迭代鍵的集合
        while (iterator.hasNext()) {
            Object key = map.keySet();
            Object value = map.get(key);//獲取每個鍵所對應的值
            System.out.println(key + ":" + value);
        }
    }
}


entrySet()方法將原有的Map集合中的鍵值對作爲一個整體返回Set集合,接着將包含鍵值對對象的Set集合轉換爲Iterator接口對象,然後獲取集合中的所有鍵值對映射關係,在從映射關係中取出鍵和值。

//該方法是entrySet()方法
package Demo01;

import java.util.*;

/**
 * @author Dell
 */
public class Test1 {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("3", "Jack");
        map.put("1", "Rock");
        map.put("2", "Tom");
        Set entrySet = map.entrySet();
        Iterator iterator = entrySet.iterator();//獲取Iterator對象
        while (iterator.hasNext()){
            Map.Entry entry = (Map.Entry)(iterator.next());//獲取集合中鍵值對映射關係
            Object key = entry.getKey();//獲取Entry中的鍵
            Object value = entry.getValue();//獲取Entry中的值
            System.out.println(key + ":" + value);
        }
    }
}


使用forEach方法遍歷Map集合

public class Test1 {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("3", "Jack");
        map.put("1", "Rock");
        map.put("2", "Tom");
        map.forEach((key, value) -> System.out.println(key + ":" + value));
    }
}

在map集合中還提供了一個values()的方法,通過這個方法,可以直接獲取Map中存儲所有值的Collection集合

public class Test1 {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("3", "Jack");
        map.put("1", "Rock");
        map.put("2", "Tom");
        Collection values = map.values();//獲取map集合中values值集合對象
        values.forEach(v-> System.out.println(v));
    }
}


使用LinkedHashMap集合保證元素添加順序

創建LinkedHashMap集合,可保證存取順序一致。

Properties集合

Properties集合是HashTable的子類,Properties主要用來存儲字符串類型的鍵和值。
在文件目錄中添加配置文件 文件名爲test.properties
下面來展示如何對properties配置文件進行讀取和寫入操作

Background = black
name = zhang 
age = 19

package Demo01;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Properties;

public class Test1 {
    public static void main(String[] args) throws Exception {
//        1.通過properties進行屬性文件讀取操作
        Properties pps = new Properties();
//        加載要讀取的文件test.properties
        pps.load(new FileInputStream("test.properties"));
//        遍歷test.properties鍵值對元素信息
        pps.forEach((k,v)-> System.out.println(k +":"+ v));
//        2.通過properties進行屬性文件寫入操作
//        指定要寫入操作的文件名稱和位置
        FileOutputStream out = new FileOutputStream("test.properties");
//        向properties類文件進行希爾鍵值對信息
        pps.setProperty("charset","UTF-8");
//        將此properties集合中新增的鍵值對信息寫入配置文件中
        pps.store(out,"新增charset編碼");
    }
}
//第一次輸出結果爲
background:black
name:zhang
age:19
//第二次輸出結果爲
charset:UTF-8
background:black
name:zhang
age:19


最後

在文章的最後作者爲大家整理了很多資料!包括java核心知識點+全套架構師學習資料和視頻+一線大廠面試寶典+面試簡歷模板+阿里美團網易騰訊小米愛奇藝快手嗶哩嗶哩面試題+Spring源碼合集+Java架構實戰電子書等等!
有需要的朋友關注公衆號:前程有光,自行下載即可!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章