一、接口继承关系图如下
1.Collection:Collection是集合List、Set、Queue的最基本接口。
2.Iterator:迭代器,可以通过迭代器遍历集合中的数据。
3.Map:是映射表的基础接口。
二、List
Java的list是很常用的数据类型。List是有序的Collection。Java List有三个实现类:Arraylist、Vector、LinkedList。
Arraylist(数组):
●Arraylist的内部是通过数组实现的,它允许对元素进行快速随机访问。
●Arraylist适合随机查找和遍历,不适合插入和删除。当从Arraylist的中间位置插入和删除元素时,需要对数组进行复制、移动等操作,代价比较高,所以不适合进行插入和删除操作。
●ArrayList是线程不安全的。
Vector(数组实现、线程同步):
●Vector也是通过数组实现的。
●Vector是线程安全的。Vector支持线程同步,即某一时刻只有一个线程能够写Vector,这样可以避免多线程同时写而引起的不一致性,但是实现同步的代价很高,所以访问速度比ArrayList慢。
LinkedList(链表):
●LinkedList是用链表结构存储数据的,所以很适合数据的动态插入和删除,但是随机访问和遍历的速度慢。
●LinkedList是线程不安全的。
二、Set
Set用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复。对象的相等性本质是对象的hashCode值(java是依据对象的内存地址计算出的序列号)判断的。如果想让两个不同的对象视为相等的,就必须覆盖Object的hashCode方法和equals方法。
HashSet(Hash值):
●底层用hash表实现。HashSet存储元素的顺序不是按照存入的顺序,而是按照哈希值来存的。所以取数据也是按照哈希值取得。
●元素的哈希值是通过元素的hashcode方法获取的:hashset先判断两个元素的哈希值,如果哈希值一样,会接着比较equals方法,如果equals结果为true,hashset就视为同一个元素,否则就不是。
●HashSet通过hashcode值来确定元素在内存中的位置,一个hashcode位置上可以存放多个元素。
TreeSet(二叉树):
●TreeSet()是使用二叉树的原理对新add()的对象按照指定的顺序排序,每增加一个对象都会进行排序,将对象插入二叉树的指定位置。
●TreeSet是通过排序存储,Integer和String对象都可以进行默认的TreeSet排序,自定义类的对象是不可以的,必须实现Comparable接口,并且覆盖相应的comparaTo()函数才可以正常使用。
●在覆写compara()函数时,要返回相应的值才能使TreeSet按照一定的规则来排序。
●比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
LinkedHashSet(HashSet+LinkedHashMap):
●LinkedHashSet底层是LinkedHashMap保存所有元素,又继承与HashSet,其所有方法的操作又与HashSet相同。
●LinkedHashSet采用hash表存储,并用双向链表记录插入顺序。
三、Queue
相当于在两端出入的List,所以也可以用数组或链表来实现。
四、Map
HashMap(数组+链表+红黑树):
●HashMap根据键的hashcode值存储数据,所以底层是哈希表。
●HashMap最多只允许一条记录的键为null,允许多条记录的值为null。
●HashMap线程不安全,即任一时刻可以有多个线程同时写HashMap。如果需要满足线程安全,可以用Collections的synchronizedMap方法使HashMap具有线程安全的能力。
HashTable:
●底层是哈希表。
●HashTable的key和value都不允许为null。
●HashTable是线程安全的。
TreeMap:
●底层是二叉树。
●TreeMap的键不可重复,值可以重复。