目录
集合的体系结构
Collection集合:
collection集合的常用方法:
List集合:
List集合特有的方法:
ArrayList集合:
LinkedList集合:
Set集合:
HashSet集合:
HashSet保证元素唯一性源码分析:
TeSet集合:
Map集合:
HashMap集合:
Map集合的遍历方式:
Map集合的综合使用--斗地主案列:
并发修改异常:
列表迭代器:
Java面试中几个集合面试题
ArrayList和LinkedList有何区别?
Set和List的区别
HaspMap与TeMap的区别:
Collection和Collections的区别
集合的体系结构
我们先来了解下,集合类的特点:
提供一种存储空间可变的存储模型,存储的数据容量可以随时发生改变。
集合类的体系图:
通过图,我们可以看到:
Collection集合:
Collection集合是单例集合的顶层接口。但是,JDK不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List)实现,所以可以用多态的方式以及具体的实现类如:ArrayList,LinkedList,TeSet,HashSet等来创建Collection对象。
比如:CollectionStringc=newArrayList();
collection集合的常用方法:
上面是博主对collection集合的常用方法的一些展示,创建集合的时候以多态的形式创建,只要记住了常用的方法,使用起来还是很简单的。
Collection接口有两个子接口:
List(列表)
Set(集)
List集合:
List集合的特点:有索引,可以存储重复的元素,元素有序;
怎么来理解List集合的这些特点呢?我们一起来看看:
其实,List集合的底层代码是数组,所以,List在存取数据的时候,是根据数组的特性来实现的。
我们知道,数组在存储数据的时候,会先分配一些空间用来存储数据,通常,数据是依次存入的,所以数据的位置有先后顺序,就类似于索引,这样我们可以通过数据的下标找到相应的元素。
在存储数据时,因为没有判断和限定数据,所以数据在存入时是可以重复的。
所以,相应的,List集合也遵循了这些特点。
List集合特有的方法:
这些方法和Collection集合的方法使用都差不多,也比较简单,所以博主这里就不啰嗦了(绝对不是因为懒得展示,哈哈)。
从图中我们可以看到,List下面有一些实现类,比如:ArrayList集合和LinkedList集合。
ArrayList集合:
ArrayList集合的特点:底层是也是数组实现,特点是:查询快、增删慢。
因为其底层是数组的原因,所以该集合也满足数组的特征,数组下面有类似于索引的下标,所以查询起来比较快,但是由于数据是依次储存,在进行增删时,需要将其他数据依次前移或者后移补齐,所以效率较慢。
LinkedList集合:
LinkedList集合的特点:底层是链表实现,特点是:查询慢、增删快。
和ArrayList不同,LinkedList底层是链表来实现的。链表在存储数据时,是通过指向下一个元素,就像铁链一样,一环扣一环地存储的。在需要增加数据时,只需要把指向重新指给添加的元素,在删除数据时,也只需要取出该数据的这一环,再将前后的数据指向连接起来即可。
但是,在查询元素时,没查询一次,都需要从第一个元素开始查询,这就导致了,数据查询的效率很慢。
综上,我们在存储数据时,对于集合的选择,应该以实际的需求再来做判断。
LinkedListd特有的方法:
Set集合:
Set集合的特点:元素存取有序,不包含重复的元素,没有带索引的方法,所以不能用普通for循环遍历,只能通过迭代器或者增强for循环遍历。
Set集合的底层是哈希表,所他的这些特性是通过哈希表来表现出来的。
哈希表,一个元素为链表的数组,综合了链表(存储速度快)和数组(查询速度快)的优点。
在存储元素时,元素会先通过hashCode()方法来获取哈希值,如果哈希值相同,就会判断内容是否相同,如果内容也一致,就表明元素是同一个元素,就不给予储存。这就保证了元素的唯一性。
在Set集合下面有HashSet集合和TeSet集合。
HashSet集合:
HashSet集合的特点:底层数据结构是哈希表。
没有带索引的方法,不能用普通for循环遍历。
对集合的迭代顺序不作保证(无序)。
不包含重复元素。
HashSet是Set集合,所以继承于Set集合的特征。
现在,我们来详细看看Set集合保证元素的唯一性的源码分析。
HashSet保证元素唯一性源码分析:
HashSet集合保证元素唯一性的原理
.根据对象的哈希值计算存储位置:
如果当前位置没有元素则直接存入;
如果当前位置有元素存在,则进入第二步;
.当前元素的元素和已经存在的元素比较哈希值
如果哈希值不同,则将当前元素进行存储;
如果哈希值相同,则进入第三步;
.通过equals()方法比较两个元素的内容
如果内容不相同,则将当前元素进行存储;
如果内容相同,则不存储当前元素;
HashSet集合保证元素唯一性的图解:
在HashSet下面,又有LinkedHashSet。
LinkedHashSet集合特点:
哈希表和链表实现的Set接口,具有可预测的迭代次序
由链表保证元素有序,也就是说元素的存储和取出顺序是一致的
由哈希表保证元素唯一,也就是说没有重复的元素
LinkedHashSet,在Set家族中最大的特点,就是可以保证元素的有序,所以,在需要实现元素的有序时,我们就多了一种选择。
TeSet集合:
TeSet集合特点:
元素有序,可以按照一定的规则进行排序,具体排序方式取决于构造方法:
TeSet():根据其元素的自然排序进行排序;
TeSet(Comparator