在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