zoukankan      html  css  js  c++  java
  • 集合

    1.Comparable接口

    * 所有可“排序”的类都可以通过实现java.lang.Comparable接口来实现,该接口中的唯一方法:

    public int compareTo(Object obj);

    该方法如果

    返回 0,表示 this == obj
    返回正数,表示 this > obj
    返回负数,表示 this < obj

    * 可“排序”的类通过Comparable接口的compareTo方法来确定该类对象的排序方式。

    2.Comparator接口

    1. 在实现类中重写compare方法

    @Override
    public int compareTo(Student o) {
        return this.id - o.id;
    }

    2. 通过构造匿名内部类实现比较方法

    TreeSet<Student> treeSet = new TreeSet<Student>(new Comparator<Student>() {
        @Override
        public int compare(Student o1, Student o2) {
            return o1.id - o2.id;
        }
    });
    
    TreeSet<Student> set2 = new TreeSet<Student>(new Comparator<Student>() {
        @Override
        public int compare(Student o1, Student o2) {
            //o1   外面的
            //o2  是里面的
            if(o1.score == o2.score){
                return 0;
            }
            return o1.score > o2.score ? -1 : 1;
        }
    });

    注意,一个是compareTo,一个是compare,只能用给TreeSet

    3.Map接口

    * Map接口的实现类常用的有:
        * HashMap:HashMap内部对“键”用Set进行散列存放。所以根据“键”去取“值”的效率很高
        * TreeMap:TreeMap内部使用红黑树结构对“key”进行排序存放,所以放入TreeMap中的“key-value”对的“key”必须是可“排序”的
        * Hashtable (并不常用)

    4.Map.Entry接口

    * Map.Entry是Map中内部定义的一个接口,专门用来保存key->value的内容

    5.map遍历方法

    * 第一种遍历

    Set<Integer> keySet = map2.keySet();   
    for(Integer integer : keySet){
        System.out.println("key:" + integer + " value:" + map2.get(integer));
    }

    * 第二种遍历

    Set<Map.Entry<Integer, String>> entrys = map2.entrySet();
    for(Map.Entry<Integer, String> entry : entrys){
        System.out.println("key:" + entry.getKey() + 
                            " value:" + entry.getValue());
    }

    6.set

    * Set接口的实现类
        * HashSet:散列存放
        * TreeSet:有序存放
        * LinkedHashSet

    * set 集合是一个不可以重复的集合?
        【解答】原理:它底层是一个Map   -- key -value 对, key 跟 value 一一对应,其中,key 是不能重复的

    * set 进行存储的时候,
        1. 如果是添加同一个对象(即把同一个对象添加多次),那么set只添加一次,不管hashcode  equals 方法的结果是啥 其结果是由它底层的map决定,因为key只能唯一
        2. 如果添加的不是同个对象,那么先调用 hashcode方法,获取hashcode值 ,如果 hascode 一样,那么就调用equals方法,如果返回时true表示元素不可以存入,反之则可以
        得出的结果:实际开发中,如果需要将自定义的类添加入set中,一样重写hashcode  跟 equals

    * TreeSet   
        * 添加进去的元素,不管添加顺序怎样子的,输出结果,都是一样的
        * 添加进去的元素,不能重复,如果重复,取其中一个 (由set的特性决定)

    * LinkedHashSet:元素最终打印的顺序跟添加的顺序一样

    7.HashSet

    存储原理:

    * 根据每个对象的哈希码值(调用hashCode()获得)用固定的算法算出它的存储索引,把对象存放在一个叫散列表的相应位置(表元)中:
        * 如果对应的位置没有其它元素,就只需要直接存入。
        * 如果该位置有元素了,会将新对象跟该位置的所有对象进行比较(调用equals()),以查看是否已经存在了:还不存在就存放,已经存在就直接使用。
    * 取对象时:
        * 根据对象的哈希码值计算出它的存储索引,在散列表的相应位置(表元)上的元素间进行少量的比较操作就可以找出它。

    特点及使用技巧:

    * HashSet不保存元素的加入顺序。
    * HashSet 接口存、取、删对象都有很高的效率。
    * 对于要存放到HashSet集合中的对象,对应的类一定要重写equals()和hashCode(Object obj)方法以实现对象相等规则。
    * HashSet根据元素的哈希码进行存放,取出时也可以根据哈希码快速找到

    8.iterator迭代器接口的使用方法

    **所有实现了Collection接口的集合类都有一个iterator()方法用以返回一个实现了Iterator接口的对象**。

    Iterator it = coll.iterator();

    9.遍历

    * 第一种:普通for循环

    for(int i = 0; i < list.size(); i++){
        System.out.print(list.get(i) + "  ");
    }
    System.out.println();

    * 第二种:增强的for循环

    **增强for循环,只能用于循环遍历,无法进行修改(添加 删除)**
    
    for(String str : list){
        System.out.print(str + " ");
    }
    System.out.println();

    * 第三种:迭代循环

    //获取迭代器
    Iterator<String> iterator = list.iterator();
    for(;iterator.hasNext();  ){
        System.out.print(iterator.next() + " ");
    }
    
    /*while(iteratro.hasNext()){
        System.out.print(iterator.next() + " ");
    }*/

    10.总结
    ###List
     * list集合中可以放置重复元素
        
        #####ArrayList
        * 底层是一个默认长度为10的数组, list.size超10个之后,会动态(size * 1.5 + 1)拓展底层那个数组
        * 如果系统需要频繁的查询元素,获取元素使用ArrayList 进行元素存储
        * 如果系统需要频繁的添加 删除 建议使用LinkedList
        * ArrayList 是一个线程不安全的(不同步) 集合
        ####LinkedList
        * 底层是一个双向链表
        * 如果系统需要频繁的添加 删除使用LinkedList
        * 如果系统需要频繁的查询元素,建议使用 ArrayList
        * LinkedList 是一个线程不安全的(不同步) 集合
        ####Vector
        * 老版本的Arraylist
        * 跟ArrayList是一样的,唯一区别是vector 线程安全的,Arraylist线程不安全的

    >运用场景:

    * 由Arraylist 跟 linkedlist特证决定:
        * 频繁的查询元素,用Arraylist     从数据库 获取数据,加工成 Arraylist
        * 频繁的添加 删除 ,用linkedlist

    ###set
    * 不能放置重复元素

        #####HashSet
        * 底层是一个Map,因为map的key要求是唯一,所以这造就HashSet不能重复放置元素
        * 注意点:自定义类必须重写  hashcode 跟 equals方法,如果不重写,只能通过==进行判断。
        * 获取值的时候,通过查hash表,然后对比值

        #####TreeSet
        * 特点跟HashSet 一样
        * 底层实现一个红黑树结构存储方式,所以它带排序功能
        * 注意:添加进去的元素,必须得可排序的 怎么实现呢?
            * 方法1、自定义的类实现 Comparable 接口,进而重写 CompareTo方法
            * 方法2、new TreeSet 自己添加一个比较器(Comparator 接口,实现compare方法)
    >使用场景:

    * 数据添加的数据需要不重复  HashSet TreeSet  一般选HashSet,但是如果数据还需要排序时选用TreeSet

    ###总结:
    * 如果数据关注是否重复,选用set,反之选用List

    11.最后附图一张

  • 相关阅读:
    c++笔记--数组对象、vector对象和构造函数
    马加爵之歌
    周末有同学要来
    IQ
    [转]JavaScript中typeof 讲解
    【转】JS兼容Firefox
    firefox与ie 的javascript区别
    关于委托(转)
    经典常用的javascript代码收藏
    关于DataList使用DropDownList的分页实现 技巧实例源码
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/5225924.html
Copyright © 2011-2022 走看看