2021-08-02

集合中主要包含3个接口在(package java.util(Collection,Map,Iterator))

 

上图层次关系:实线边框为实现类,折现边框是抽象类,点线边框的是接口

Iterator接口

List接口存在iterator()方法,遍历集合中的元素Iterator主要有:

  1. hasNext()如果迭代具有更多元素,则返回true。(换句话说,如果next()返回一个元素而不是抛出异常,则返回true)。

Boolean hashNext()

  1. next()返回下一个元素。返回迭代中的下一个元素。

E next()

  1. remove()删除当前元素。每次调用next()时,只能调用此方法一次。

Default void remove()

4.forEachRemaining()应用,对每个剩余元素执行给定操作,直到处理完所有元素或操作引发异常。 如果指定了该顺序,则按迭代顺序执行操作。 操作抛出的异常将转发给调用者。

default void forEachRemaining (Consumer<? super E> action)

使用Iterator遍历例子:

package pojo;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

public class Demo {

    public static void main(String[] args) {

        Dog dog1 = new Dog("小黑","土狗");

        Dog dog2= new Dog("大黑","拉布拉多");

        Dog dog3 = new Dog("点点","田园犬");

        Dog dog4 = new Dog("嘿嘿嘿","嘿嘿嘿拳犬");

        List dogs = new ArrayList();

        dogs.add(dog1);

        dogs.add(dog2);

        dogs.add(dog3);

        dogs.add(2, dog4);  //添加的时候,指定位置在第三位

        System.out.println("使用Iterator遍历,所有狗狗的昵称和品种分别是:");

        Iterator it = dogs.iterator();  //调用集合的iterator方法

        while (it.hasNext()) {      //循环遍历

            Dog dog = (Dog) it.next();  //遍历出来的对象默认是 object 类型,需要转换

            System.out.println(dog.getName() + "\t" + dog.getStrain());

        }

    }

}

 

Collection接口

javaApi并没有实现该接口的实现类,但是提供了三个子接口分别是:List,Set,Queue。下面我们对这三个子接口进行分析:

List接口是有序,可重复的集合,因为继承Collection的接口,其也继承了Collection的方法,以及自己所具有的方法,如下所述:

E  get (int index) 返回此列表中指定位置的元素

E  set​(int index, E element) 用指定的元素替换此列表中指定位置的元素(可选操作)。

E  remove​(int index) 删除此列表中指定位置的元素(可选操作)。  

Boolean  remove (Object o) 从该列表中删除指定元素的第一个匹配项(如果存在)(可选操作)。

void  add​(int index, E element) 将指定元素插入此列表中的指定位置(可选操作)。  

boolean  add​(E e) 将指定的元素追加到此列表的末尾(可选操作)。  

boolean  addAll​(int index, Collection<? extends E> c) 将指定集合中的所有元素插入到指定位置的此列表中(可选操作)。  

boolean  addAll​(Collection<? extends E> c) 将指定集合中的所有元素按指定集合的迭代器(可选操作)返回的顺序追加到此列表的末尾。  

void  clear() 从此列表中删除所有元素(可选操作)。  

static <E> List<E>   of() 返回包含零元素的不可修改列表。  

static <E> List<E> of​ (E e1) 返回包含一个元素的不可修改列表。  

static <E> List<E> of​ (E... elements) 返回包含任意数量元素的不可修改列表。  

注:List接口提供的适合于自身的常用方法均与索引有关,这是因为List集合为列表类型,以线性方式存储对象,可以通过对象的索引操作对象。

List接口的常用实现类有ArrayList和LinkedList,vertor,在使用List集合时,通常情况下声明为List类型,实例化时根据实际情况的需要,实例化为ArrayList或LinkedList。

ArrayList、LinkedList与Vector的对比:

1.ArrayList 是一个可改变大小的数组.当更多的元素加入到ArrayList中时,其大小将会动态地增长.内部的元素可以直接通过get与set方法进行访问,因为ArrayList本质上就是一个数组.

2.LinkedList 是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList

3.Vector 和ArrayList类似,但属于线程安全类。如果你的程序本身是线程安全的(thread-safe,没有在多个线程之间共享同一个集合/对象),那么使用ArrayList是更好的选择。

Map接口

Map集合存储的是一个个键值对数据,一个键对应一个值,一一对应。

Map接口(key-value)其主要的实现类是:HashMap、Hashtable、LinkedHashMap和TreeMap,下面我们对这四个接口进行分析:

HashMap我们最常用的Map。它根据键的HashCode值来存储的,我们可以根据键来获取它的值,取值的顺序是随机的,因为键的值不可以重复,所以我们键的值可以为null,但是是唯一的值,允许多条记录的值为Null,是非同步的。

Hashtable跟HashMap唯一的区别就是Hashtable是线程同步的,所以导致与线程不能同时访问Hashtable,Hashtable写入的速度比HashMap慢。Hashtable不允许键或者值为Null。

LinkedHashMap保存了记录的插入顺序,在用Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的,在遍历的时候会比HashMap慢,有HashMap的全部特性。

TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序(自然顺序),也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。不允许key值为空,非同步的;

总结

ArrayList,LinkedList,Vector的选取方式:

1.当我们不考虑线程安全性,我们可以优先考虑arrayList,ListKedList.

2.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。

3. 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

HashMap,Hashtable,TreeMap的选取方式:

1.当我们不考虑线程安全性,我们可以优先考虑HashMap,TreeMap。

2.HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap。

3.在Map 中插入、删除和定位元素,HashMap是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值