java集合Collection实现类解析ArrayList LinkedList及Vector

作者:kl 时间:2022-05-01 05:44:12 

前言

平时开发经常会用到List等集合操作,在这里做一个小结

java集合Collection

java里面集合分为两大类:List和Set,下面是类图信息

java集合Collection实现类解析ArrayList LinkedList及Vector

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");
   }

来源:http://www.kailing.pub/article/index/arcid/89.html

标签:集合,Collection,ArrayList,LinkedList,Vector
0
投稿

猜你喜欢

  • c#实现16进制和字符串之间转换的代码

    2023-07-22 08:28:09
  • Android中TextView动态设置缩进距离的方法

    2023-08-07 09:52:00
  • 解决Java提示正在尝试分配更低的访问权限问题

    2023-11-04 09:31:08
  • Java之如何关闭流

    2023-11-04 21:29:11
  • java 引用类型的数据传递的是内存地址实例

    2023-11-29 15:13:53
  • java简单实现复制 粘贴 剪切功能代码分享

    2023-10-14 05:08:23
  • Java的Struts框架简介与环境配置教程

    2023-10-29 05:23:03
  • Spring AOP如何整合redis(注解方式)实现缓存统一管理详解

    2023-11-19 06:09:27
  • Java链表(Linked List)基本原理与实现方法入门示例

    2021-10-12 05:49:14
  • Spring实战之协调作用域不同步的Bean操作示例

    2023-01-23 02:48:10
  • 完整的iOS新浪微博分享功能开发

    2023-06-24 14:14:08
  • 一键清除maven仓库中下载失败的jar包的实现方法

    2023-08-13 03:43:59
  • java9新特性Collection集合类的增强与优化方法示例

    2023-01-29 05:16:57
  • drools中使用function的方法小结

    2022-02-28 21:45:59
  • 基于Spring整合mybatis的mapper生成过程

    2022-01-11 03:49:26
  • 总结一次C++ 程序优化历程

    2023-11-02 22:38:30
  • Java实现查找当前字符串最大回文串代码分享

    2023-07-30 04:05:02
  • SpringBoot项目依赖和配置最新示例讲解

    2021-08-13 23:04:23
  • SpringBoot和Swagger结合提高API开发效率

    2023-11-25 01:23:16
  • Android View移动的六种方法小结

    2023-07-06 02:43:39
  • asp之家 软件编程 m.aspxhome.com