Java集合类List解读(云时代架构文章读后感01)

在Java学习中我们会频繁用到Java集合类,相较于数组(Array)来说,集合类的长度可变,比数组来说要灵活,更适合我们的开发学习。Java集合就像个容器可以存储任何类型的数据,也可以结合泛型来存储具体的类型对象。使用集合类一般都需要引用java.util包。

通过阅读文章我发现了我一直在用的Java集合由两大体系构成,分别是Collection体系和Map体系,其中Collection和Map分别是2大体系中的顶层接口。Collection主要有三个子接口,分别为List(列表)、Set(集)、Queue(队列)。其中,List、Queue中的元素有序可重复,而Set中的元素无序不可重复;List中主要有ArrayList、LinkedList两个实现类;Set中则是有HashSet实现类;而Queue是在JDK1.5后才出现的新集合,主要以数组和链表两种形式存在。Map同属于java.util包中,是集合的一部分,但与Collection是相互独立的,没有任何关系。Map中都是以key-value的形式存在,其中key必须唯一,主要有HashMap、HashTable、TreeMap三个实现类。

List集合是有序的,可以精确的设置元素插入位置,便捷的遍历访问元素。List中我们经常使用的就是ArrayList和LinkedList这两个类。ArrayList的底层通过数组实现,随着元素的加入动态扩容,LinkedList则是通过连表实现的,元素添加是插在链表尾部的。

List常用功能:

A:添加功能
boolean add(E e):向集合中添加一个元素
void add(int index, E element):在指定位置添加元素
boolean addAll(Collection<? extends E> c):向集合中添加一个集合的元素。

B:删除功能
void clear():删除集合中的所有元素
E remove(int index):根据指定索引删除元素,并把删除的元素返回
boolean remove(Object o):从集合中删除指定的元素
boolean removeAll(Collection<?> c):从集合中删除一个指定的集合元素。

C:修改功能
E set(int index, E element):把指定索引位置的元素修改为指定的值,返回修改前的值。

D:获取功能
E get(int index):获取指定位置的元素
Iterator iterator():就是用来获取集合中每一个元素。

E:判断功能
boolean isEmpty():判断集合是否为空。
boolean contains(Object o):判断集合中是否存在指定的元素。
boolean containsAll(Collection<?> c):判断集合中是否存在指定的一个集合中的元素。

F:长度功能
int size():获取集合中的元素个数

G:把集合转换成数组
Object[] toArray():把集合变成数组。

ArrayList是Java集合框架中使用最多的一个类,是我们平常最多使用的,是一个数组队列,线程不安全集合。

继承于AbstractList,实现了List, RandomAccess, Cloneable, Serializable接口。

(1)ArrayList实现List,就是得到了List的功能。
(2)ArrayList实现RandomAccess,获得了快速随机访问存储元素的功能,RandomAccess是一个标记接口,没有任何方法;
(3)ArrayList实现Cloneable,得到了clone()方法,可以实现克隆功能;
(4)ArrayList实现Serializable,它就可以被序列化传输,典型的应用就是hessian协议。

常用操作:

//创建ArrayList集合:
        List<类型> list = new ArrayList<类型>();
//添加功能:
        list.add(要添加的变量);   
        list.add(位置,要添加的变量);     
//修改功能:
        list.set(位置,修改的变量);
//获取功能:
        list.get(位置);
 //判断功能:
        boolean isEmpty = list.isEmpty();//是否为空
        boolean isContain = list.contains(判断存在的变量);
//长度
        list.size()
//把集合转换成数组:
        String[] strArray = list.toArray(new String[]{});
//删除功能:
        list.remove(位置);
        list.remove(要删除变量);
        list.clear();//将list释放,元素清空,且无返回值
//for循环迭代集合:
        for(String str:list){
            System.out.println(str);
        }
//迭代器遍历集合:(ArrayList实际的跌倒器是Itr对象)
Iterator it=list.iterator();
it.hasNext()

LinkedList我平常很少使用在这里看到了就写一下。LinkedList是一个双向链表,每一个节点都拥有指向前后节点的引用。相比于ArrayList来说,LinkedList的随机访问效率更低。

它继承AbstractSequentialList,实现了List, Deque, Cloneable, Serializable接口。
(1)LinkedList实现List,可以用List的方法。
(2)LinkedList实现Deque,Deque 是一个双向队列,也就是既可以先入先出,又可以先入后出,说简单些就是既可以在头部添加元素,也可以在尾部添加元素;
(3)LinkedList实现Cloneable,得到了clone()方法,可以实现克隆功能;
(4)LinkedList实现Serializable,表示可以被序列化传输,典型的应用就是hessian协议。

 常见操作://创建集合       List<类型> list = new linkedList <类型>();

//添加功能:
        list.add(要添加的变量);   
     list.addLast(要添加的变量)
lis.addFirst(要添加的变量)
//修改功能: list.set(位置,修改的变量); //获取功能: list.get(位置);
     E getFirst() 获取链表的开头 
     E getLast() 获取链表的结尾//判断功能: boolean isEmpty = list.isEmpty();//是否为空 boolean isContains = list.contains(判断存在的变量);
//长度
        list.size()
//把集合转换成数组:
        String[] strArray = list.toArray(new String[]{});
//删除功能:
        list.remove(位置);
        list.remove(要删除变量);
     E removeFirst() 移除并返回链表的开头
     E removeLast() 移除并返回链表的结尾
     list.clear();
//将list释放,元素清空,且无返回值 //for循环迭代集合: for(String str:list){ System.out.println(str); } //迭代器遍历集合:(linkedList实际的跌倒器是Itr对象) Iterator it=list.iterator(); it.hasNext()

两者比较:

(1)操作不同

(2)插入中间元素LinkedList要比ArrayList要快,因为LinkedList用的是链表,而ArrayList用的数组则需要一个个往后移元素。

总结:如果只是存放数据,并进行简单的迭代情况下,我们一般采用ArrayList的效率最高,

如果涉及到频繁的修改元素,就应该采用LinkedList

原文地址:https://www.cnblogs.com/chch157/p/10953702.html