--------| Collection 接口,集合的总接口
List 有序 可重复
Set 无序 不可重复
----| List接口中【特有的方法】:
添加:
add(index, Object o); //在指定位置上放入元素
addAll(int index, Collection c); //在指定位置上添加一个集合
获取:
Object get(int index); //获取指定下标的元素
int indexOf(Object o); //获取某个元素的下标位置
int lastIndexOf(Object o); //找出指定元素最后一次出现在集合中的位置
List subList(int fromIndex, int toIndex); //获取子List集合
修改:
set(int index, Object o); //设置指定下标上的元素
迭代:
ListIterator();
ListIterator()
List特有的迭代器
hasNext();
next();
remove();
add(Object o); //在当前迭代器指向的位置上,添加元素,其他元素向后移动
set(Object o); //替换next获取到的元素
nextIndex(); //下一个元素的下标
/*
List集合的三种遍历方式
- for循环
- 迭代器
- 增强for循环 非常常用
*/
--------------------------------------------------------------- List集合----------------------------------------------------------
--------| List集合
List 接口 有序 可重复
ArrayList 【重点】
ArrayList是底层维护了一个Object类型的数组,这样的话这个ArrayList既可以保存任意类型的数据
特征:
当调用无参构造方法ArrayList,这里创建的底层Object类型的数组元素个数默认为10
DEFAULT_CAPACITY 10
查询快,增删慢
开发中使用ArrayList比较多的情景:
图书馆,人员管理
----| ArrayList特有方法:
ensureCapacity(int minCapacity); 不常用
判断当前ArrayList里面保存元素内容Object数组,元素个数是否大于minCapacity
trimToSize(); 不太常用
截断底层维护的Object类型的数组,让数组容量变成当前ArrayList的size值【有效元素个数】
size();
查询快, 增删慢的原理:
查询快:
ArrayList底层维护是一个Object类型的数组,可以完成使用数组的下标机制来访问数据,这
种访问形式是非常快的
增加慢:
是因为在添加数据的时候,有可能导致ArrayList底层的Object数组的元素个数不够用,那么会
调用数组的扩容方法 grow,而扩容方法,是创建了一个新的数组,数组的元素个数大于是老数组的
1.5倍,这里会利用一些方法,把老数组里面的元素完完整整的拷贝的到新数组,这个拷贝过程很占
用时间和内存
删除慢:
因为删除某一个元素,会导致数组中该元素之后的数据,做一个整体的左移,这里也是一个数组的拷
贝过程,整个过程非常浪费时间
面试题:
1. 如果调用了ArrayList的无参构造方法,那么请问底层维护的Object数组默认的元素个数是多少?
如果是调用这个方法呢 new ArrayList(8);
答:默认元素个数为10 ,如果调用了new ArrayList(8) Object数组,元素个数为8
2. ArrayList是一个可以自增长的空间,请问,增长的原理是什么?增长的长度是多少?
ArrayList底层维护的是一个Object数组,默认元素为10,如果添加元素时,当前需求的元素空
间超出了Object数组的元素个数,会调用底层的grow,进行数组元素的扩容和拷贝
扩容量是大约1.5倍
新元素个数 = 老元素个数 + (老元素个数 >> 1);
newCapacity = oldCapacity + (olcCapacity >> 1);
----|LinkedList特有方法:
底层维护的是一个链表
addFirst(Object o);
addLast(Object o);
getFirst();
getLast();
removeFirst();
removeLast();
--------------------------------------------------------------Set------------------------------------------------------------------
--------| Set 接口 无序 不可重复
HashSet 底层维护是一个【哈希表】,存储效率很高!!!
TreeSet
比较器:
Comparable接口 实现compareTo方法
Comparator接口 实现compare方法
发现:
1. 添加元素的时候,每一次都会调用hashCode方法
2. 重写equals方法和HashCode方法,也是首先调用hashCode方法,再来调用equals方法
----| HashSet存储原理:【背下来!!!】
向HashSet集合中添加元素,HashSet首先会调用该元素hashCode方法,获取该对象的Hash值
通过【移位】运算,计算出,该元素应该保存在【哈希表】中哪一个位置
情况1:
该位置没有任何元素,直接放入
情况2:
该位置存在其他元素,哈希表就会调用该元素的equals方法,和已经保存在哈希表里面的元素进行
比较
如果比较结果为true 表示相同元素,无法添加
如果比较结果为false,表示为不同元素,可以添加
哈希表的每一个单元格都是一个桶式结构,可以保存多个元素,允许元素共存!!!
TreeSet是一个树形结构的Set结构
因为TreeSet是一个树形结构,所有的元素都需要进行比较之后才可以放入到Set集合中,而
字符串和自定义类对象是没有比较的方式和方法的
【要求】在TreeSet里面的所有的元素都要有【比较的方式】或者有【自然顺序】
----------------------------------------------------------Map-----------------------------------------------------------------------
--------| Map
HashMap
TreeMap
K:Key 键 !!! 唯一值!!! 不允许重复!!!
V:Value 值 一个键(Key)对应一个值(Value) 可以重复的
在Map 双列集合中,保存的只能是一个键(Key)值(Value)对!!!
Map中要学习的方法:
增
put(K key, V value); 添加一个键(Key)值(Value)对
putAll(Map extends K, ? extends V> map);
添加一个符合数据类型的Map双列集合
删
clear(); 清空所有的键(Key)值(Value)对
remove(Object key); 根据Key删除对应的键(Key)值(Value)对
改
put(K key, V value); 当键(Key)存在时,这个操作是重新修改值(Value)
查
size(); 获取键值对个数
get(Object key); 通过键(Key)找出对应的值(Value)
containsKey(Object key); 查看这个Key是否在Map中存在
containsValue(Object value); 查看这个Value是否在Map存在
keySet(); 返回所有键(Key)Set集合
values(); 返回所有值(Value)Collection集合
----| HashMap 实现类
这里把键值对,认为是一个对象,组成一个类,称之为Entry
class Entry {
K key;
V value;
}
这里可以认为在Map集合中,保存的每一个键值对都是一个Entry对象,把这些Entry对象获取出来,
做成一个集合,进行遍历
entrySet();
Map.Entry