zoukankan      html  css  js  c++  java
  • Day11:集合

    集合是Java语言中最重要的一个工具类,这个工具类涉及到Java所有的数据结构,是一个Java程序的数据容器。

    Collection接口中的共性功能。
    1,添加。
    boolean add(Object obj);一次添加一个。
    boolean addAll(Collection c);将制定容器中的所有元素添加。

    2,删除。
    void clear();
    boolean remove(object o)
    boolean removeAll(Collection c):
    boolean retainAll(Collection c);
    3,获取长度。
    int size();

    4,判断。
    boolean isEmpty();
    boolean contains(Object o)
    boolean containsAll(Collection c)

    5,将集合转成数组。
    toArray();
    toArray([]);

    6,取出集合元素。
    Iterator iterator()
    获取集合中元素上迭代功能的迭代器对象。
    迭代:取出元素的一种方式。有没有啊?有!取一个。还有没有啊?有!取一个。还有没有啊?没有。算了。
    迭代器:具备着迭代功能的对象。
    而迭代器对象不需要new。直接通过 iterator()方法获取即可。
    迭代器是取出Collection集合中元素的公共方法。

    -----------------------
    Collection
    |--List:有序(存入的顺序和取出的顺序一致)。有索引,允许重复元素。
    |--Set:不允许重复元素。


    重点List接口中的特有方法:它的特有方法都是围绕索引定义的。

    支持增删改查。
    增:
    add(index ,element)

    删:
    remove(index);

    改:
    set(index,newelement);

    查:
    int indexOf(element);
    element get(index);

    List集合的具体子类。子类之所以区分是因为内部的数据结构(存储数据的方式)不同。
    |--Vector:数据结构是数组。数组是可变长度的(不断new新数组并将元数组元素复制到新数组)。线程同步的。增删和查询都慢!
    |--ArrayList:也是数组结构,也是长度可变的。线程不同步的,替代了Vector。增删速度不快。查询速度很快。
    |--LinkedList:链表结构,线程不同步的。增删速度很快。查询速度较慢。


    作业:
    1,往ArrayList中存储自定义对象。Person(name,age)

    2,去除ArrayList集合中的重复元素(String)
    去除ArrayList集合中的重复元素(Person,同姓名同年龄视为同一个人)

    3,自己查阅LinkeList xxxFirst() xxxLast(),并写demo
    实现一个队列数据结构。

    --------------------------------
    
    
    
    Set集合:不允许重复元素。和Collection的方法相同。Set集合取出方法只有一个:迭代器。
        |--HashSet: 哈希(散列)表结构,不同步的。
            如何保证唯一性?
            元素必须覆盖hashCode和equals方法。
            覆盖hashCode方法是为了根据元素自身的特点确定哈希值。
            覆盖equals方法,是为了解决哈希值的冲突。
        |--TreeSet: 二叉树数据结构。可以对元素进行排序。不同步的。
            如何保证元素唯一性?
            参考的就是比较方法的返回值是否是0.是,就是重复元素,不存。
            排序方式:需要元素具备比较功能。所以元素需要实现Comparable接口。
                     覆盖CompareTo方法。
                     
            需求中也有这样一种情况,元素具备的比较功能不是所需要的,也就是说不想按照
            自然排序的方法,而是按照自定义的排序方式,对元素进行排序。
            而且,存储到TreeSet中的元素万一没有比较功能,该如何排序呢?
            这时,就只能使用第二种比较方式--是让集合具备比较功能,定义一个比较器。
            
            实现Comparator接口,覆盖compare方法。将Comparator接口的对象,
            作为参数传递给TreeSet集合的构造函数。
            
            比较器更为灵活。自然排序通常作为元素的默认排序。
            
    
    技巧:
    jdk1.2以后出现的集合框架中的常用子类对象,存在的规律。
    前缀名是数据结构名,后缀名是所属体系名。
    
    ArrayList: 数组结构。看到数组,就知道查询快,看到list,就知道可以重复。可以增删改查。
    
    LinkedList: 链表结构,增删快。xxxFirst xxxLast. xxx:add get remove
    
    HashSet: 哈希表, 就要想到元素必须覆盖hashCode equals,不保证有序。看到Set,就知道不可以重复。
    
    LinkedHashSet: 链表+哈希表。可以实现有序,因为有链表。
    
    TreeSet:二叉树,可以排序。就要想要两种比较方式:一种是自然排序Comparable,一种是比较器Comparator。
    
    
    --------------------------------------------
    泛型:
        在jdk1.4版本之前,容器什么类型的对象都可以存储。但是在取出时。需要用到对象的特有内容时,需要做向下转型。
        但是对象的类型不一致,导致了向下转型发生了ClassCastException异常。
        为了避免这个问题,只能主观上控制,往集合中存储的对象类型保持一致。
        
        JDK1.5以后解决了该问题,在定义集合时,就直接明确集合中存储元素的具体类型。
        这样,编译器在编译时,就可以对集合中存储的对象类型进行检查。
        一旦发现类型不匹配,就编译失败。这个技术就是泛型技术。
        
    好处:
        1,将运行时期的问题转移到了编译时期,可以更好的让程序员发现问题并解决问题。
        2,避免了向下转型的麻烦。
        
    总结:泛型就是应用在编译时期的一项安全机制。
    
    
    泛型的擦除:编译器通过泛型对元素类型进行检查,只要检查通过,
                就会生成class文件,但在class文件中,就将泛型标识去掉了。
    
    
    泛型的表现:泛型技术在集合集合框架中应用的范围很大。
                什么时候需要写泛型呢?1,只要看到类,或者接口在描述的时右边定义<>,就需要泛型。
                其实是,容器在不明确操作元素的类型的情况下,对外提供了一个参数<>。
                使用容器时,只要将具体的类型实参传递给该参数即可。
                说白了,泛型就是,传递类型参数。
    
    泛型类
    
    泛型方法,
    
    泛型接口。
    
    
    泛型的通配符 <?>
    
    
    泛型的限定:
        上限:? extends E
        下限:? super E
    Map:双列集合,一次存一对,键值对。要保证键的唯一性。
    共性的功能:
    1,添加。
        v put(key,value);
        putAll(Map<k,v> map);
    
    2,删除。
        void clear();
        v remove(key);
    
    3,判断。
        boolean containsKey(object)
        boolean containsValue(object);
        boolean isEmpty();
    
    4,获取。
        v get(key);
        int size();
        
    
    Map
        |--Hashtable:哈希表,是同步的,不允许null键,null值。
        |--HashMap: 哈希表,是不同步的,允许null键,null值。
        |--TreeMap: 二叉树,不同步的。可以对map集合中的键进行排序。
    集合框架的工具类。
    Collections:定义的都是操作Collection的静态方法。
        1,对list排序。
            sort(list);
        //排序方法上泛型的由来。
    class Student implements Comparable<Person>
    {
        public int compareTo(Person p)
        {}
    }
    
    public static <T extends Comparable<? super T>> void sort(List<T> list)
    {
        
    }
    
    public static void sort(List<Student> list)
    {
        stu1.compareTo(stu2)
    }
    
        2,逆序。
        reverseOrder
        
        
        3,max min
        
        4,二分查找。
        
        5,将非同步集合转成同步集合。
        
    -----------------------
    
    Arrays:用来操作数组的工具类,方法都是静态的。
    
        public static <T> void swap(T[] arr,int x,int y)
        {
            T temp = arr[x];
            arr[x] = arr[y];
            arr[y] = temp;
        }
        
    asList:将数组转换成集合,为了可以用集合的方法操作数组元素。不可以使用集合的增删方法。
            
    集合转数组:Collection接口 toArray();
    
    
    
    -----------------------------------
    
    Collection 和Collections的区别?
    
    
    Collection和Map的区别?
  • 相关阅读:
    蓝桥杯 历届试题 青蛙跳杯子 (BFS)
    HDOJ 1233 (克鲁斯卡尔+并查集)
    HDOJ 1198
    HDOJ 1041 (推公式,大数)水题
    单词接龙
    1284 2 3 5 7的倍数
    2020 排序相减
    isset()和empty()区别
    图像渲染
    Leetcode 328. 奇偶链表
  • 原文地址:https://www.cnblogs.com/vijay/p/3508063.html
Copyright © 2011-2022 走看看