• Day15 集合(二)


    Set简介

    定义

    public interface Set<E> extends Collection<E> {}

    Set是一个继承于Collection的接口,即Set也是集合中的一种。Set是没有重复元素的集合。

    SotedSet

    接口,排序,自然升序排序的

    public static void main(String[] args) {
            // SortedSet
            SortedSet<String> set = new TreeSet<>();
            set.add("cc");
            set.add("aa");
            set.add("bb");
            System.out.println(set);// [aa, bb, cc]
            System.out.println(set.first());//aa
            System.out.println(set.last());//cc
            System.out.println(set.subSet("aa", "cc"));//[aa, bb]
        }

    HashSet

    哈希表

    调用hashCode()

    ​       equals()判断

    顺序:先调用hashCode()算出值,如果hashCode()的值相同了,进一步调用equals()判断是否相同。相同不存储,不相同可以进行链式存储。

     1 import java.util.HashSet;
     2 import java.util.Set;
     3 class Person{
     4     private int no;
     5     private String name;
     6     public Person(int no, String name) {
     7         this.no = no;
     8         this.name = name;
     9     }
    10     public int getNo() {
    11         return no;
    12     }
    13     public void setNo(int no) {
    14         this.no = no;
    15     }
    16     public String getName() {
    17         return name;
    18     }
    19     public void setName(String name) {
    20         this.name = name;
    21     }
    22     @Override
    23     public String toString() {
    24         // TODO Auto-generated method stub
    25         return no+","+name;
    26     }
    27     @Override
    28     public int hashCode() {
    29         return name.hashCode()+no;
    30     }
    31     @Override
    32     public boolean equals(Object obj) {
    33         //this   
    34         //obj
    35         Person per = (Person)obj;
    36         return this.no == per.no && this.name.equals(per.name) ? true :false;
    37     }
    38     
    39 }
    40 public class TestSet1 {
    41     public static void main(String[] args) {
    42         Set<Person> set = new HashSet<>(); 
    43         Person guo = new Person(11, "xiaoguo");
    44         Person huang = new Person(11,"xiaoguo");
    45         Person yang = new Person(22,"xiaoyang");
    46         set.add(guo);
    47         set.add(huang);
    48         set.add(yang);
    49         set.forEach(System.out::println);
    50         
    51         //Set 
    52 /*        Set<String> set = new HashSet<>();
    53         set.add("aa");
    54         set.add("bb");
    55         set.add("cc");
    56 //        set.forEach(System.out::println);
    57         set.add("aa");
    58         set.forEach(System.out::println);*/
    59 
    60     }
    61 
    62 }
    View Code

    TreeSet

    import java.util.NavigableSet;
    import java.util.TreeSet;
    
    public class TestSet4 {
    
        public static void main(String[] args) {
            // NavigableSet
            NavigableSet<Double> set = new TreeSet<>((d1,d2)->(int)(d2-d1));
            set.add(34.5);
            set.add(56.34);
            set.add(67.2);
            System.out.println(set);
            // 小于等于 指定参数 的最大 元素
            System.out.println(set.floor(58.9));
            //大于等于 指定参数 的 最小元素
            System.out.println(set.ceiling(58.9));
            //降序排列的集合
            set.descendingSet().forEach(System.out::println);
            //返回 降序的迭代器
            set.descendingIterator().forEachRemaining(System.out::println);
            //删除 第一元素
            set.pollFirst();
            System.out.println(set);
            set.pollLast();
            System.out.println(set);
        }
    
    }

    HashSet、LinkedHashSet和TreeSet的区别

    HashSet:哈希表,数据唯一,重写hashCode()和equals()方法,效率最高

    LinkedHashSet:链表和哈希表,元素有序,按照元素插入的顺序排序的

    TreeSet:二叉树,默认是自然升序排序的,也可以自己制定顺序

    Map接口

    定义

    public interface Map<K,V> { }

    Map 是一个键值对(key-value)映射接口。Map映射中不能包含重复的键;每个键最多只能映射到一个值
    Map 接口提供三种collection 视图,允许以键集值集键-值映射关系集的形式查看某个映射的内容。
    Map 映射顺序。有些实现类,可以明确保证其顺序,如 TreeMap;另一些映射实现则不保证顺序,如 HashMap 类。
    Map 的实现类应该提供2个“标准的”构造方法:第一个,void(无参数)构造方法,用于创建空映射第二个,带有单个 Map 类型参数的构造方法,用于创建一个与其参数具有相同键-值映射关系的新映射。实际上,后一个构造方法允许用户复制任意映射,生成所需类的一个等价映射。尽管无法强制执行此建议(因为接口不能包含构造方法),但是 JDK 中所有通用的映射实现都遵从它。

     1 import java.util.HashMap;
     2 import java.util.Map;
     3 
     4 public class TestMap1 {
     5 
     6     public static void main(String[] args) {
     7         // Map
     8         Map<Integer,String> map = new HashMap<>();
     9         //键唯一
    10         map.put(1, "aa");
    11         map.put(2, "bb");
    12         map.put(3, "cc");
    13         System.out.println(map);
    14         //集合 中键值对个数
    15         System.out.println(map.size());
    16         //
    17         System.out.println(map.isEmpty());//false
    18         //判断键 是否存在
    19         System.out.println(map.containsKey(1));
    20         //判断值 是否存在
    21         System.out.println(map.containsValue("cc"));
    22         //按照键移除 键值对
    23 //        map.remove(2);
    24         map.remove(1, "aa");
    25         System.out.println(map);
    26         //键的集合  Set类型
    27         System.out.println(map.keySet());
    28         //值得集合 Collection
    29         System.out.println(map.values());
    30         //
    31 //        map.clear();
    32 //        System.out.println(map.isEmpty());
    33         System.out.println(map);
    34         map.put(2, null);
    35         map.put(null, null);
    36         System.out.println(map);
    37     }
    38 
    39 }
    View Code

    遍历

    import java.util.Hashtable;
    import java.util.Map;
    
    public class TestMap2 {
    
        public static void main(String[] args) {
            // Map  遍历
            Map<Integer,String> map = new Hashtable<>();
    //        Map<Integer,String> map = new HashMap<>();
            //键唯一
            map.put(1, "aa");
            map.put(2, "bb");
            map.put(3, "cc");
            //1.单独遍历
            map.keySet().forEach(System.out::println);
            map.values().forEach(System.out::println);
            //2 整体遍历 ,遍历键值
            map.forEach((k,v)->System.out.println(k+","+v));
            //3
            //获得键值对集合
            map.entrySet().forEach(System.out::println);
            //4.迭代器遍历
            map.entrySet().iterator().forEachRemaining(System.out::println);
            map.entrySet().iterator().forEachRemaining(e->System.out.println(e.getKey()+","+e.getValue()));
        }
    
    }

    说明
    (01) Map提供接口分别用于返回 键集、值集或键-值映射关系集。
            entrySet()用于返回键-值集Set集合
            keySet()用于返回键集Set集合
           values()用户返回值集Collection集合
           因为Map中不能包含重复的键;每个键最多只能映射到一个值。所以,键-值集、键集都是Set,值集时Collection

    (02) Map提供了“键-值对”、“根据键获取值”、“删除键”、“获取容量大小”等方法。

    HashMap、Hashtable、LinkedHashMap和TreeMap的区别

    HashMap:空键值对

    Hashtable:线程安全的。少用

    LinkedHashMap:按照插入的顺序

    TreeMap:键 按照自然排序

    效率:HashMap > LinkedHashMap > TreeMap

    Queue接口

    方法

    队列:是一组操作受限的线性表,只能在对尾增加,在对头删除,先进先出。

    双端队列

    栈的方法

    push、pop

    public class TestDeque1 {
    
        public static void main(String[] args) {
            // Deque双端队列
            //模拟队列
            Deque<String> d = new ArrayDeque<>(); 
    /*        d.add("aa");
            d.addLast("bb");
            d.addLast("cc");
            while(d.size() > 0) {
    //            System.out.println(d.poll());
                System.out.println(d.pollFirst());
            }*/
            //模拟栈
    /*        d.addFirst("aa");
            d.addFirst("bb");
            d.addFirst("cc");
            while(d.size() > 0 ) {
                System.out.println(d.pollFirst());
            }*/
            //使用栈的方法
            d.push("aa");
            d.push("bb");
            d.push("cc");
            while(d.size() > 0) {
                System.out.println(d.pop());
            }
        
        }
    
    }

    实现类

    ArrayDeque、LinkedList(栈)

     1 public class TestDeque2 {
     2     public static void main(String[] args) {
     3         // 银行排队
     4         Person1 zhangsan = new Person1("张三");
     5         Person1 guojing = new Person1("郭靖");
     6         Person1 yangkang = new Person1("杨康");
     7         Person1 huangrong = new Person1("黄蓉");
     8         Person1 wangwu = new Person1("王五");
     9         Person1[] person = {zhangsan,guojing,yangkang,huangrong,wangwu};
    10         Deque<Person1> d = new ArrayDeque<>();
    11         //入队,分配号码
    12         for(int i = 0; i < 5; i++) {
    13             person[i].setNo(i+1);
    14             d.addLast(person[i]);
    15         }
    16         //出队
    17         while(d.size() > 0) {
    18             System.out.println("* "+d.pollFirst()+" 办理完成");
    19             if(d.size() > 0) {
    20                 System.out.println("剩余:");
    21                 d.forEach(System.out::println);
    22             }else {
    23                 System.out.println("后边没有队伍了");
    24             }
    25         }
    26         System.out.println("全部办理完成");
    27     
    28     }
    29 
    30 }
    View Code
     1 public class TestQueue1 {
     2 
     3     public static void main(String[] args) {
     4         // Queue队列
     5         Queue<String> q = new LinkedList<>();
     6         //向队尾添加
     7         q.add("aa");//失败 抛异常
     8         q.add("bb");
     9         q.offer("cc");//添加失败 false
    10 //        q.offer(null);队列 不允许 添加 null值 ,LinkedList特殊 ,最好 不要用 Null
    11         System.out.println(q);
    12         //模拟队列 操作:出队
    13     /*    System.out.println(q.poll());//
    14         System.out.println(q.poll());
    15         System.out.println(q.poll());*/
    16         //循环
    17 /*        for(;;) {
    18             String s = q.poll();
    19             
    20             if(s == null) {
    21                 break;
    22             }
    23             System.out.println(s);
    24         }*/
    25         while(q.size() > 0) {
    26             //移除 出队
    27 //            System.out.println(q.poll());
    28             //只  获得不会移除
    29 //            System.out.println(q.peek());
    30         }
    31         
    32     }
    View Code

    Collections类的一些常用方法

    sort、sort(集合,比较器)、binarySearch、reverse、max、min、frequency、fill

    public class TestCollections {
        
        public static void main(String[] args) {
            //Collections 对集合操作的类
            List<String> list = new ArrayList<>();
            //向集合中添加多个元素
            Collections.addAll(list, "aa","cc","bb");
            System.out.println(list);
            //自然升序排序
            Collections.sort(list);
            System.out.println(list);
            //指定比较器排序
    //        Collections.sort(list, (s1,s2)->s2.compareTo(s1));
            System.out.println(list);
            //二分查找 :前提 是 自然升序排序
            System.out.println(Collections.binarySearch(list, "cc"));
            //最大值 和 最小值
            System.out.println(Collections.max(list));//
            System.out.println(Collections.min(list));//
            //反转集合的元素
            Collections.reverse(list);
            System.out.println(list);
            //元素 在 集合中出现的次数
            Collections.addAll(list, "aa","aa");
            System.out.println(Collections.frequency(list, "aa"));
            //洗牌
            Collections.shuffle(list);
            System.out.println(list);
            //填充
            Collections.fill(list, "xxx");
            System.out.println(list);
        }
    
    }
  • 相关阅读:
    libhdfs 写新的c程序编译问题
    CDH4源码 eclipse导入问题
    安装CDH4遇到的问题
    [学习资料]Java多线程编程
    [properJavaRDP]在网页中实现远程连接
    【原创】Eclipse实现图形化界面插件vs4e
    【原创】源码角度分析Android的消息机制系列(四)——MessageQueue的工作原理
    【原创】源码角度分析Android的消息机制系列(六)——Handler的工作原理
    【原创】源码角度分析Android的消息机制系列(三)——ThreadLocal的工作原理
    【原创】源码角度分析Android的消息机制系列(五)——Looper的工作原理
  • 原文地址:https://www.cnblogs.com/qingyunzong/p/8260389.html
Copyright © 2020-2023  润新知