黑马程序员——Map接口的使用,泛型机制,集合框架工具类Collections的使用

时间:2023-02-12 11:06:05
------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 

一、Map:一次添加一对元素。Collection一次添加一个元素。

      Map也称为双列集合,Collection集合也称为单列集合。

其实 map集合中存储的是键值对。map集合中必须保证键的唯一性。

 

常用方法:

  1. 添加。

    value put(key,value) :返回前一个和key关联的值,如果没有,返回null

  2. 删除。

    void clear();

    value remove();根据指定的key删除这个键值对。

  3. 判断

    booleancontainsKey(key);

    boolean containsValue(value);

    booleanisEmpty();

  4. 获取

    value get(key);通过键获取值。如果没有该键,返回null。当然可以通过返回null,来判断是否包含指定键。

    int size();获取键值对的个数。

     

    KeySet:取出map中的所有元素。原理,通过KeySet方法获取map中所有的键所在的Set集合,在通过Set的迭代器获取到每一个键,在对每一个键通过map集合的get方法获取其对应的值即可。   

     

    entrySet:该方法将键和值的映射关系作为对象存储到了Set集合中,而这个映射关系的类型就是Map,Entry类型(结婚证)。

     

    Map常用的子类:

           Hashtable:内部结构是哈希表,是同步的。不允许null做为键和值。

                         Properties:用来存储键值对型的配置文件,可以和IO技术相结合。

           HashMap:内部结构是哈希表,不是同步的。允许null做为键值。

           TreeMap:内部结构是二叉树,不是同步的。可以对Map集合的键进行排序。

     

     

    二、泛型

           jdk1.5出现的安全机制。

           优点:1,将运行时期的问题ClassCaseException转到了编译时期。

                    2,避免了强制转换的麻烦。

    <>:什么时候用?当操作引用数据类型不确定的时候。就使用<>(泛型)。将要操作的引用数据类型传入即可。其实<>就是一个用于接收具体引用数据类型的参数范围。

     

    在程序中,只要用到了带有<>的类或接口,就要明确传入。

    泛型技术是给编译器使用的技术,用于编译时期,确保了类型的安全。

     

    运行时,会将泛型去掉,生成的class文件中是不带泛型的,这个称为泛型的擦除。

    为什么擦除呢?因为为了兼容运行类加载器。

     

    泛型的补偿机制:在运行时,通过获取元素的类型进行转换动作。不用使用者再强制转换了。

     

    自定义泛型:

           JDK1.5后,使用泛型接收类中要操作的引用数据类型。

           泛型类什么时候用?当类中的操作的引用数据类型不确定的时候,就使用泛型来表示。

  1. 将泛型定义在方法上

    黑马程序员——Map接口的使用,泛型机制,集合框架工具类Collections的使用

  2. 当方法静态时,不能访问类上定义的泛型。如果静态方法使用泛型,只能将泛型定义在方法上。

    黑马程序员——Map接口的使用,泛型机制,集合框架工具类Collections的使用

     

    泛型的通配符:? 未知类型。

     对类型进行限定:?extends E:接收E类型或者E的子类型对象。上限!

                                  super E:接收E类型或者E的父类型。下限!

     

    注意:一般在存储元素的时候都是用上限,因为这样取出都是按照上限类型来运算的,不会出现类型安全隐患。

     

    什么时候用下限:通常对集合中的元素进行取出操作时,可以使用下限。

     

    集合使用的一些技巧:

    需要唯一吗?

    需要:Set

           需要制定顺序:

                  需要:TreeSet

                  不需要:HashSet

                  但是想要一个和存储一致的顺序(有序):LinkedHashSet

    不需要:List

           需要频繁增删吗?

                  需要:LinkedList

                  不需要:ArrayList

     

    如何记住每一个容器的结构和所属体系呢?

           看名字!

    List

           |--ArrayList

           |--LinkedList

    Set

           |--HashSet

           |--TreeSet

    后缀名就是该集合所属的体系。前缀名就是该集合的数据结构。

    看到array:就要想到数组,就要想到查询快。有角标。

    看到Link:就要想到链表,就要想到增删快。就要想到add getremove+first last方法。

    看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆盖hashCode方法和equals方法。

    看到tree:就要想到二叉树,就要想到排序,就要想到两个接口ComparableComparator

    而且通常这些常用的集合容器都是不同步的。

            LinkedHashMap:与存储顺序一致


     三、集合框架的工具类:Collections的使用



     

           CollectionsCollection有什么区别?


           Collection是集合框架中的一个顶层接口,它里面定义了单列集合的共性方法。

 

     它有两个常用的子接口,


          List:对元素都有定义索引。有序的。可以重复元素。


          Set:不可以重复元素。无序。


 


           Collections是集合框架中的一个工具类。该类中的方法都是静态的。

 

     此类完全由在collection上进行操作或返回collection的静态方法组成。


     提供的方法中有可以对list集合进行排序,二分查找等方法。


     通常常用的集合都是线程不安全的。因为要提高效率。


     如果多线程操作这些集合时,可以通过该工具类中的同步方法,将线程不安全的集合,转换成安全的。


     传统for和高级for的区别?

     传统for可以完成对语句执行多次,因此可以定义控制循环的增量条件。


     高级for是一种简化形式。

     它必须有被遍历的目标。该目标就是数组,要么就是Collection单列集合。


    函数的可变参数。

    其实就是一个数组,但是接收的是数组的元素。

    自动将这些元素封装成数组。简化了调用者的书写。

    可变参数只能定义在参数列表的结尾。


    静态导入:其实导入的是静态成员。

    例如:importstatic java.util.Collections.*;

    注意:当两个静态类中有同样的静态成员名,一定要加类名,否则会有冲突(调用的不确定性)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------