Java进阶---集合

PS : 前段时间花了大半个月的时间了解前端的一些基本知识,现在转向后端开发。X之前学过java,但是当时在学习d的过程中缺乏实践和整理,现在有一部分知识已经健忘,比如集合、I/O、反射、多线程以及网络编程等。我们知道,学习Web后端得要有扎实的Java基础。所以现在先重新捡起这几个方面的知识,加深印象。


一.Collection

1.集合与数组的区别

集合,集合是java中提供的一种容器,可以用来存储多个数据。

数组的长度是固定的。集合的长度是可变的。而集合中存储的元素必须是引用类型数据

2.Collection 接口

一些集合允许重复的元素,而其他的则不允许。有些是有序和无序的人。JDK没有提供这个接口的任何直接的实现:它提供更具体的子接口像 SetList实现。此接口通常用于通过收集和操纵他们最大的共性是理想。

Java进阶---集合

下面是Collection接口下的常用的方法:

Java进阶---集合Java进阶---集合Java进阶---集合Java进阶---集合Java进阶---集合Java进阶---集合

PS : Collection下的子接口和子接口的实现类都拥有Collection接口下的方法

3.迭代器

a:java中提供了很多个集合,它们在存储元素时,采用的存储方式不同。我们要取出这些集合中的元素,可通过一种通用的获取方式来完成。

b:Collection集合元素的通用获取方式:在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代

Java进阶---集合

Iterator常用的两个方法:

Java进阶---集合

c:Iterator的并发修改异常

并发修改异常解决办法:在迭代时,不要使用集合的方法操作元素。

那么想要在迭代时对元素操作咋办?通过ListIterator迭代器操作元素是可以的,ListIterator的出现,解决了使用Iterator迭代过程中可能会发生的错误情况。

4. 泛型

至于什么是泛型,我就不说了

1. 泛型的好处

a:将运行时期的ClassCastException,转移到了编译时期变成了编译失败。

b:避免了类型强转的麻烦

2. 泛型的通配

匹配所有的数据类型   " ? "

? extends 父类 限制的是父类, 上限限定, 可以传递Employee,传递他的子类对象

? super  父类 限制的是子类, 下限限定, 可以传递Employee,传递他的父类对象

二、List

一个有序集合(也被称为序列)。此接口的用户在列表中的每个元素都被插入的地方有精确的控制。用户可以通过它们的整数索引(在列表中的位置)访问元素,并在列表中搜索元素。并且可以存储重复的元素

1.List接口 特有常用方法

Java进阶---集合Java进阶---集合Java进阶---集合Java进阶---集合

2.ArrayList和LinkedList

这两个List接口下的实现类就不单独展开了,下面就说说这两个实现类的区别:

ArrayList : 底层数据结构是数组,查询快,增删慢

LinkedList : 底层数据结构是链表,查询慢,增删快。LinkedList提供了大量首尾操作的方法

三、Set

不能存储重复的元素

1. HashSet 

HashSet集合,实际上是HashMap.采用哈希表结构存储数据,保证元素唯一性的方式依赖于:hashCode()与equals()方法。给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一

规则如下:先判断新元素与集合内已经有的旧元素的HashCode值

a:如果不同,说明是不同元素,添加到集合。

b:如果相同,再判断equals比较结果。返回true则相同元素;返回false则不同元素,添加到集合。

所以,使用HashSet存储自定义类型,如果没有重写该类的hashCode与equals方法,则判断重复时,使用的是地址值,如果想通过内容比较元素是否相同,需要重写该元素类的hashcode与equals方法。

哈希表的存储过程:

Java进阶---集合

2.HashSet和LinkedHashSet区别

HashSet :

a:底层结构是 哈希表结构

b:元素的存与取的顺序不能保证一致

LinkedHashSet

a:底层结构是 哈希表结构 + 链表结构

b:元素的存与取的顺序一致

四、Map

a:Map集合中的元素都是成对出现,成对存储的

b:Map集合中的元素都是以一对键和值的形式组成存在的,称为键值对,理解为夫妻对

c:Map集合中的键不能重复存储,值可以重复。依然通过重写hashCode() 与 equals()方法来保证键的唯一

d:Map集合中的每一个键 对应着一个值

1.Map接口下的常用方法:

Java进阶---集合Java进阶---集合

2.Entry键值对对象

在Map类设计时,提供了一个嵌套接口:Entry。Entry将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值。

Java进阶---集合

Map.Entry<k,v>下的常用两个方法:

Java进阶---集合

3.HashMap和LinkedHashMap

HashMap和LinkedHashMap的区别:

HashMap:

a:底层采用哈希表结构

b:不能保证元素存与取的顺序完全一致

LinkedHashMap:

a:底层采用哈希表+链表结构

b:继承自 HashMap,具有高效性,同时在 HashMap 的基础上,又在内部增加了一个链表,用以存放元素的顺序。

4.Map集合遍历的两种方式

方式1:根据键找值的方式

Java进阶---集合


方式2:根据键值对对象找键和值的方式

Java进阶---集合


注意:Map集合不能直接使用迭代器或者foreach进行遍历。但是转成Set之后就可以使用了


最后,附张集合继承体系的面向对象思想图

Java进阶---集合