API-集合,Collection,list,queue,泛型,list排序

(一)集合概念:
       用于存储多个对象的单一对象(容器)。存储的数据叫元素。
       元素都是引用类型。
       用于存储多个对象的容器。Ps:容器内存储的都是对象的地址。

(用于模拟现实生活中的存储容器,因此集合类型,不单单是一种。有很多
类型,设计成各种存储的数据结构。这些类型统称为集合框架)    
集合框架中包含多种接口,抽象类,实现类等,用此满足我们所需要的的
用于存储数据的数据结构   
 
元素:必须是引用数据类型的数据,不能是基本数据类型的数据。

JDK1.5新特性:
    在1.5以前,容器可以存储Object的任何子类型,但是在对元素进行
    操作时,比如调用元素的方法等。我们必需知道元素的类型,因此
    在编程中增加了大量代码,来进行强制转换,增加了开发难度。
    因此1.5开始支持了一个新特性,叫泛型机制。用来规定容器中
    存储的元素的类型。此机制可以在编译期间就进行判断元素的类型。

集合与数组的区别:
  数组:可以存储基本数据类型,也可以存储引用数据类型
  集合:只能存储引用数据类型   
  
Collection接口:
    是集合框架的顶级父接口,用来定义常用的抽象方法。
    子类需要实现相应的方法逻辑。
Collection接口和Collections的区别:后者是集合的工具类,定义了很多
用于操作集合对象的工厂/工具方法。
    
   常用方法:
    boolean add(E e):
            将对象e添加到集合中
    int size() 
            返回集合元素的个数
    boolean addAll(Collection c)
        将集合c里的元素添加到此集合中
    void clear()
        清空集合元素
    boolean contains(Object obj)
                用于判断集合中是否存在于obj相同的元素
    boolean containsAll(Collection c)            
               用于判断此集合中是否包含集合c中的所有元素
    boolean isEmpty():
              用于判断集合元素是否为空
    boolean remove(Object o)
              用于移除集合中的某一元素
    boolean removeAll(Collection c)
           用于移除此集合中与c中共有元素
    boolean retainAll(Collection c); 
        用于保留此集合中与c中共有元素 
子接口:List与Set,Queue
一、List:列表
     此接口对应的实现类的特点都是:有序的,可以重复的
     重复与否与元素的equals方法有关
  
     常用方法:
     void add(int index,E element) 
              将某一元素,插入到此集合的下标index处。
     E  get(int index)
              返回指定下标上的元素 
     int indexOf(Object obj)
              返回指定元素第一次出现的位置。如果没有,返回-1. 

 复习:
一、集合概念:是一个用于存储多个对象的容器(对象).容器内的对象
                就是元素,元素都是引用类型。
        PS:容器内存储的都是对象的地址。
二、与数组的区别?
    相同点:都是容器(数据结构),用来存储多个数据的,
    不同点
            数组:可以存储基本数据类型
            集合:只能存储引用数据类型
三、集合框架中包含多种接口,抽象类,实现类等,用此来满足我们
       所需要的用于存储数据的数据结构。  
四、Collection与Collections的区别
   Collection:是集合的父接口,定义了集合框架中常用的抽象方法
   Collections:是集合的工具类,定义了很多用于操作集合对象的
                               工厂/工具方法
五、子接口:List,Set,Queue
    List:存储此接口实现类的数据,有序,可重复。
                  有序:存储时与添加的顺序相关。有对应的索引/下标标记位置。
                          从0开始
                   重复:存储的元素可以是同一个,也可以是对象内容相同不同对象
                           根据元素的equals方法进行判断

    常用方法(序)   
   E set(int index,E newElement)
         使用新元素newElement替换下标index上的元素,返回原元素。
   boolean remove(int index):
          移除此集合中下标为index上的元素   
   List<E> subList(int fromIndex,int endIndex):
           截取此集合中的一部分,即截取子集,从fromIndex到endIndex
           包前不包后 
      PS:此方法在堆中不会产生新的集合对象。
                  变量引用的父集的一部分。
                 修改子集,会影响父集         
   int lastIndexOf(Object obj):
            返回此集合指定元素obj最后一次出现的下标。找不到返回-1.               

六、数组与集合之间的转换
       1、集合转数组
      Object[] toArray()
      E[]  toArray(E[] e);
       2、数组转集合
      List Arrays.asList(数组参数);
            注意:数组转成的集合,不能进行增删操作,否则会出现
                    运行时异常.可以进行替换操作,但是会数组变量
                    有影响。
             如果想要成功进行增删操作,可以将元素,存入新
             的集合中。
七、 Iterator:迭代器接口
    (1)迭代器的作用使用用来遍历集合元素。是一个接口。Collection接口
         提供一个方法 Iterator iterator()
    (2)Collection的实现类使用内部类定义了迭代器子类。
    (3)迭代器提供了统一的方法,用于遍历集合元素。
    常用方法:
     boolean hasNext():
                  判断集合中是否有下一个元素
     E next():
                  取出集合中的下一个元素   
     void remove():          
         在使用迭代器对集合进行遍历时,不能使用集合的移除方法
         移除集合的元素。必须使用迭代器自己提供的移除才行。
    
    1、  增强for循环-foreach循环。
     for(元素类型 变量名:要遍历的集合或者数组){
           
     }
     
     与经典for循环的区别:
     (1)增强for循环中无法使用下标。
     (2)经典for循环中可以使用下标。跟下标有关的逻辑,随便写。
八、List的三个实现类:
    (1)ArrayList
                 底层是基于动态数组的数据结构。是有存放顺序的。           
    (2)LinkedList
        底层是基于双链表的数据结构。每一个存储单元,都涉及到其他两个引用。

     优缺点: 在执行get()/set()时,ArrayList的效率高,LinkedList需要移动指针,效率低
                 在增加/删除操作时,LinkedList效率高,ArrayList效率低(需要扩容,移动元素)。
        ps:当然,在元素的数量大的情况下,区别才明显。         

    (3)Vector:是一个比较古老的集合类型,线程安全,但是效率特别低。
                           虽然安全,也不建议使用。
九、接口Queue 
    Queue也是Collection的子接口,是一种数据结构,队列。
        队列:通常都是一端进(offer),另一端出(poll)。
     
        进出原则:FIFO 
     
     
        因为队列要经常进行增删操作,所以使用Linkedlist
        实现了Queue接口.  
        
        常用方法:
    boolean offer(E e):
                元素从队尾进入队列。
    E poll():
               从队首移除元素,返回被移除的元素。当队列没有元素时
               返回null.
    E peek(): 
                查看队首元素,不移除。队列中没有元素时,返回null.        
        注意: 为了避免移除队列的队首时出现null,我们最好先查看队首
                 是不是null.
                 
   
   Deque:是一个Queue的子接口,实现的是双端队列的数据结构。
                  双端队列:两端都可以进,也都可以出。
                  
         E offerFirst();
         E offerLast(); 
         E pollFirst();
         E pollLast();
         E peekFirst();
         E peekLast(); 
   
       栈的数据结构:先进后出:FILO
                我们可以将双端队列的一端进行禁止操作。另一端进或
                出,即Stack 
                
        void push(E e):
             将元素 e推进栈中
        E pop():
                        将栈中的最顶端的元素,移除。     

==========================================
泛型机制:
   (1)概念
   jdk1.5版本开始使用的新特性,本质是进行"参数化类型",在类
      ,接口,方法的定义上都可以使用,用来指定数据类型名的。
   (2)集合在定义时,可以用泛型机制来指定元素的类型,这样
            编译器在编译期间就可以进行检查元素类型是否匹配,避免了
           程序在运行时出现过多的错误  
   (3)集合框架中的所有类型(接口,抽象类,实现类)都是用了
            泛型机制    
   (4)泛型机制的参数只能传引用类型。                 
    
        练习:   自定义一个类型,练习泛型机制
        
               定义一个类型MyContaionner:
               使用泛型机制,用于规定要存储的元素类型
===============================================
List排序
Comparable接口:        
       如何定义集合中元素之间的大小之分?我们需要在定义元素类型
       时实现Comparable接口,实现接口内的compareTo(E e)。实现此接口的类型的对象之间可以进行
       比较。
 
 方法:
    int  compareTo(E e):
        比较规则: 
       (1)this与e比较,this-e,
                  如果大于0,返回大于0的一个数
                  如果等于0,   返回0
                  如果小于0,  返回小于0的一个数
                  按照升序排序
       (2)e-this,降序排序
 工具类:Collections
        提供了一个sort(Collection c)方法,
        对集合里的元素进行排序  
        
        
     练习:定义一个类型Point,在集合List中存储五个Point对象
             按照到原点的距离长短进行降序排序。     
             
 Comparator比较器接口:
           如果元素类型已经实现了comparable接口,定义了默认的比较规则。
           之后,再想换其他比较规则时,不修改源码。可以利用比较器接口
           来重新定义比较规则  
     
     方法:
     int compare(E o1,E o2);
        比较规则:
        升序: o1-o2
        降序: o2-o1 

猜你喜欢

转载自blog.csdn.net/qq_42397691/article/details/82026440