黑马程序员_集合框架


java中集合类的关系图:

要求:理解并会画(其中虚线框中的代表是接口)



Collection

|--List:有序集合,这里的有序是指存取顺序是一致的,和堆栈一样,元素都有索引。元素可以重复。

|--Set:无序集合,存入的数据和取出的数据可能不一致。集合内没有重复的元素

两者皆有的方法:

①添加

         add(Object):添加一个元素

         addAll(Colletction);条件一个集合中的所有元素

②删除:

         remove(obj):删除集合中的一个数,删除后集合的长度会改变

         remove(Collection):删除集合中和Collection相同的部分元素

         clear();清空集合

③获取:

          size():集合中元素的个数

          Iterator iterator():迭代器,用来取出集合中的所有元素

④判断:

          boolean contains(obj):判断集合中是否有obj元素

         boolean containsAll(Collection);集合中是否包含指定的多个元素,

         boolean isEmpty():集合中是否有元素

⑤取交集

          boolean retainAll(Collection ):取出当前集合和传入集合的相同部分,如果两个元素相等,返回flase,如果当前集合被改变,返回true

⑥改变:

    toArray();将集合改变成为数组


List属于Collection接口的子接口,所以List具备了Collection集合的所有属性,查询API文档可以看出一个特点,那就是List特有的方法都有使用到索引

List

   |--ArrayList :底层是一个数组,线程不同步。但是此数组的长度是可变的,也就是说数组的长度会随元素的添加和删除而发生改变,元素查询速度快

   |--LinkedList:底层是一个链表,线程不同步,增删元素快

   |--Vector: 底层是一个数组结构。线程同步,查询与增删都很慢

List特有的方法:

 ①,添加:

      add(index,element);在指定位置加入一个元素

      add(index,Collection):在指定位置家收入一个集合

②删除:

     remove(index):删除指定位置的元素

③获取:

     Object get(index):获取指定索引出的值

     int IndexOf(obj):      获取元素第一次出现的位置,如果该元素不存在,返回-1,可以通过此方法判断集合中是否有某个元素

     int LastIndexOf(obj):获取该元素最后一次出现的位置

      List subList(start,end);获取从start到end的子列表。

      ListIterator listIterator():获取所有元素,list集合特有的迭代器。

④,修改;

     Object set(Index,element):对指定位置元素进行修改


List集合可以使用期索引对集合中的元素进行操作,但是在对集合进行修改的时候,会发生异常(ConcurrentModeficationException),产生这中异常的原因是在操作集合应用的时候,同时也在操作迭代器应用,这样以来,在对集合应用进行修改,迭代器并不知道,所以会产生异常。

在Interator迭代器中就只有hasNext,next,remove方法,但是他的子接口可以实现对元素的增删改查,(listIterator),该迭代器也是List特有的。


Set

Set接口中的方法和Collection中的方法时一致的,Set接口取出的方式只有一种,迭代器。

   |--HashSet:底层数据结构是哈希表,线程不同步,无序,高效。

   HashSet集合保证了集合中的元素的唯一性,通过元素的hashCode和equals方法,可以得出元素相对应的hash值,先进行hashcode 的计算,如果相同,再判断元素是否相同,相同,不存,不同,存储,如果hashCode计算不相同,不判断equals方法。

  |--LinkedHashSet:有序,hashcode的子类

  |--TreeSet:对Set集合中的元素进行指定的顺序排序,不同步,TreeSet集合底层数据结构是二叉树


TreeSet

   用于对set集合中的元素按指定顺序排序的集合,前提是集合中的元素自身要具备比较性

   想要使用TreeSet集合对所有元素进行比较排序,那么集合中的元素必须要实现Comparable接口,复写compareTo方法,依据compareTo的返回值(1,0,-1),确定元素在TreeSet中的哪一个位置.返回-1,当前对象比下一对象”小“,为1,则“大”,为0,则说明这两个对象相等,不存。

    TreeSet集合排序有两种方法:Comparable和Comparator:

    ①:让元素自身剧本比较性,需要元素事项Comparable接口,覆盖compareTo方法

    ②:让集合自身具备比较性,构造一个比较器,实现Comparator接口,覆盖comparable方法,一般使用第二种方法



Map集合

  |--Hashtable:底层是hash表数据结构,是线程同步的,键不可以为null,值也不可以为null;

  |--HashMap:底层是hash表数据结构,线程不同步,键可以为null,值也可以为null。

  |--TreeMap:底层是二叉树数据结构,线程不同步,可以对Map集合中的键进行排序操作。


Map集合和Collection集合的不同:

     Map集合存储的是一个键值对,也就是说一次存储两个元素,Collection一次只能存储一个集合,Collection是单列集合,Map是双列集合。

Map集合的特点:

     ①:添加:

       put(key,vaule);当存储的键是相同的时候,新的值会替换老的值,并返回老值,如果不键没有相同的,返回null

       putAll(Map):向Map集合中添加一个集合。

    ②删除

       void clear();清空集合

       value remove(key),删除指定键的值,并返回该值

    ③判断

       boolean isEmpty();判断集合是否有元素

      boolean containsKey(key);判断集合中是否有key

      boolean containsVaule(value):判断是否包含value

   ④取出

      int size();得到集合中元素的个数

      getKey();通过指定的键获取对应的值,返回null,该键不存在

      Collection vaules():获取Map集合中的所有的值

  想要获取Map集合中所有元素:

        Map集合中时没有迭代器的,只有Collection具备了迭代器,我们想通过迭代器迭代出Map集合中的所有元素,就必须将Map集合向Collection集合转换,由于Map集合中的key值也是不可重复地,因此可以将Map集合向Set集合转换,将Map集合向Set集合转化的方法:

      Set KeySet():取得集合中包含键的映射关系

       Set entrySet():取得是键和值的映射关系

    Entry就是Map接口中的内部接口;

    定义在map内部的原因:entry是访问键值关系的入口,是map的入口,访问的是map中的键值对,取出map集合中所有元素的方式之一:keySet方法。

      可以同过map集合中的键全部取出存放在Set集合中,通过迭代出每一个key值,再是map的get(key)得到对应的vaule值。

方法一:

Set  set = map.keySet();
Iterator i = set.iterator();
while(i.hasnext()){
        Object key = i.next();
         Object vaule= map.get(key);
           sop(key+"="+vaule);
  

}
方法二

Set entry = map.entrySet();
Iterator i = entry.iterator();
while(i.hasNext()){
       Map.Entry me = (Map.Entry)i.next();
        sop(me+"="+map.geVaulet(me));

}

使用集合的技巧:

   需要查询快:ArrayList

  需要增删快:LinkedList

  需要唯一性且效率高:HashSet

如果要唯一且要排序,使用Tree系列,记得比较就要覆盖hashCode和equals方法。

LinkedHashSet和LinkHashMap:这两个集合可以保证哈希表有存入顺序和取出顺序一致,保证哈希表有序,

当存储的是一个元素的时候使用collection,是映射之间的关系时候使用Map

保证唯一性使用Set,保证不唯一使用List


集合工具类:

Collections是一个java.util下的类,是针对集合类的一个工具类,提供一系列静态方法,他实现对集合的查找,排序,替换,线程安全化(将非同步的集合转换成为同步的)等操作;

Collection是java.util下的一个接口,他是各种集合结构的父接口,继承于他的接口主要有Set和List,提供了关于集合的一些操作,如插入,删除,判断一元素是否是其成员,遍历等。


Arrays:

用于对数组对象的操作的工具类,里面都是静态方法。


asList方法:将数组转换成为list集合

   将数组转换成为集合,可以通过list集合中的方法来操作数组中的元素,但是值得注意的是,数组的长度是固定的,不可以对数组转化而来的集合进行长度的改变,也就是增加和删除。

如果数组中存储的是对象,asList会将数组的元素直接存储在集合中,并可以直接操作,如果存储的是基本数据类型,则asList会吧整个数组作为一个整体存入集合当中(因为集合只接受对象做为其元素)。

集合变为数组:

     想要将集合变为数组:使用Collection接口中的方法toArray();

  如果给toArray传递的指定的类型的数据小于了集合的size,那么toArray方法和自动地创建一个该类的数据类型,长度为集合的size。如果传递的指定的类型的数组长度小于了集合的size。那么toArray方法,就不会创建新数组,直接使用该数组即可,只是存储完集合中的数据余下的那些位置的数据为null;

所以在传递指定类型数组时,最好的方式就是指定的长度和size相等的数组。

将集合变成数组后会有什么好处?限定了对集合中的元素进行增删操作,只要获取这些元素即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值