List是Java中比较常用的集合类,关于List接口有很多实现类。
ArrayList、LinkedList和Vector之间的关系和区别。
List 是一个接口,它继承于Collection的接口,它代表着有序的队列。当我们讨论List的时候,一般都和Set作比较。
List中元素可以重复,并且是有序的(这里的有序指的是按照放入的顺序进行存储。如按照顺序把1,2,3存入List,那么,从List中遍历出来的顺序也是1,2,3)。
Set中的元素不可以重复,并且是无序的(从set中遍历出来的数据和放入顺序没有关系)。
ArrayListArrayList底层是用数组实现的,可以认为ArrayList是一个可改变大小的数组。随着越来越多的元素被添加到ArrayList中,其规模是动态增加的。LinkedListLinkedList底层是通过双向链表实现的。
所以,LinkedList和ArrayList之前的区别主要就是数组和链表的区别。数组中查询和赋值比较快,因为可以直接通过数组下标访问指定位置。链表中删除和增加比较快,因为可以直接通过修改链表的指针(Java中并无指针,这里可以简单理解为指针。其实是通过Node节点中的变量指定)进行元素的增删。
所以,LinkedList和ArrayList相比,增删的速度较快。但是查询和修改值的速度较慢。同时,LinkedList还实现了Queue接口,所以他还提供了offer(), peek(), poll()等方法。
VectorVector和ArrayList一样,都是通过数组实现的,但是Vector是线程安全的。和ArrayList相比,其中的很多方法都通过同步(synchronized)处理来保证线程安全。
如果你的程序不涉及到线程安全问题,那么使用ArrayList是更好的选择(因为Vector使用synchronized,必然会影响效率)。
二者之间还有一个区别,就是扩容策略不一样。
在List被第一次创建的时候,会有一个初始大小,随着不断向List中增加元素,当List认为容量不够的时候就会进行扩容。Vector缺省情况下自动增长原来一倍的数组长度,ArrayList增长原来的50%。
如何选择
如果涉及到多线程,那么就选择Vector(当然,你也可以使用ArrayList并自己实现同步)。
如果不涉及到多线程就从LinkedList、ArrayList中选。 LinkedList更适合从中间插入或者删除(链表的特性)。 ArrayList更适合检索和在末尾插入或删除(数组的特性)。
具体用法
1.list中添加,获取,删除元素;
添加方法是:.add(e);
获取方法是:.get(index);
删除方法是:.remove(index);
按照索引除; .remove(Object o); 按照元素内容删除;
2.list中是否包含某个元素; 方法:.contains(Object o); 返回true或者false
3.list中根据索引将元素数值改变(替换);注
意 .set(index, element); 和 .add(index, element); 的不同;
4.list中查看(判断)元素的索引; 注意:.indexOf(); 和 lastIndexOf()的不同;
5.根据元素索引位置进行的判断;
6.利用list中索引位置重新生成一个新的list(截取集合);
7.对比两个list中的所有元素; //两个相等对象的equals方法一定为true, 但两个hashcode相等的对象不一定是相等的对象8.判断list是否为空;//空则返回true,非空则返回false
9.返回Iterator集合对象;System.out.println("返回Iterator集合对象:"+person.iterator());
10.将集合转换为字符串;String liString="";liString=person.toString();System.out.println("将集合转换为字符串:"+liString);
11.将集合转换为数组;System.out.println("将集合转换为数组:"+person.toArray());
12.集合类型转换;
//1.默认类型List<Object> listsStrings=new ArrayList<>(); for (int i = 0; i < person.size(); i++) { listsStrings.add(person.get(i));}List<StringBuffer> lst=new ArrayList<>(); for(String string:person){ lst.add(StringBuffer(string));}
13.去重复;