集合(Conllection)
集合即一种容器,是数据结构在Java应用中的 一种体现,早在jdk1.0的版本中就存在一些集合相关类:Stack,Properties,Vector,Dictionary;但是由于上述结构均为类,不利于扩展,并且无统一标准;因此,在JDK1.2之后Java就引入了集合框架,其中包括Collection,List,Set,Deque(JDK1.6),Map等接口.。
List接口
List接口直接从Collection接口继承而来,List集合是一个有序集合(元素在集合中的存储顺序是有序的,获取的时候根据存储的位置获取),List允许重复元素,List接口包含三个比较常用的实现类:ArrayList、LinkedList、Vector(jdk1.0)。
Set集合
Set集合也是从Collection接口继承而来,set集合是一个无序集合(存储顺序与元素的添加顺序无关),set集合不允许出现重复元素(重复元素会覆盖第一次出现的元素),不允许存在e1.equals(e2)的情况(针对HashSet的实现),set集合中的元素无法通过索引获取;Set集合有两个常用的实现类:HashSet、TreeSet。
Map集合
Map集合是一种键值对结构,不同与List与Set;Map集合中的元素通常由key-value构成,一个键可以指向一个值,但是键不允许重复,但是值可以,Map集合的出现是为了取代老式的Dictionary类,Map集合常用的两个实现类:HashMap,TreeMap。
HashMap、TreeMap、Hashtable的区别
HashMap基于散列表实现的Map(jdk1.2)接口,内部的元素存储顺序根据元素中键的Hash值排序,每个元素都存在一个独一无二的hash地址,所以不允许出现重复的键,允许空键值,此实现是线程不同步的。
TreeMap基于红黑树的实现,内的元素存储顺序默认按照元素的自然顺序排序,或者根据给定的比较器(Comparator)进行排序,集合中键必须是同一种数据类型,键对应的类型必须实现Comparable接口,并实现比较的方法(compareTo(T t))
Hashtable基于散列表的从老式Dictionary(jdk1.0)类继承,Hashtable不允许空键值存在,Hashtable是线程安全的实现(线程同步)
HashSet和TreeSet区别?
HashSet元素添加到集合中之后,元素的存储顺序,基于散列算法(计算获取对象在内存中的唯一地址)实现的元素排序,HashSet是线程不同步的实现;
TreeSet基于二叉树中红黑树算法实现,TreeSet内部的元素存储顺序跟元素实现的Comparable接口中compareTo方法有关,所以TreeSet要求所有元素所对应的类必须实现Comparable接口(TreeSet要求内部存储的元素必须是相同的数据类型),TreeSet也是线程不同步的实现;
ArrayList,LinkedList,Vector区别?
ArrayList基于可变长度的数组实现,内部通过数组拷贝原理实现容量扩展,ArrayList每次扩展为源数组的一半,ArrayList进行元素查询时相对LinkedList快(每个元素都有一个索引,可以直接根据索引获取元素),ArrayList是线程不同步的实现(效率高,不安全)
LinkedList基于链表的实现,内部元素之间通过首尾指针关联,在进行元素修改时(比如新增元素),相对ArrayList会更方便(只需要修改元素的首尾指针指向即可),但是在进行查询时链表的查询效率是低于数组的
Vector基于可变长度的数组实现,Vector每次扩展为原来长度的一倍(ArrayList是一半),Vector是线程同步的实现(效率低,安全)。