java集合Collection实现类解析ArrayList LinkedList及Vector
前言
平时开发经常会用到List等集合操作,在这里做一个小结
java集合Collection
java里面集合分为两大类:List和Set,下面是类图信息
List实现类
List的实现类ArrayList,LinkedList,Vector的特性
有序集合List接口的实现类LinkedLIst,ArrayList,Vector,Stack
(1)ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问,
当数组大小不满足时会增加存储能力,将已有数组数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,
需要对数组进行拷贝,移动,代价比较高。因此,它适合随即查找和遍历,不适合频繁插入和删除财操作。
(2)Vector与ArrayList一样,也是通过数组实现的。不同的是它支持线程的同步,即一时刻只有一个线程能够写Vector,
避免多线程同时写引起的不一致性。但实现同步需要很高的花费, 因此,访问它比访问ArrayList慢。
- 2.1 Vector和ArrayList在更多元素添加进来时会请求更大的空间。Vector每次请求其大小的双倍空间,而ArrayList每次对size增长50%.
- 2.2 Vector和ArrayList都是用数组实现的,所以,在添加和插入时,最好从表尾操作,而不要从中间或者表头开始,以避免数组移动引起的开销!
(3)LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随即访问和遍历速度比较慢。另外,由于它实现了接口Deque,它还提供了List没有定义的方法,专门用于操作表头和表尾元素。
(4)可以为每个List生成ListIterator,支持双向遍历List,而且能够在ListIterator位置插入和删除元素。
(5)Stack堆栈类继承Vector,它总是对列表的尾部数据进行操作,采用了先进后出的策略,自定义了push(),peek(),pop(),empty(),search()几个方法。
Set实现类
Set的实现类HashSet,LinkedHashSet,TreeSet的特性
无序集合Set的实现类HashSet,LinkedHashSet,TreeSet
(1)Set不允许存放相同的元素,判断的依据是根据存放元素的equals方法和hashCode来判断的,如有需要可以重写这两个方法
(2) HashSet:基于HashMap实现,哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放
(3)LinkedHashSet:基于LinkedHashMap实现,以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代。
LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet
(4)TreeSet:基于TreeMap实现,Set里唯一现实了SortedSet接口的实现类,默认按元素的实现接口Comparable的方法CompareTo(Object obj)升序,
如有需要,元素可实现Comparable
代码实例
/** * @author kl by 2016/4/5 * @boke www.kailing.pub */ public class CollectionTest { public void initCollection(Collection collection){ collection.add(1); collection.add(2); collection.add(3); collection.add(4); collection.add(5); collection.add(6); } @Test public void linkListTest(){ LinkedList list = new LinkedList(); //初始化数据 initCollection(list); //迭代方式一 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i).toString()); } System.out.println("-------------------------迭代方式一华丽分割线----------------------------"); //迭代方式二 for (Object o : list) { System.out.println(o.toString()); //list.add(3);//这样写直接抛异常,有这种业务需要的直接用ListIterator迭代 } System.out.println("-------------------------迭代方式二华丽分割线----------------------------"); //迭代方式三 封装了Iterator ListIterator listIterator = list.listIterator(); while (listIterator.hasNext()) { /** * 在迭代的同时可以操作当前的listIterator,对集合做增删改的操作,其他的迭代方式在迭代的时候不能直接操作集合 * ListIterator没有直接更新的方法,通过删除和添加来达到更新的目的 */ Object value=listIterator.next().toString();// if (value.equals("3")){ listIterator.remove();//删除某个元素 listIterator.add(0);//添加某个元素 }else{ System.out.println(value); } } System.out.println("-------------------------迭代方式三华丽分割线----------------------------"); //迭代方式四 ps:java.util.Iterator Iterator iterable = list.iterator(); while (iterable.hasNext()) { System.out.println(iterable.next()); } System.out.println("-------------------------迭代方式四华丽分割线----------------------------"); System.out.println("是否存在 " + list.contains(9)); //使用indexOf函数现实 System.out.println("在集合的哪个位置 " + list.indexOf(3)); //不存在返回-1 System.out.println("在集合的哪个位置 " + list.lastIndexOf(3));//从集合的最后索引往前找 list.remove(0);//移除指定下标元素 Object str[] =list.toArray();//转换成数组,感觉一般不会有这个操作 List list1=list.subList(2,6);//分割一个集合 for (Object o : list1) { System.out.println("list1 "+o.toString()); //list.add(3);//这样写直接抛异常,有这种业务需要的直接用ListIterator迭代 } list.removeFirst(); list1= (List) list.clone();//复制一份list,和直接list1=list的不同之处在于对list操作不影响list1 /*以上操作迭代LinkedList,ArrayList,Vector都可用*/ /*以下操作方式是LinkedList特有的,是实现Deque中的方法*/ list.addFirst(10); list.addLast(10); System.out.println("链表头数据 "+list.getFirst().toString()); System.out.println("链表尾数据 "+list.getLast().toString()); list.removeFirst();//移除第一个元素 list.offer(11);//方法内部使用了add方法 list.removeLast();//移除最后一个元素 } @Test public void StackTest(){ Stack list=new Stack(); initCollection(list); System.out.println("pop :"+list.pop());// pop() 移除栈顶的值,并返回移除的Obj System.out.println("push :"+list.push(5));// push() 压栈,并返回Obj System.out.println("peek :"+list.peek());// 取栈顶的值 System.out.println("empty :"+list.empty());// 判空方法,是否为空栈 System.out.println("search :"+list.search(99));//查找元素的位置,不存在返回-1,可以用来判断是否存在某个值 Enumeration en= list.elements(); //Vector特有的迭代方式 while (en.hasMoreElements()){ if(list.empty()){ }else System.out.println(en.nextElement()); } } @Test public void arrayListTest(){ ArrayList list=new ArrayList(); initCollection(list); for(Object o:list){ System.out.println(o.toString()); } } @Test public void VectorTest(){ Vector v=new Vector(); Enumeration en= v.elements(); //Vector特有的迭代方式 while (en.hasMoreElements()){ System.out.println(en.nextElement()); } } @Test public void SetTest(){ HashSet hs = new HashSet(); initSet(hs); System.out.println("HashSet 顺序:"+hs); LinkedHashSet lhs = new LinkedHashSet(); initSet(lhs); System.out.println("LinkedHashSet 顺序:"+lhs); TreeSet ts = new TreeSet(); initSet(ts); System.out.println("TreeSet 顺序:"+ts); for(Object s:hs){ System.out.println("value:"+s); } } public void initSet(Set set){ set.add("G"); set.add("B"); set.add("A"); set.add("E"); set.add("D"); set.add("C"); set.add("F"); }
以上就是java集合Collection实现类解析ArrayList LinkedList及Vector的详细内容,更多关于Collection实现类ArrayList LinkedList Vector的资料请关注脚本之家其它相关文章!
相关文章
Netty分布式NioEventLoop任务队列执行源码分析
这篇文章主要为大家介绍了Netty分布式NioEventLoop任务队列执行源码分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-03-03Spring Boot @Scheduled定时任务代码实例解析
这篇文章主要介绍了Spring Boot @Scheduled定时任务代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2020-06-06Java创建型设计模式之抽象工厂模式(Abstract Factory)
当系统所提供的工厂所需生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式,抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态2022-09-09
最新评论