服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - java集合Collection实现类解析ArrayList LinkedList及Vector

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

2022-09-02 11:18kl Java教程

这篇文章主要为大家介绍了java集合Collection实现类解析ArrayList LinkedList及Vector,有需要的朋友可以借鉴参考下,希望能够有所帮助

前言

平时开发经常会用到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

代码实例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/**
 * @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的资料请关注服务器之家其它相关文章!

原文链接:http://www.kailing.pub/article/index/arcid/89.html

延伸 · 阅读

精彩推荐
  • Java教程SpringBoot JMX的基本使用方式

    SpringBoot JMX的基本使用方式

    这篇文章主要介绍了SpringBoot JMX的基本使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    你是小KS9102021-12-27
  • Java教程java日期处理工具类

    java日期处理工具类

    这篇文章主要为大家详细介绍了java日期处理工具类,其次还介绍了日期处理的基础知识,感兴趣的小伙伴们可以参考一下 ...

    jiangbang4352020-04-30
  • Java教程SpringBoot 单元测试实战(Mockito,MockBean)

    SpringBoot 单元测试实战(Mockito,MockBean)

    这篇文章主要介绍了SpringBoot 单元测试实战(Mockito,MockBean),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    PC_Repair11512021-12-21
  • Java教程阻塞队列—ArrayBlockingQueue源码分析

    阻塞队列—ArrayBlockingQueue源码分析

    ArrayBlockingQueue是一个阻塞队列,内部由ReentrantLock来实现线程安全,由Condition的await和signal来实现等待唤醒的功能。它的数据结构是数组,准确地说是一个循...

    今日头条4942020-11-19
  • Java教程Java输出链表倒数第k个节点

    Java输出链表倒数第k个节点

    这篇文章主要介绍了Java输出链表倒数第k个节点的相关内容,涉及三种设计思路及代码示例,具有一定参考价值,需要的朋友可以了解下。...

    lilivian10612021-01-19
  • Java教程基于Java中最常用的集合类框架之HashMap(详解)

    基于Java中最常用的集合类框架之HashMap(详解)

    下面小编就为大家带来一篇基于Java中最常用的集合类框架之HashMap(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看...

    SXT明辉3822021-02-03
  • Java教程解决微服务feign调用添加token的问题

    解决微服务feign调用添加token的问题

    这篇文章主要介绍了解决微服务feign调用添加token的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    synda@hzy9432021-09-22
  • Java教程Java Web开发项目中中文乱码解决方法汇总

    Java Web开发项目中中文乱码解决方法汇总

    这篇文章主要为大家详细汇总了Java Web开发项目中中文乱码的解决方法,分析了5种Java Web中文乱码情况,感兴趣的小伙伴们可以参考一下 ...

    剩菜剩饭2022020-04-30