Java Collection工具类

Collections工具类

一、Collections工具类介绍

  1. Collections是一个操作 Set、 List和 Map 等集合的工具类
  2. Collections中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作

二、Collections常用方法

1.排序操作

image-20220318191739617

package com.hspedu.collections_;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * @author DL5O
 * @version 1.0
 */

@SuppressWarnings("all")
public class Collections_ {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("tom");
        list.add("smith");
        list.add("king");
        list.add("dalong");

        // reverse(List):反转 List 中元素的顺序
        Collections.reverse(list);
        System.out.println("list=" + list);


        // shuffle(List):对 List 集合元素进行随机排序
        /*for (int i = 0; i < 5; i++) {
            Collections.shuffle(list);
            System.out.println("list=" + list);
        }*/

        //sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序
        Collections.sort(list);
        System.out.println("自然排序后=" + list);

        //希望按照字符串的长度大小来排序
        //sort(List,Comparator):
        Collections.sort(list, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ((String)o1).length() - ((String)o2).length()  ;
            }
        });

        System.out.println("定制排序后=" + list);

        //swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换
        Collections.swap(list,0,1);
        System.out.println("交换后="+list);
    }
}


2. 查找、替换

image-20220318195117797

package com.hspedu.collections_;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * @author DL5O
 * @version 1.0
 */

@SuppressWarnings("all")
public class Collections_ {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("tom");
        list.add("smith");
        list.add("king");
        list.add("dalong");

        // reverse(List):反转 List 中元素的顺序
        Collections.reverse(list);
        System.out.println("list=" + list);


        // shuffle(List):对 List 集合元素进行随机排序
        /*for (int i = 0; i < 5; i++) {
            Collections.shuffle(list);
            System.out.println("list=" + list);
        }*/

        //sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序
        Collections.sort(list);
        System.out.println("自然排序后=" + list);

        //希望按照字符串的长度大小来排序
        //sort(List,Comparator):
        Collections.sort(list, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ((String)o1).length() - ((String)o2).length()  ;
            }
        });

        System.out.println("定制排序后=" + list);

        //swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换
        Collections.swap(list,0,1);
        System.out.println("交换后="+list);

        //Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
        System.out.println("自然排序最大元素=" + Collections.max(list));

        //Object max(Collection,Comparator):
        //我们要返回字符串长度最大的
        Object max = Collections.max(list, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ((String)o1).length() - ((String)o2).length();
            }
        });
        System.out.println("按照长度排序最大的元素:" + max);

        //Object min(Collection)
        //Object min(Collection,Comparator)
        //上面的两个方法,参考 max 即

        System.out.println("自然排序最小:" + Collections.min(list));

        Object min = Collections.min(list, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ((String)o1).length() - ((String)o2).length();
            }
        });
        System.out.println("按照长度排序最小的元素:" + min);

        list.add("dalong");
        //int frequency(Collection,Object):返回指定集合中指定元素的出现次数
        System.out.println("dalong的出现次数="+Collections.frequency(list,"dalong"));//2

        //void copy(List dest,List src); 将src中的内容复制到dest中
        ArrayList dest = new ArrayList();
        //为了完成一个完整的拷贝,我们需要先给dest,赋一些值
        for (int i = 0; i < list.size() ; i++) {
            dest.add("");
        }

        //拷贝
        Collections.copy(dest,list);
        //如果不进行任何处理,那么会抛出一个索引越界异常,因为原来数组的长度为0
        System.out.println("dest="+dest);


        //boolean replaceAll(List list,Object oldVal,Object newVal):
        // 使用新值替换 List 对象的所有旧值
        //如果 list 中,有 tom 就替换成 汤姆
        Collections.replaceAll(list,"dalong","大龙");
        System.out.println("list替换后=" + list);
    }
}


三、作业

Homework01

image-20220319114140252

package com.hspedu.homework;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;

/**
 * @author DL5O
 * @version 1.0
 */
public class Homework01 {
    public static void main(String[] args) {
        News news1 = new News("新闻一");
        news1.setContent("新冠确证病例超千万,数百万印度教信徒赴恒河\"圣浴\"引起民众担忧");
        News news2 = new News("新闻二");
        news2.setContent("男子突然想起两个月前钓的鱼还在网兜,捞起一看赶紧放生");

        ArrayList list = new ArrayList();
        list.add(news1);
        list.add(news2);
        Collections.reverse(list);//第一种倒序遍历
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            News news =  (News)iterator.next();
            //进行一个向下转型,对news实例相关属性进行操作
            String oldContent = news.getContent();
            String temp = "...";
            if( oldContent.length() >= 15){
                //方式一:
                String newContent = oldContent.substring(0,15) + temp;
                news.setContent(newContent);
            }
            System.out.println(news);
        }


       /* //第二种倒序遍历
        for (int i = list.size() - 1; i >=0 ; i--) {
            System.out.println(list.get(i));
        }*/


    }
}

class News{
    private String title;
    private String content;

    public News(String title) {
        this.title = title;
    }

    @Override
    public String toString() {
        return  title + ':' + content ;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

Homework02

image-20220319155307539

package com.hspedu.homework;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;

/**
 * @author DL5O
 * @version 1.0
 */
@SuppressWarnings("all")
public class Homework02 {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();

        //add 添加元素
        Car car1 = new Car("奥拓",12000);
        Car car2 = new Car("奥迪",220000);
        Car car3 = new Car("宝马",400000);
        Car car4 = new Car("宾利",5000000);

        list.add(car1);
        list.add(car2);
        list.add(car3);
        list.add(car4);
        System.out.println("====list====");
        output(list);

        //remove 删除元素,这里删除奥拓car1
        list.remove(car1);
        System.out.println("====删除后====");
        output(list);

        //contains 查找某个元素是否存在,这里找car1
        System.out.println("car1 奥拓是否存在:" + list.contains(car1));//false

        //size 获取集合元素个数
        System.out.println("list.size()=" + list.size());

        //isEmpty 判空
        System.out.println("list.isEmpty()=" + list.isEmpty());

        //clear 清空
        ArrayList newList = new ArrayList();
        for (int i = 0; i < list.size() ; i++) {
            newList.add(null);
        }
        Collections.copy(newList,list);
        System.out.println("====newList====");
        output(newList);
        System.out.println("====清空====");
        newList.clear();
        System.out.println(newList);//[]

        //addAll 添加多个元素
        newList.add(new Car("法拉利",6000000));
        newList.add(new Car("保时捷",7000000));

        list.addAll(newList);
        System.out.println("====添加后====");
        output(list);

        //containAll 查找多个元素是否存在
        System.out.println("list中的元素是否包含newList中的元素:" + list.containsAll(newList));
        //true

        list.removeAll(newList);
        System.out.println("====删除后====");
        output(list);


    }

    public static void output(ArrayList list){
        //增强for循环
      /*  for (Object car : list) {
            System.out.println(car);
        }*/

        //迭代器
        Iterator iterator = list.iterator();
        while(iterator.hasNext()){
            Object car = iterator.next();
            System.out.println(car);
        }
    }
}

@SuppressWarnings("all")
class Car{
    private String name;
    private double price;

    public Car(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Car{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

Homework03

image-20220319155329510

package com.hspedu.homework;

import java.util.*;

/**
 * @author DL5O
 * @version 1.0
 */

@SuppressWarnings("all")
public class Homework03 {
    public static void main(String[] args) {
        HashMap map = new HashMap();
        map.put("jack",650);
        map.put("tom",1200);
        map.put("smith",2900);

        map.replace("jack",2600);//第一种方式
        map.put("jack",2600);

        Collection values = map.values();
        Set keySet = map.keySet();
        Iterator iterator = keySet.iterator();
        Iterator iterator1 = values.iterator();
        while (iterator.hasNext() && iterator1.hasNext()) {
            String key = (String)iterator.next();
            int value = ((Integer)iterator1.next()).intValue() + 100;
            map.replace(key,value);
        }

        //第一种方法,使用 map.keySe(),获得员工的名字key,然后通过key来获取对应的value
        System.out.println("====员工姓名====");
        Set keySet1 = map.keySet();
        for (Object o :keySet1) {
//            System.out.println(o + "-" + map.get(o));
            System.out.println("姓名:" + o);
        }


        //第二种方法 使用map.value 得到员工的工资
        System.out.println("====员工工资====");
        Collection values1 = map.values();
        for (Object o : values1) {
            System.out.println("工资:" + o);
        }


        //遍历所有的员工及其对应的工资
        //第三种方式 使用entrySet 方法 进行遍历
        System.out.println("====员工的详细信息====");
        Set entrySet = map.entrySet();
        //1.增强for
        for (Object entry : entrySet) {
            Map.Entry m = (Map.Entry)entry; //需要进行一个向下转型,
            System.out.println(m.getKey() + "-" + m.getValue());
            // 使用Map.Entry接口里面的方法,得到key和value
        }

        //2.使用迭代器
      /*  Iterator iterator2 = entrySet.iterator();
        while (iterator2.hasNext()) {
            Map.Entry info=  (Map.Entry) iterator2.next();
            System.out.println(info.getKey() + "-" + info.getValue());
        }*/
    }
}

4.试分析HashSet和TreeSet分别如何实现去重

image-20220319162855646

HashSet的去重机制

答:HashCode() + equals(),底层先通过存入对象,进行运算得到一个hash值,通过hash值再得到对应索引,如果table表中该索引处,没有数据,就直接存放,如果有数据,就进行equals比较,如果比较后,不相同就加入,否则就不加入

TreeSet去重机制

答:如果传入了一个Comparator匿名内部类,就使用实现的compare去重,如果返回返回0,就认为是相同的元素/数据,就不添加,如果没有传入Comparator匿名对象,则你添加对的对象实现的Compareable接口的compareTo去重


5.代码分析题

image-20220319162920695

会报一个类型异常,因为这里的构造器没有传入一个Comparator接口的匿名内部类

Comparator<? super K> cpr = comparator;

所以在底层,他会把key强转为Comparable接口,让后调用compareTo方法,但是Person又没有继承Comparable,故这里就会抛出一个CastClassException异常

Comparable<? super K> k = (Comparable<? super K>) key;

6.下面代码输出什么

image-20220320161758506


7.试写出Vector和ArrayList的区别

底层机构 版本 线程(同步效率) 扩容机制
ArrayList 可变长数组(Object类型) jdk 1.5 高,但是线程不安全 1.第一次扩容10,之后每次扩容按当前数组容量1.5倍进行扩容
2.如果指定了一个具体的初始容量,那么每次当前容量都按1.5倍进行扩容
Vector 可变长数组(Object类型) jdk 1.0 较低,但是线程安全 1.默认是10,每次扩容2倍
2.如果传入给构造器一个具体的容量,那么每次就扩容该容量的2背
posted @ 2022-03-20 16:36  DL50  阅读(55)  评论(0编辑  收藏  举报