集合框架:
1:集合框架。集合是用来存储数据的,比数组操作起来
更方便,不需要考虑容量问题。可以存不同类型的数据,
但是不建议,因此有了泛型机制来约束。编译器就可以检查
元素类型是否匹配,避免了程序在运行时出现错误。
2:父接口Collection常用的子接口
List:有序,可重复(元素之间调用equals比较)
Set:无序,不可重复(元素之间调用eqauls比较)
3:List子接口的实现类
ArrayList:
内部是一个动态数组,查找速度快,增删慢
LinkedList:
内部是一个链表,查找速度慢,增删快
4:父接口Collection常用方法:
add(Object e):增加元素
remove(Object obj)
addAll(Collection c):两个集合合并
removeAll(Collection c):移除交集
retainAll(Collection c):保留交集
clear():清空集合
isEmpty():判断是否是空
size():返回集合元素的个数。
toArray():将集合对象转换成数组
subList(intfromIndex,int toIndex):获取集合的子集合。
2:List子接口----线性表
常用的实现类:
ArrayList:
是线性结构内部封装的是动态的数组。长度的增加和减少已经被封装。
可以理解为自动的。
查找快,增删慢
线程不安全,效率高
LinkedList:
是链表结构。一个元素里存了前一个元素的地址和后一个元素的地址。
增加删除快,查找慢
Vector: 线程安全,效率低。
List接口提供的方法:
add(intindex,Object obj):插入元素
get(int index):获取元素
remove(int index)
indexOf(Object obj):返回元素的下标,返回-1说明没有此元素
lastIndexOf(Object obj):
contains(Object obj):判断是否包含元素obj
3:Set接口:
无序,不可重复(元素类型的equals方法比较)
无序:与放入顺序不一致。
比喻:List好比一个有格子顺序的盒子
Set好比一个袋子。
实现类:
HashSet:底层是基于散列算法(哈希算法)来存储的数据结构
treeSet:底层是基于有序的二叉树的数据结构
4:增强for循环,作用是用来遍历集合或者是数组。
是迭代的另外一种写法,不是新语言。
编译器会将此循环编译成迭代写法。
结构:
for(元素类型 变量名:集合或数组的变量){
}
5:泛型机制。
1):泛型机制的本质是参数化类型。在类,接口和方法的
定义过程中,可以进行指定参数类型名。
在集合框架中,所有的集合类型都使用泛型机制。
好处是在进行参数化类型后,就可以限制集合元素
的类型,编译器会通过指定的泛型进行检查。
减少代码在运行时的错误。
public class ArrayList<E>{
………………
public boolean add(E e);
public E get(int index);
………………
}
ArrayList使用泛型机制,E就是类型参数。
在具体使用时,得给E赋值,赋的值是类型名。
List<String> list = new ArrayList<String>();
泛型机制不能使用八大基本数据类型
6:集合的存储:
集合元素都是引用类型。集合对象内存的是元素的地址信息,
不是元素本身。
7:集合工具类:Collections(注意与Collection的区别)
里面提供了常用的方法,其中就有sort(),用来给集合排序。
既然能使用sort对集合进行排序,说明元素之间是可以比较大小的。
能使用sort进行排序的元素类型必须实现comparable接口,
必须重写接口里的compareTo(Objectobj)方法,
这个方法就是用来进行元素之间的比较的 。
this>obj,返回>0的数。
this<obj,返回<0的数
this=obj,返回0
Comparable---compareTo(Object a)
Comparator---compare(Object a,Object b)
8.Comparable与Comparator的作用与区别
都是用来排序的:
Comparable是元素类型必须实现的接口。必须重写
compareTo(Object obj)方法。调用sort(p1)方法
return this-obj ---升序
return obj-this ----降序
Comparator是再原有排序规则上,临时改变排序规则时,
使用的比较器接口。必须实现compare(Objecto1,Object o2),
临时改变规则时,调用集合的sort(p1,p2)方法
return p1-p2 ----升序
return p2-p1 ----降序
9.Map接口:存储数据是以key-value形式存储的。key相当于value的索引。
作为key的对象类型必须重写hashCode方法。
因为key也是唯一的,不能重复的。Map的key底层就是hashSet集合。
Map接口提供的常用方法:
put(K k,V v):作用是向Map对象中添加元素
get(K k):作用是通过k获取对应的value值。
当Map中没有相应的k,那么返回的value就是null
特点:key值可以为null.
10.重写HashCode()和equals方法后的成立关系。
hash值相同,equals不一定为true
hash值不同,equals一定false.
equals为true,hash值一定相同
equals为false,hash值有可能一样
11. 队列Queue:
是一个接口,数据结构是只能一端进,一端出(FIFO).
LinkedList就实现了此接口(为什么不用ArrayList实现此接口呢?)
因为队列这种数据结构经常发生增删操作,LinkedList在增删效率上特别。
常用方法:
offer(E e):表示进入队列
poll():表示从队首出队列,返回的就是出来的元素
peek():查看队首元素,返回的就是队首元素
链表向上造型成Queue(队列接口),特点先进先出(FIFO)
向上造型成Deque(双端队列接口),特点两端都可以进与出
进:offerFirst(E e)
offerLast(E e)
出:pollFirst()
pollLast()
双端队列禁止一端的进出,就变成了栈的数据结构只用另一端来进行增删元素。
特点:先进后出(FILO)
进:push(E e)
出:pop()