java笔记--集合框架工具类Collections和Arrays

Collections、Arrays:是集合框架的工具类,里面的方法都是静态的。

比较器:

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:是集合框架的工具类。
        里面的方法都是静态的。
        */
        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);//随机把元素安放在集合的位置上
//      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()));//逆序比较器再调用
        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集合进行指定顺序的排序
//      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);
                }
            }
        }   
    }

运行:

如果数组中的元素是对象,那么转成集合时,直接将数组中的元素作为集合中的元素进行集合存储。

如果数组中的元素是基本类型数值,那么将该数组作为集合中的元素进行存储。
ArrayDemo:

//数组转集合
    public static void main(String[] args) {
        
        /*
        Arrays:集合框架的工具类。
        里面的方法都是静态的。
        */
        int[] arr={3,1,5,6,3,6};
        System.out.println(Arrays.toString(arr));
        
        demo_2();
    }

    private static void demo_2() {
        /*
        如果数组中的元素是对象,那么转成集合时,直接将数组中的元素作为集合中的元素进行集合存储。
        
        如果数组中的元素是基本类型数值,那么将该数组作为集合中的元素进行存储。
        */
        int[] arr={31,11,51,61};
        
        List<int[]> list=Arrays.asList(arr);
        
        System.out.println(list.size());
    }

    private static void demo_1() {
        
        /*
        重点:List asList(数组)将数组转成集合。
        
        好处:其实可以使用集合的方法操作数组中的元素。
        注意:数组的长度是固定的,所以对于集合的增删方法是不可以使用的
        否则会发生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的经典实现,Api里的实现方法
    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(",");
        }
    }

运行:

集合转成数组:使用的是Collections接口中的toArray()

集合转成数组:可以对集合中的元素操作的方法进行限定。不允许对其进行增删。
ToArray:

public static void main(String[] args) {
        List<String> list=new ArrayList<String>();
        list.add("abc1");
        list.add("abc2");
        list.add("abc3");
        /*
        toArray方法需要传入一个指定类型的数组。
        长度该如何定义?
        如果长度小于集合的size,那么该方法创建一个同类型并和集合相同size的数组。
        如果长度大于集合的size,那么该方法就会使用指定的数组,存储集合中的元素,其他位置默认为null。
        
        所以建议,最好长度就指定为集合的size。
        */
        String[] arr=list.toArray(new String[list.size()]);
        System.out.println(Arrays.toString(arr));
    }

运行:
1.5特性:

foreach语句:
格式:
for(类型 变量 :Collection集合|数组){}

传统for和高级for的区别?
传统for可以完成对语句执行很多次,因为可以定义控制循环的变量和条件。

高级for是一种简化形式。它必须有被遍历的目标。该目标要么是数组,要么是Collection单列集合。

对数组的遍历如果仅仅是获取数组中的元素,可以使用高级for。如果要对数组的角标进行操作建议使用传统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转成单列的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);
        }
    }

函数的可变参数。其实就是一个数组,但是接收的是数组的元素。自动将这些元素封装成数组。简化了调用者的书写。

注意:可变参数类型,必须定义在参数列表的结尾。

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);
    }
    /*
    函数的可变参数。
    其实就是一个数组,但是接收的是数组的元素。
    自动将这些元素封装成数组。简化了调用者的书写。
    
    注意:可变参数类型,必须定义在参数列表的结尾。
    */
    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;
    }

运行:
java Api提供的静态方法可以用import导入

StaticImportDemo:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static java.util.Collections.*;//静态导入,其实到入的是类中的静态成员。
//import static java.util.Collections.max;//静态导入,其实到入的是类中的静态成员。

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

运行:

List list = new ArrayList();//非同步的。
list = MyCollections.synList(list);//返回一个同步的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中有提供给非同步的集合加锁的方法。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容