List
List接口中包含几个常用的实现类:ArrayList、LinkedList、Vector
1.- ArrayList:(数组列表),基于动态数组的实现
2.- LinkedList: (链表),基于链表的实现
3.- Vector:(数组列表),基于动态数组的实现
ArrayList
ArrayList简单的应用。
ArrayList中的 添加、删除方法。
public class ArrayListDemo {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
List<Integer> list2 = new ArrayList<>();
list2.add(10);
list2.add(20);
list.addAll(list2);
System.out.println(list.contains(100));
Iterator<Integer> it = list.iterator();
while(it.hasNext()){
int i = it.next();
it.remove();
}
}
}
ArrayList、LinkedList、Vector区别是什么?
**ArrayList:**是基于动态数组的实现,内部的实现基于数组完成,因此在进行元素查找的时候只需要根据元素的索引即可快速找到,但是在更新时或者插入时,由于数组结构是连续的,元素一旦向中间插入,则后续的元素需要整体后移,效率低。ArrayList是线程不同步的实现,在多线程并发操作时不能保证数据的安全,但是效率高;另外ArrayList在进行容量扩充是增长原来的1.5倍(增长原来长度的一半);
LinkedList:是基于双链表的实现,集合中元素的组织是通过元素的首尾指针连接,在进行数据修改时只需要改动指针的指向即可轻松实现,但是在进行查询的时候,需要从链表头依次搜索,因此修改时,效率较低.
Vector:和ArrayList一样也是基于动态数组的实现,但是Vector是老式JDK(JDK1.0)中的一个动态数组类,提供的是一些线程安全(线程同步)的集合操作,因此,在多线程并发时,对数据的安全性会有一定保障,但是带来的影响就是效率低;另外Vector当容量不足时会在原来长度的基础上增长一倍(ArrayList增长一半)。
Map
Map接口是JDK1.2新增集合框架中的一种容器,Map集合内部的元素存储采用键值对(Key-Value)结构,key不允许重复,另外每一个key都会对应一个value对象;Map集合有三个常见实现类:
- HashMap
- TreeMap
- Hashtable
HashMap、Hashtable、TreeMap的区别?
HashMap:是基于hash表的实现,是Map接口的一个实现类,内部的元素存储顺序是根据key的hash地址进行排序,因此,元素的顺序存储顺序可能跟添加的顺序不一致;HashMap使用链表加数组共同来实现元素存储;HashMap允许空键值出现,但是不允许重复的键存在(值可以重复);HashMap是线程不同步的实现,因此在操作数据时效率较高,但是线程并发是不能保障数据的一致性。如果多线程并发下使用建议使用:java.util.concurrent.ConcurrentHashMap
Hashtable:Hashtable是集合框架出现之前的键值对集合解决方案,从Dictionary类(JDK1.0)继承而来,在JDk1.2出现Map接口后,Hashtable又从改接口实现,Hashtable不允许空键值出现,该类的实现是线程同步,因此在多线程并发操作时对数据的一致性有保障,但是效率低。
TreeMap:是基于二叉树中的红黑树实现,元素的存储按照键的自然顺序排序(键必须实现Comparable接口,或者在创建TreeMap对象时指定的Comparator比较器),TreeMap中的键必须是相同的数据类型,并且不允许空元素出现,同HashMap一样,TreeMap也是线程不同步的实现
注意事项:
不允许在对集合遍历时调用集合的remove方法更改元素
如果需要在遍历时删除,因该调用通过集合获取的迭代器对象自生的remove方可更改
remove前要确保next()获取过元素,否则会出现IllegalStateException
集合框架中非常重要的 弄清楚 ArrayList、LinkedList、Vector区别
HashMap、Hashtable、TreeMap的区别。