好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

代码实例

?

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 HdhCmsTestkailing.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://HdhCmsTestkailing.pub/article/index/arcid/89.html

查看更多关于java集合Collection实现类解析ArrayList LinkedList及Vector的详细内容...

  阅读:16次