API(集合类)

集合类


    框架分类:根据存储数据的特点


        单列集合
            Collection接口
        双列集合
            Map接口


    Collection


        单列集合的根接口


        常用方法


            * `public boolean add(E e)`:  把给定的对象添加到当前集合中 。
            * `public void clear()` :清空集合中所有的元素。
            * `public boolean remove(E e)`: 把给定的对象在当前集合中删除。
            * `public boolean contains(E e)`: 判断当前集合中是否包含给定的对象。
            * `public boolean isEmpty()`: 判断当前集合是否为空。
            * `public int size()`: 返回集合中元素的个数。
            * `public Object[] toArray()`: 把集合中的元素,存储到数组中。


    迭代器


        获取对象的方式


            Iterator<E>  iterator() 返回迭代器对象Iterator
        迭代器提供的常用方法
            boolean hasNext()  问一问容器中还有没有元素
            E       next()  获取到下一个元素
            remove() 移除当前元素


        迭代器的原理


            第一步:先问一问容器中有没有可以获取的元素
            第二步: 如果有,将指针移动至下一个元素,并返回该元素的值;如果没有,循环结束


        增强for循环


            注意事项


                a.容器---集合或数组
                b.使用增强for循环遍历元素时,不能删除元素【remove】 -----否则抛出异常 java.util.ConcurrentModificationException
                c.如果需要再遍历的同时删除元素,需要使用迭代器方式进行【remove()】
            增强for循环的底层使用的是迭代器!

泛型


    什么是泛型?为什么使用泛型?使用泛型有什么好处?


            要限制数据的类型,如果数据类型不一致,提前在编译器进行错误提示,避免在运行期出现异常


    使用场景


        在类上使用
            public class 类名 <E>


        在方法上使用
            a. 类已经添加了泛型,方法参数可以直接使用
            b. 类未添加泛型,方法参数如果使用,需要在方法的返回值前添加泛型


        在接口上使用
             a.接口的实现类确定泛型的类型
            b.接口的实现类继续使用泛型,实现类在创建对象时在进行泛型类型的确定


    泛型通配符


        通配符:  ?


通配符 受限泛型


        ?     extends Number     该类型应是 指定类型或其子类 ==》上限
              ?       super Number     该类型应是 指定类型或其父类 ==> 下限

数据结构


    常见的数据结构:

栈、队列、数组、链表、红黑树


    栈特点:进口及出口同一个,先进后出


    队列特点:进口与出口不同,先进先出


    数组特点:开辟一块连续的空间进行数据的存储,有下标  查询效率高,添加元素 删除元素效率低


    链表特点:查询效率低,添加及删除效率高

list集合


    特点:

1.有序排列(存入与取出的顺序相同)2.可以存放重复的元素


    接口常用方法


- `public void add(int index, E element)`: 将指定的元素,添加到该集合中的指定位置上。
- `public E get(int index)`:返回集合中指定位置的元素。
- `public E remove(int index)`: 移除列表中指定位置的元素, 返回的是被移除的元素。
- `public E set(int index, E element)`:用指定元素替换集合中指定位置的元素,返回值的更新前的元素。

ArrayList集合与LinkedList集合


    ArrayList集合


        特点:


            实现了List接口,List接口继承Collection
所以也是有序可重复的
底层:数组【Object[]】所以查询效率高,添加、删除效率偏低


        常用方法


            * `public boolean add(E e)`:  把给定的对象添加到当前集合中 。
* `public void clear()` :清空集合中所有的元素。
* `public boolean remove(E e)`: 把给定的对象在当前集合中删除。
* `public boolean contains(E e)`: 判断当前集合中是否包含给定的对象。
* `public boolean isEmpty()`: 判断当前集合是否为空。
* `public int size()`: 返回集合中元素的个数。
* `public Object[] toArray()`: 把集合中的元素,存储到数组中。
- `public void add(int index, E element)`: 将指定的元素,添加到该集合中的指定位置上。
- `public E get(int index)`:返回集合中指定位置的元素。
- `public E remove(int index)`: 移除列表中指定位置的元素, 返回的是被移除的元素。
- `public E set(int index, E element)`:用指定元素替换集合中指定位置的元素,返回值的更新前的元素。


    LinkedList集合


        特点与原理


            原理:双向链表
特点:增删快,查询效率低

Set集合


    最大特点:

无序的,不重复的,(存入与取出的顺序不一定相同)

HashSet集合与LinkedHashSet集合


    HashSet集合


        继承了Set集合,所以也是无序不重复


        为什么存入的元素是不重复的?


            底层 : 是HashMap<E,Object>,只是使用了HashMap中的key【键】值
            原理:
                JDK1.8以前:数组+链表
JDK1.8及以后:数组+链表+红黑树


        原理的详细解析:


            首先判断当前元素的hashCode值在数组中是否存在,
          如果数组中不存在,分配位置直接进行元素的存放
      如果数组中该hashCode值已存在,使用equals方法进行比较对象的值是否相等
             如果对象的值相等,就不进行存储
              如果对象的值不相等,进行存储【链表结构存储】
            最后,如果是在JDK1.8及以后,如果链表的长度>=8时,进行树化【转化为红黑树进行存储】


    LinkedHashSet集合


        特点:

有序【linked】不重复


        适用场景:

既需要顺序,但又要去除重复元素

可变参数


    底层是数组


    使用场景:

参数的个数不确定时可以考虑使用【类型一致】


    注意事项


        a.可变参数搭配其他参数一起使用,必须将可变参数放在最后
b.在方法的参数中只能使用一次可变参数
    举例
        void mod(...  a){      }

Map集合


    双列集合:元素成对存在
    常用的实现类:HashMap   LinkedHashMap


    HashMap


        特点


            a.key不能重复,value可以重复,如果存放的元素key值相同,value值会覆盖原有的value值
            b.key和value都可以为null,key值只能存储一个null值,如果出现多个key值为null,会覆盖原有的value值


        构造方法


            无参构造(较为常用)
                加载因子:0.75 【临界值】  按照默认容量创建map对象
            带参构造
                按照指定容量创建map对象


        常用方法(增 删  改 查  长度(键值对数))


            V put(K key, V value)  将指定的值与此映射中的指定键关联。 
               V get(Object key) 返回指定的键映射的值,或 null如果这个Map不包含的键映射。 
               V remove(Object key)  如果存在的话,从这个映射中移除指定的键的映射。
               V replace(K key, V value) 仅当它当前映射到某一值时,替换指定的键的条目。
            int size() 返回这个映射中的键值映射的数目。


        map集合遍历


            a.获取所有的key值,根据key获取value
            b.获取所有的value值  【只能获取value值,无法获取key值】
            c.获取键值对Set<Map.Entry<K,V>> entrySet() 返回一个 Set视图的映射包含在这个Map。 


    LinkedHashMap


        特点: 数据结构多了一个链表,数据存储有序了

集合工具类--Collections


    特点:这个类只包含操作或返回集合的静态方法


    常用方法


        将多个元素添加至指定集合中


            特点:【容器中的元素的类型是添加元素的同类型或其父类型及其祖辈】
            用法:static <T> boolean addAll(Collection<? super T> c, T... elements)  


        随机置换指定列表使用随机默认源(打乱顺序)


            用法:static void shuffle(List<?> list)


        指定列表为排序


            用法:static <T extends Comparable<? super T>>  void sort(List<T> list)


            实现步骤


                a.定义一个Student 实现 Comparable 接口
b.重写compareTo方法
c.在compareTo方法中定义排序规则


        根据指定的比较器指定的顺序对指定的列表进行排序


            用法:static <T> void sort(List<T> list, Comparator<? super T> c) 
            通常是通过匿名内部类的方式创建比较器对象


    Comparable与Comparator的异同点


        都是接口,重写方法,功能类似


        Comparable已经被类(String/Integer)实现,已经重写过排序方法,比较规则已固定
使用时,只能按照已有的排序规则进行排序    


而Comparator可以在使用时进行重写排序方法指定排序规则,更加灵活


        两种方式可以结合使用,如果排序规则已确定,可以直接实现Comparable,并重写compareTo(T o);
当使用时规则若有变动可以灵活切换至Comparator,并重写compare(T o1, T o2);


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值