java筆記--集合框架工具類Collections和Arrays

Collections、Arrays:是集合框架的工具類,里面的方法都是靜態(tài)的。

比較器:

public class ComparatorByLength implements Comparator<String>{

        @Override
        public int compare(String o1, String o2) {
            
            int temp=o1.length()-o2.length();
            
            return temp==0?o1.compareTo(o2):temp;
        }
    
}

CollectionsDemo:

public static void main(String[] args) {
        /*
        Collections:是集合框架的工具類。
        里面的方法都是靜態(tài)的。
        */
        demo_1();
        demo_2();
        demo_3();
        demo_4();
    }

    private static void demo_4() {
        List<String> list=new ArrayList<String>();
        
        list.add("abcde");
        list.add("cba");
        list.add("zhangsan");
        list.add("zhaoliu");
        list.add("xiaoqiang");
        
        System.out.println(list);
//      Collections.replaceAll(list, "cba", "nba"); // set(indexOf("cba"),"nba");//替換
        Collections.shuffle(list);//隨機(jī)把元素安放在集合的位置上
//      Collections.fill(list, "cc");//全部替換成cc
        System.out.println(list);
        
    }

    private static void demo_3() {
        /*逆序
        TreeSet<String> ts=new TreeSet<String>(new Comparator<String>(){

            @Override
            public int compare(String o1, String o2) {
                
                int temp=o2.compareTo(o1);
                return temp;
            
            
        }
            
    });*/
        TreeSet<String> ts=new TreeSet<String>(Collections.reverseOrder(new ComparatorByLength()));//逆序比較器再調(diào)用
        ts.add("abc");
        ts.add("hahaha");
        ts.add("zzz");
        ts.add("aa");
        ts.add("cba");
        
        System.out.println(ts);
}

    private static void demo_2() {
        
        List<String> list=new ArrayList<String>();
        
        list.add("abcde");
        list.add("cba");
        list.add("aa");
        list.add("zzz");
        list.add("cba");
        list.add("nbaa");
        System.out.println(list);
        
        int index=Collections.binarySearch(list, "cba");
        System.out.println("index="+index);
        
//      獲取最大值
        String max=Collections.max(list,new ComparatorByLength());
        System.out.println("max="+max);
        
    }

    private static void demo_1() {
        
        List<String> list=new ArrayList<String>();
        
        list.add("abcde");
        list.add("cba");
        list.add("aa");
        list.add("zzz");
        list.add("cba");
        list.add("nbaa");
        System.out.println(list);
        
//      對list集合進(jìn)行指定順序的排序
//      Collections.sort(list);
//      mySort(list);
        mySort(list,new ComparatorByLength());
    }

    //Collections中sort方法的原理
    private static<T extends Comparable<? super T>> void mySort(List<T> list,Comparator<? super T> comp) {
        
        for(int i=0;i<list.size();i++){
            for(int j=i+1;j<list.size();j++){
                //if(list.get(i).compareTo(list.get(j))>0)
                if(comp.compare(list.get(i),list.get(j))>0){
                /*
                T temp=list.get(i);
                list.set(i, list.get(j));
                list.set(j, temp);
                */
                Collections.swap(list, i, j);
                }
            }
        }   
    }

運(yùn)行:

如果數(shù)組中的元素是對象,那么轉(zhuǎn)成集合時(shí),直接將數(shù)組中的元素作為集合中的元素進(jìn)行集合存儲(chǔ)。

如果數(shù)組中的元素是基本類型數(shù)值,那么將該數(shù)組作為集合中的元素進(jìn)行存儲(chǔ)。
ArrayDemo:

//數(shù)組轉(zhuǎn)集合
    public static void main(String[] args) {
        
        /*
        Arrays:集合框架的工具類。
        里面的方法都是靜態(tài)的。
        */
        int[] arr={3,1,5,6,3,6};
        System.out.println(Arrays.toString(arr));
        
        demo_2();
    }

    private static void demo_2() {
        /*
        如果數(shù)組中的元素是對象,那么轉(zhuǎn)成集合時(shí),直接將數(shù)組中的元素作為集合中的元素進(jìn)行集合存儲(chǔ)。
        
        如果數(shù)組中的元素是基本類型數(shù)值,那么將該數(shù)組作為集合中的元素進(jìn)行存儲(chǔ)。
        */
        int[] arr={31,11,51,61};
        
        List<int[]> list=Arrays.asList(arr);
        
        System.out.println(list.size());
    }

    private static void demo_1() {
        
        /*
        重點(diǎn):List asList(數(shù)組)將數(shù)組轉(zhuǎn)成集合。
        
        好處:其實(shí)可以使用集合的方法操作數(shù)組中的元素。
        注意:數(shù)組的長度是固定的,所以對于集合的增刪方法是不可以使用的
        否則會(huì)發(fā)生UnsupportedOperationException
        */
        
        String[] arr={"abc","haha","xixi"};
        
        boolean b=myContains(arr,"xixi");
        System.out.println("contains:"+b);
        
        List<String> list=Arrays.asList(arr);
        boolean b1=list.contains("xixi");
        System.out.println("list contain:"+b1);
//      list.add("hiahia");UnsupportedOperationException
        
        System.out.println(list);
    }

    private static boolean myContains(String[] arr, String key) {
        for(int i=0;i<arr.length;i++){
            if(arr[i].equals(key))
                return true;
        }
        return false;
    }
    //toString的經(jīng)典實(shí)現(xiàn),Api里的實(shí)現(xiàn)方法
    public static String myToString(int[] a){
        int iMax=a.length-1;
        if(iMax==-1)
            return "[]";
        
        StringBuilder b=new StringBuilder();
        b.append('[');
        for(int i=0;;i++){//中間省了條件判斷,提高了效率
            b.append(a[i]);
        if(i==iMax)
                return b.append(']').toString();
        b.append(",");
        }
    }

運(yùn)行:

集合轉(zhuǎn)成數(shù)組:使用的是Collections接口中的toArray()

集合轉(zhuǎn)成數(shù)組:可以對集合中的元素操作的方法進(jìn)行限定。不允許對其進(jìn)行增刪。
ToArray:

public static void main(String[] args) {
        List<String> list=new ArrayList<String>();
        list.add("abc1");
        list.add("abc2");
        list.add("abc3");
        /*
        toArray方法需要傳入一個(gè)指定類型的數(shù)組。
        長度該如何定義?
        如果長度小于集合的size,那么該方法創(chuàng)建一個(gè)同類型并和集合相同size的數(shù)組。
        如果長度大于集合的size,那么該方法就會(huì)使用指定的數(shù)組,存儲(chǔ)集合中的元素,其他位置默認(rèn)為null。
        
        所以建議,最好長度就指定為集合的size。
        */
        String[] arr=list.toArray(new String[list.size()]);
        System.out.println(Arrays.toString(arr));
    }

運(yùn)行:
1.5特性:

foreach語句:
格式:
for(類型 變量 :Collection集合|數(shù)組){}

傳統(tǒng)for和高級for的區(qū)別?
傳統(tǒng)for可以完成對語句執(zhí)行很多次,因?yàn)榭梢远x控制循環(huán)的變量和條件。

高級for是一種簡化形式。它必須有被遍歷的目標(biāo)。該目標(biāo)要么是數(shù)組,要么是Collection單列集合。

對數(shù)組的遍歷如果僅僅是獲取數(shù)組中的元素,可以使用高級for。如果要對數(shù)組的角標(biāo)進(jìn)行操作建議使用傳統(tǒng)for。
Foreach:

public static void main(String[] args) {
        List<String> list=new ArrayList<String>();
        
        list.add("abc1");
        list.add("abc2");
        list.add("abc3");
        
        for(String s:list){//簡化書寫
            System.out.println(s);
        }
        
        int[] arr={3,1,5,7,4};
        
        for(int i:arr){
            System.out.println(i);
        }
//      可以使用高級for遍歷map集合嗎?不能直接用,但是可以將map轉(zhuǎn)成單列的set,就可以用了
        Map<Integer,String> map=new HashMap<Integer,String>();
        
        map.put(3,"zhagsan");
        map.put(1,"wangyi");
        map.put(7,"wagnwu");
        map.put(4,"zhagsansan");
        
        for(Integer key:map.keySet()){
            String value=map.get(key);
            System.out.println(key+": :"+value);
        }
        
        for(Map.Entry<Integer, String> me:map.entrySet()){
            Integer key=me.getKey();
            String value=me.getValue();
            
            System.out.println(key+":"+value);
        }
    }

函數(shù)的可變參數(shù)。其實(shí)就是一個(gè)數(shù)組,但是接收的是數(shù)組的元素。自動(dòng)將這些元素封裝成數(shù)組。簡化了調(diào)用者的書寫。

注意:可變參數(shù)類型,必須定義在參數(shù)列表的結(jié)尾。

ParamterDemo:

public static void main(String[] args) {
        
        int sum=add(4,5);
        System.out.println("sum="+sum);
        int sum1=add(4,5,6);
        System.out.println("sum1="+sum1);

        int[] arr={5,1,4,7,3};
        int sum3=add(arr);
        System.out.println("sum3="+sum3);
        int[] arr1={5,9,1,4,7,3,9,8,7,6};
        int sum4=add(arr1);
        System.out.println("sum4="+sum4);
        
        int sum5=newAdd(5,1,4,7,3);
        System.out.println("sum5="+sum5);
        int sum6=newAdd(5,9,1,2,7,3,9,8,7,6);
        System.out.println("sum6="+sum6);
    }
    /*
    函數(shù)的可變參數(shù)。
    其實(shí)就是一個(gè)數(shù)組,但是接收的是數(shù)組的元素。
    自動(dòng)將這些元素封裝成數(shù)組。簡化了調(diào)用者的書寫。
    
    注意:可變參數(shù)類型,必須定義在參數(shù)列表的結(jié)尾。
    */
    private static int newAdd(int b,int... a) {
        int sum=0;
        for(int i=0;i<a.length;i++){
            sum+=a[i];
        }
        return sum;
    }

    private static int add(int[] arr) {
        int sum=0;
        for(int i=0;i<arr.length;i++){
            sum+=arr[i];
        }
        return sum;
    }

    private static int add(int i, int j, int k) {
        return i+j+k;
    }

    private static int add(int i, int j) {
        return i+j;
    }

運(yùn)行:
java Api提供的靜態(tài)方法可以用import導(dǎo)入

StaticImportDemo:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static java.util.Collections.*;//靜態(tài)導(dǎo)入,其實(shí)到入的是類中的靜態(tài)成員。
//import static java.util.Collections.max;//靜態(tài)導(dǎo)入,其實(shí)到入的是類中的靜態(tài)成員。

import static java.lang.System.*;

public class StaticImportDemo {

    public static void main(String[] args) {
    
        List<String> list = new ArrayList<String>();
        
        list.add("abc3");
        list.add("abc7");
        list.add("abc1");

        out.println(list);
        
        sort(list);
        
        System.out.println(list);
        
        String max=max(list);
        out.println(max);
    }
}

運(yùn)行:

List list = new ArrayList();//非同步的。
list = MyCollections.synList(list);//返回一個(gè)同步的list.
給非同步的集合加鎖的原理:

class MyCollections{

    public static  List synList(List list){
        
        return new MyList(list);
    }

    private class MyList implements List{
    private List list;
    
    private static final Object lock = new Object();
    MyList(List list){  
        this.list = list;   
    }
    
    public boolean add(Object obj){
        synchronized(lock)
        {
            return list.add(obj);
        }
    }
    
    public boolean remove(Object obj){
        synchronized(lock)
        {
            return list.remove(obj);
        }
    }
}
}
Collections中有提供給非同步的集合加鎖的方法。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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