1 集合体系结构
List系列集合:添加的元素有序、可重复、有索引
Set系列集合:添加的元素无序、不重复、无索引
2 单列集合
Collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用
2.1 Collection集合
2.1.1 常用方法
注意事项:
1、添加元素add()
细节1:如果我们要往List系列集合中添加元素,那么方法永远返回true,因为List系列的是允许元素重复的
细节2:如果我们要往Set系列集合中添加元素,如果当前元素不存在,方法返回true,表示添加成功。如果当前要添加的元素存在,方法返回false,表示添加是失败。因为Set系列的集合不允许元素重复
2、删除元素remove()
细节:因为Collection里面定义的是共性的方法,所以此时不能通过索引进行删除,只能通过元素的对象进行删除
3、判断元素是否包含contains()
细节:底层是依赖equals方法进行判断是否存在的,所以如果集合中存储的是自定义对象,也想通过contains方法来判断是否包含,那么javabean类中,一定要重写equals方法。
2.1.2 Collection的遍历方式
1 迭代器遍历
1)常用方法
代码实现遍历:
2)细节
1、当上面的循环结束之后,迭代器的指针已经指向了最后没有元素的位置,如果此时再次调用next方法,会报错NoSuchElementExcetion
2、迭代器遍历完毕,指针不会复位,如果我们要继续第二次遍历集合,只能再次获取一个新的迭代器对象
3、循环中只能用一次next方法
4、迭代器遍历时,不能使用集合的方法进行增加或者删除。如果要进行删除,那么可以用迭代器提供的remove方法进行删除,如果要添加,暂时没有办法。
2 增强for遍历
所有的单列集合和数组才能用增强for进行遍历
3 Lambda表达式遍历
2.2 List集合
2.2.1 特点
-
有序:存和取的元素顺序一致
-
有索引:可以通过索引操作元素
-
可重复:存储的元素可以重复
2.2.2 List集合的特有方法
注意事项:
1、添加元素add()
细节:原来索引上的元素会依次往后移
2、删除元素remove()
细节:List系列集合中的两个删除方法
1)直接删除元素 remove(Object o)
2)通过索引进行删除 remove(int index)
所以在调用方法的时候,方法会出现重载现象,此时会优先调用,实参跟形参类型一致的哪个方法
2.2.3 List集合的遍历方式
1 迭代器遍历
2 列表迭代器
获取一个列表迭代器的对象,里面的指针默认也是指向0索引的
额外添加了一个方法,在表里的过程中,可以添加元素
`Iterator<String> it = coll.iterator();
while (it.hasNext()){
String str = it.next();
if("bbb".equals(str)){
it.add("qqq")``}
System.*out*.println(str);
`}``
3 增强for
4 Lambda表达式
5 普通for循环
size方法跟get方法还有循环结合的方式,利用索引获取到集合中的每一个元素
for (int i = 0; i < list.size(); i++) {
String s1 = list.get(i);
System.*out*.println(s);
}
5中遍历方式对比
迭代器遍历:在遍历的过程中需要删除元素
列表迭代器:在遍历的过程中需要添加元素
增强for遍历:仅仅想遍历
Lambda表达式:仅仅想遍历
普通for:如果遍历的时候想操作索引,可以用普通for
2.3 List集合的实现类
2.3.1 ArrayList实现类
1 ArrayList集合底层原理
1.创建ArrayList对象的时候,他在底层先创建了一个长度为0的数组。
数组名字:elementDate,定义变量size。
size这个变量有两层含义: ①:元素的个数,也就是集合的长度 ②:下一个元素的存入位置
2.添加第一个元素时,底层会创建一个新的长度为10的数组
3.存满时,会扩容1.5倍
4.如果一次添加多个元素,1.5倍还放不下,则创建数组的长度以实际为准
2 扩容机制
扩容时机一:
-
当存满时候,会创建一个新的数组,新数组的长度,是原来的1.5倍,也就是长度为15.再把所有的元素,全拷贝到新数组中。如果继续添加数据,这个长度为15的数组也满了,那么下次还会继续扩容,还是1.5倍。
扩容时机二:
-
一次性添加多个数据,扩容1.5倍不够,怎么办呀?
如果一次添加多个元素,1.5倍放不下,那么新创建数组的长度以实际为准。
举个例子: 在一开始,如果默认的长度为10的数组已经装满了,在装满的情况下,我一次性要添加100个数据很显然,10扩容1.5倍,变成15,还是不够,
怎么办?
此时新数组的长度,就以实际情况为准,就是110
2.3.1 ArrayList实现类
1 特有方法
方法名 | 说明 |
---|---|
public void addFirst(E e) | 在该列表开头插入指定的元素 |
public void addLast(E e) | 将指定的元素追加到此列表的末尾 |
public E getFirst() | 返回此列表中的第一个元素 |
public E getLast() | 返回此列表中的最后一个元素 |
public E removeFirst() | 从此列表中删除并返回第一个元素 |
public E removeLast() | 从此列表中删除并返回最后一个元素 |
2.4 Set集合
2.4.1 特点
无序:存取顺序不一致
不重复:没有去除重复
无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素
2.4.2 Set集合的特有方法
添加元素add()
如果当前元素是第一次添加,那么可以添加成功,返回true
如果当前元素是第二次添加,那么添加失败,返回false
2.4.3 Set集合实现类
HashSet : 无序、不重复、无索引
LinkedHashSet : 有序、不重复、无索引
TreeSet : 可排序、不重复、无索引
2.4.4 Set集合的遍历方式
1 迭代器遍历
2 增强for
3 Lambda表达式
2.5 Set集合实现类
2.5.1 HashSet实现类
1 哈希值【理解】
-
哈希值简介
是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值
-
如何获取哈希值
Object类中的public int hashCode():返回对象的哈希码值
-
哈希值的特点
-
同一个对象多次调用hashCode()方法返回的哈希值是相同的
-
默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可以实现让不同对象相同属性值的哈希值相同
-
2 存储元素
哈希链表
2.5.2 LinkedHashSet实现类
底层基于哈希表,使用双链表记录添加顺序
2.5.3 TreeSet实现类
可排序、不重复、无索引
可排序:
对于数值类型:Integer,Double,默认按照从小到大的顺序进行排序
对于字符、字符串类型:按照字符在ASCII码表中的数字升序进行排序