Collection接口是处理单列数据值的最大接口;
Map接口是处理键值对数据值的最大接口。
List接口处理有序的单列数据值的接口,可以有重复元素,重复的元素按照顺序区分;
Set接口处理无序的单列数据值的接口,不能有重复元素,重复的元素被视为一个。
ArrayList 和 LinkedList 都是List接口的子类,间接实现Collection接口
Collection接口处理单列数据的接口,自然ArrayList 和 LinkedList都是处理单列数据的类
ArrayList类
1.动态数组的存储结构
2.添加/删除数据慢,查询数据快
3.没有提供对第一个和最后一个元素的操作方法
4.有10个单位的初始容量
5.扩容机制是原来的1.5倍
LinkedList类
1.双向链表的存储结构
2.添加/删除快,查询数据慢
3.提供对第一个和最后一个元素的操作方法
4.没有初始容量
5.没有扩容机制
ArrayList 和Vector 都属于集合
Vector 是实现了线程同步,是线程安全
ArrayList 没有实现线程同步,是非线程安全
ArrayList 的执行性能优于Vector
Vector集合中数据的自动扩展是原来的1倍
ArrayList集合中数据的自动扩展是原来的1.5倍
如果不需要线程安全的实现,建议使用ArrayList代替Vector。
ArrayList取代了Vector。
ArrayList类是动态数组的存储结构,随着元素的增加存储空间会自动扩展,扩容机制是原来的1.5倍
数组不是动态数组的存储结构,不会随着元素的增加自动扩展存储空间,它的存储空间是固定,一旦超过就会报错。
HashSet是Set接口最常用的实现类,底层数据结构是哈希表,HashSet不保证元素的顺序但保证元素必须唯一。
LinkedHashSet也是Set接口的实现类,底层数据结构是链表和哈希表,哈希表用来保证元素唯一,链表用来保证元素的插入顺序,即FIFO(First Input First Output 先进先出)。
HashMap类与Hashtable类与TreeMap类与ConcurrentHashMap类都是Map接口的子类,自然是都可以处理键值对数据。
HashMap类
1.HashMap 继承自AbstractMap
2.数据保存是无序的
3.重复的键被算作是一个数据。
4.允许有null键,null值
5.初始容量16
6.扩容为原来的2倍
7.根据key【键】的得到hashcode值,然后根据这个hashcode值计算元素在集合中的位置。
8.非线程安全
Hashtable类
1.Hashtable继承自Dictionary
2.数据保存是无序的
3.重复的键被算作是一个数据。
4.不允许有null键,null值
5.初始容量11
6.扩容为原来的2n+1
7.Hashtable的对象得到hashcode值,通过除数留余的计算方法来算出元素在集合中的位置
8.线程安全
TreeMap类
1.继承自AbstractMap
2.数据保存是有序按照字母顺序排列
3.重复的键被算作是一个数据。
4.允许有null键,不允许null值,键最好是String类型
5.没有初始容量
6.没有扩容机制
7.红黑树基于NavigableMap实现
8.非线程安全
ConcurrentHashMap类
1.继承自AbstractMap
2.数据保存是无序的
3.重复的键被算作是一个数据。
4.不允许有null键,null值
5.初始容量16
6.jdk8中,采用多线程扩容。整个扩容过程,通过CAS设置sizeCtl,transferIndex等变量协 调多个线程进行并发扩容。多线程无锁扩容的关键就是通过CAS设置sizeCtl与transferIndex变量,协调多个线程对table数组中的node进行迁移。
7.如果需要线程安全的并发实现,那么建议使用ConcurrentHashMap代替Hashtable 。
8.线程安全
HasMap是数据+链表+红黑树(JDK1.8 增加了红黑树部分)实现的即哈希表和红黑树。首先有一个数组,当添加一个元素(key-value)时,就首先计算元素key的hash值,以此确定插入数组中的位置,但是可能存在同一hash值的元素已经被放在数组中的同一位置了,这时候就添加到同意hash值元素的后面,他们在数组的同一位置,但是形成了链表,同一链表上的hash值是相同的,所以说数组存放的是链表,而链表的长度大于8时,链表就转换为红黑树,这样大大提高查找效率。
Collection是接口,提供了对集合中元素的一些操作方法
【add() , get(int index) remove(Object)】,
这些方法所操作的数据都是单列数据
常用接口
List----有序的单列数据接口 【根据index操作的一些方法】
Set----无序的单例数据接口 【不包括根据index操作的方法】,因为无序所以重复的元素算作一个
Collection接口java中处理单列数据的顶级接口
Map接口java中处理键值对数据的顶级接口
Collections---是个工具类,这个工具类中主要提供了一组对集合进行的方法
排序,比较,线程安全......
sort(List) copy(List1,List2).....
提供的方法都是静态方法,访问的时候无需创建对象,类名就可以完调用。
Collections是java集合框架的帮助类。
类似这种帮助类的存在还有 Arrays类,数组的帮助类。
HashMap实现过Map接口,TreeMap也实现过Map接口,都可以操作键值对数据。
一般我们如果只是需要对键值对数据进行,添加,查找等基本操作最好使用HashMap,因为它的执行速度相对比较快。
如果我们需要有序遍历集合中的键值对数据,最好使用TreeMap,因为TreeMap中添加的数据是有序的,根据二叉树结构来存储键值对数据。
数组转换list集合需要使用Arrays类中的asList(数组)
- String names[]={"zhangsan","lisi","wangwu"};
- List<String> stringList=Arrays.asList(names);
List转换成数组通过toArray的方法转换,toArray的方法返回值是Object数组
- List<String> strlist=new ArrayList<String>();
- strlist.add("javase");
- strlist.add("javaee");
- strlist.add("javame");
- Object arr[]=strlist.toArray();
- String names[]=new String[arr.length];
- int index=0;
- for(Object obj:arr){
- names[index]=(String)obj;
- index++;
- }
- System.out.println("len=="+names.length);
Iterator --- 遍历Collecrion接口集合的操作接口。【Collecrion接口的子接口/子类可以使用Iterator来遍历集合】
Iterator遍历单列数据集合的操作接口
- List<String> stringlist=new ArrayList<String>();
- stringlist.add("zhangsan");
- stringlist.add("lisi");
- stringlist.add("wangwu");
- //使用迭代器遍历集合
- Iterator<String> iterator=stringlist.iterator();
- //hasNext()--判断是否有下一个元素
- while(iterator.hasNext()){
- //next()---取得下一个元素
- String res=iterator.next();
- System.out.println(res);
- }
Map接口和它的集合类没有迭代器 Iterator
迭代器 Iterator的特点是更加安全,因为它可以保证在当前遍历的集合元素被更改的时候抛出异常ConcurrentModificationException【当不允许这样的修改时,可以通过检测到对象的并发修改的方法来抛出此异常。】