Java集合框架的理解

来源:互联网 发布:华硕笔记本win10优化 编辑:程序博客网 时间:2024/05/21 19:50

Java集合框架的理解

​ 在面向对象编程中,我们常常需要把多个对象或数据按照一定的结构存储起来,这时候就需要使用集合。集合

是Java语言中非常重要的API,不仅实用性强,面试中也常见,是必须要掌握的知识点。Java的集合框架是由很多

接口、抽象类、具体类组成的,都位于java.util包中。下面是Java集合框架图: 

CollectionFramework

一.Collection接口及相关接口和实现类

1.Collection接口:

​ Collection意即集合,是集合框架中的顶级接口,所有集合类的根接口,用来保存单独的对象,它又有三个子接口List、Set、Queue。同时Collection接口是一个泛型接口,Collection。

  • 特点及用法:Collection 接口是一组允许重复的对象,用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时,就使用这一接口。 

  • 常用方法:

    • 单元素添加、删除操作: 

    boolean add(Object o):将对象添加给集合 

    boolean remove(Object o): 如果集合中有与o相匹配的对象,则删除对象o 

    • 查询操作: 

    int size() :返回当前集合中元素的数量 

    boolean isEmpty() :判断集合中是否有任何元素 

    boolean contains(Object o) :查找集合中是否含有对象o 

    Iterator iterator() :返回一个迭代器,用来访问集合中的各个元素 

    • 组操作 :作用于元素组或整个集合 

    boolean containsAll(Collection c): 查找集合中是否含有集合c 中所有元素 

    boolean addAll(Collection c) : 将集合c 中所有元素添加给该集合 

    void clear(): 删除集合中所有元素 

    void removeAll(Collection c) : 从集合中删除集合c 中的所有元素 

    void retainAll(Collection c) : 从集合中删除集合c 中不包含的元素 

    • Collection转换为Object数组 : 

    Object[] toArray() :返回一个内含集合所有元素的array 

    Object[] toArray(Object[] a) :返回一个内含集合所有元素的array。运行期返回的array
    和参数a的型别相同,需要转换为正确型别。 

  • 注意事项:Collection不提供get()方法。如果要遍历Collectin中的元素,就必须用Iterator;

    可以把集合转换成其它任何其它的对象数组,但是不能直接把集合转换成基本数据类型的数组,因为集合必须持有对象。 

2.List接口 :

继承了Collection接口,并且扩展出属于自己的方法。有三个实现的类ArrayList、LinkedList。  Vector。

  • 特点及用法:List 接口继承了 Collection 接口以定义一个允许重复项的有序集合。该接口不但能够对列

    表的一部分进行处理,还添加了面向位置的操作。 List 集合中的元素都是与索引有关系的,因此List 集合扩展的方法都是与索引有关系的。

  • 常用方法:

    void add(int index, Object element): 在指定位置index上添加元素element 

    boolean addAll(int index, Collection c): 将集合c的所有元素添加到指定位置index 

    Object get(int index): 返回List中指定位置的元素 

    int indexOf(Object o): 返回第一个出现元素o的位置,否则返回-1 

    int lastIndexOf(Object o) :返回最后一个出现元素o的位置,否则返回-1 

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

    Object set(int index, Object element) :用元素element取代位置index上的元素,并且返回旧的元素 

2.1 ArrayList类:

ArrayList被称为数组列表,数据采用数组的方式存储,使 用连续内存存储。ArrayList是Java语言中可变长度数组的实现。

  • 特点及用法:支持随机访问,而不必在除尾部的任何位置插入或除去元素时使用,查找效率高,即

    随机访问速度极快。不适合于在线性表中间需要频繁进行插入和删除操作。因为每次插入和删除都需要移动数组中的元素。

  • 常用方法:add(Object  o):集合中添加数据

​ remove(Object o):删除集合中的数据

​ add(int  index, Object element):给集合中某个索引位置添加一个数据

​ get(intindex):获取集合中某个位置的信息

  • 注意:ArrayList是线程不安全的,在多线程的情况下不要使用。
2.2 LinkedList类:

​ 称为链表,该集合类型实现了“链表”的数据结构。值得一提的是,LinkedList不仅实现了List接口,还实现了Queue接口,可以说链表同时也可以作为一个队列对象使用。使用方式与ArrayList类似。 

  • 特点及用法:LinkedList是以链表的方式存放的,每个节点上存放的是数据信息。适合于在链表中间需要频繁进行插入和删除操作。随机访问速度较慢。查找一个元素需要从头开始一个一个的找。
  • 常用方法:add(E element)—向链表末尾添加一个新的节点,该节 点中的数据是参数element指定的对象。

                   add(int index, E element)—向链表的指定位置添加一个新的 节点,该节点中的数据是参数element指定的对象。          

                   addFirst(E element)—向链表的头添加新节点,该节点中的数据是参数element指定的对象。

                   addLast(Eelement)—向链表的末尾添加新节点,该节点中的数据是参数element指定的对象。

​ offer(E e)将指定元素添加到此列表的末尾(最后一个元素)。

​ offerFirst(E e)在此列表开头插入指定的元素

​ offerLast(E e)在此列表末尾插入指定的元素

2.3 Vector

   Vector是JDK1.0版本中的集合类,后来修改为实现了List接口,不常用。Vector的功能几乎都可以被ArrayList替代,主要区别是Vector是同步的,而ArrayList不是同步的。

3.Set接口

 Set 接口继承 Collection,但不允许重复,使用自己内部的一个排列机制。有两个实现类HashSet和 TreeSet

  • 特点:Set中的元素实现了不重复,有点象集合的概念,无序,不允许有重复的元素,最多允许有一个null元素对象。Set中的元素是没有索引的,无序的。
  • 常用方法:同Collection接口
  • 注意:虽然Set中元素没有顺序,但是元素在set中的位置是有由该元素的HashCode决定的,其具体位置其实是固定的。在set接口中的不重复是由特殊要求的,Set集合中的去重和hashcode与equals方法直接相关。其实现类需重写hashcode和equals方法。
3.1 HashSet

HashSet是Set接口的最常见的实现类了。其底层是基于Hash算法进行存储相关元素的。 HashSet类按照哈希算法来存取对象,当向集合中加入一个新对象时,会调用对象的hashCode()方法得到对象的哈希码,然后根据这个码计算出对象在集合中存储的位置。

  • 常用方法:

      boolean add(E o)将指定的元素添加到 set。

    int size() :返回当前set中元素的数量 

    boolean isEmpty() :判断set中是否有任何元素 

    boolean contains(Object o) :查找set中是否含有对象o 

    Iterator iterator() :返回一个迭代器,用来访问set中的各个元素 

  • 注意:

    • 添加两个对象,创建两个对象,两个和对象在内存中的地址值不相同  因此hashCode值不相同。如要避免 需要在类中重写hashcode方法和equals方法。

    • HashSet中存储的元素的是无序的,但是由于HashSet底层是基于Hash算法实现的,使用了hashcode,

    HashSet中存储元素的位置是固定的

    • HashSet中时允许出入null值的,但是在HashSet中仅仅能够存入一个null值

3.2 TreeSet类

TreeSet是一种排序二叉树。存入Set集合中的值,会按照值的大小进行相关的排序操作。底层算法是基于红黑树来实现的。

  • 特点: 元素不重复,并且元素实现了排序。
  • 常用方法:  add(E o)将指定的元素添加到 set(如果尚未存在于该set中)。

​ first() 返回已排序set中当前的第一个(最小)元素。

   last()返回已排序set中当前的最后一个(最大)元素。

​ comparator()返回此Set中的元素进行排序的比较器

  • 注意:存储的对象必须实现Comparable接口

二.Map接口及其相关子接口和实现类

1.Map接口:

Map接口,映射接口,存放键值对。Map和Collection的区别就是,Map存的是一对一对的数据,Collection存的是一个一个的数据。Map接口主要有HashMap 和TreeMap两个实现类:

  • 特点:Map中不能有重复的key。

  • 常用方法:

    • 添加、删除操作:Object put(Object key, Object value): 将互相关联的一个关键字与一个值放入该映像。

    Object remove(Object key): 从映像中删除与key相关的映射 

    void putAll(Map t): 将来自特定映像的所有元素添加给该映像 

    void clear(): 从映像中删除所有映射 

    • 查询操作: Object get(Object key): 获得与关键字key相关的值,并且返回与关键字key相关的对象,

    如果没有在该映像中找到该关键字,则返回null 

    boolean containsKey(Object key): 判断映像中是否存在关键字key 

    boolean containsValue(Object value): 判断映像中是否存在值value 

    int size(): 返回当前映像中映射的数量 

    boolean isEmpty() :判断映像中是否有任何映射 

    • 视图操作 :Set keySet(): 返回映像中所有关键字的视图集 

    Collection values():返回映像中所有值的视图集 

    Set entrySet(): 返回Map.Entry对象的视图集,即映像中的关键字/值对

  • 注意:Map接口不直接继承于Collection接口

2.HashMap类

HashMap实现了Map、CloneMap、Serializable三个接口,并且继承自AbstractMap类,HashMap基于hash数组实现,若key的hash值相同则使用链表方式进行保存。

  • 特点: 在Map 中插入、删除和定位元素,HashMap 是最好的选择

  • 常用方法:同Map接口

  • 注意:使用HashMap要求添加的键类明确定义了hashCode()和 equals()的实现。 

3.TreeMap类
  • 特点:按自然顺序或自定义顺序遍历键,那么TreeMap会更好。

  • 常用方法: 类同Map接口,comparator()返回此映射中的键进行排序的比较器

0 0
原创粉丝点击