關於java集合,你看這一篇就夠了,由淺到深給你講的明明白白!

集合概述

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。

java

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循環用於遍歷數組或集合中的元素,具體語法格式以下ide

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則以二叉樹的方式來存儲元素,它能夠實現對集合中的元素排序。this

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,須要重寫方法。spa

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架構實戰電子書等等!有須要的朋友關注公衆號:前程有光,自行下載便可!

相關文章
相關標籤/搜索