临时面试,写题目时会经常看到hashMap和TreeMap进行比较,或者之类的问题。今天在这里就对集合中的所有数据结构进行梳理,争取在面试中不会做错这类题目。
在Java中,基础的数据结构有两种,一种是Collection(英文意思是收集的意思,可以理解为收集一种数据的容器,存储的方式是逻辑上连续的方式)。另外一种是Map(图,可以理解为也是一种收集数据的容器,但是这种存储的方式是key-value的形式)。
下面就来仔细分一下这两种结构包含的类容,如下图所示。
如上图, 集合Collection接口的子接口的有两个,一个是List接口另外一个是Set接口,其中List里面放入元素有序,且元素可重复。Set中放入元素无序,且元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)
1.Set接口又可以分为两种,一种是HashSet实现类,HashSet的底层还是用的HashMap进行存储(稍后会讲解),只是Hashset中只能存放对象,并且存入的数hash值不能重复。另外一种是SortedSet子接口,TreeSet则是SortedSet接口的实现类,该类的底层是由平衡二叉树实现(具体形式可以搜索百度),总之在set集合中,存放的数是不可重复数。这是set集合的最大特点。
2.List接口则有三种实现类,分别是arraylist、Vector、linkedlist,这三种都实现了List接口里的方法。ArrayList和Vector相似,他们的相同点是,他们底层都是封装了object类型的可变数组,并且他们封装的方法也一样。不同点是,arraylist是线程不安全的,使用的效率高,Vector是线程安全的,使用效率低,还有一个是,当arraylist的元素放满时,扩容的数组长度为原来的一半,vector扩容的长度是原来的一倍。LinkedList底层的实现是链表,而非数组。
此外Stack是Vectory的子类,该类实现了栈的功能,并且拥有栈的一般方法。
介绍完了集合,下面来介绍一下集合里面的工具。
3.第一个工具是迭代器,迭代器名字很高大上,其实就是遍历器。用来遍历集合中的数据。
在集合中有两种迭代器,一个是ListIterator,另外一个是Iterator,其中Iterator是另外一个子接口,它包含了父接口中的所有方法,自身还添加了更丰富的功能,所以Iterator用得更普遍。ListIterator是用来遍历List接口的子类,Iterator则是都可以遍历
4.第二个工具类就是Collections,注意这里有个s!!!!!于是就有面试题问有s和没有s的区别,这个要牢记。这个工具类是对集合进行操作的,其中包括对删除、清空、比较等方法。
5.第三个工具类就是Enumeration(枚举类),这个类也是用来遍历集合的,但是这个工具类只能遍历Vector和HashTable。Collection集合就基本上介绍到这里了。下面开始介绍Map集合。
Map集合(英文意思是地图,所谓地图,就是你给定一个数值,比如经纬度,通过这个数值就可以找到对应的地方,Map里面存放数据的原理也是如此,通过给定一个key值,就可以通过此key值确定一个相对应的值。这就是map存放数据的原理)
Map继承关系如上图,其中最重要的类是HashMap,有很多面试题都是把此类与别的类相比较。要了解具体的hashmap可以通过百度了解。其中比较常见的有比较hashmap和hashtable和比较hashmap和treemap。具体的答案请各位移步别处了解,因为我也不是很清楚。但是在知道了这继承关系后再去理解这几个类之间的区别就不是那么困难了。