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