一,集合框架体系
定义:用来存储多个数据的一种容器,与数组不同的是。。
集合 数组 长度 可变 固定 存储的类型是否固定 数据类型不固定 数据类型固定 存储的类型 只能存储引用类型 基本和引用类型 功能 有属性和方法 没有方法,没有属性(lenght除外)
二,Collection
Collection : 是单列集合层次结构中的根接口
collection下的子实现类是:有的集合可以无序也可有序,可重复可不重复。
方法:
boolean add() 添加
boolean addAll() 添加所有
clear() 清除
size() 长度
remove() 删除
removeAll() 删除所有
contains() 判断是否包含
isEmpty() 判断是否为空
public static void main(String[] args) { // Collections 是接口的,演示需要创建子类对象,ArrayList Collection coll = new ArrayList(); System.out.println(coll); coll.add("伟哥"); coll.add(18); coll.add("爱吃海狗人参丸"); coll.add(new Date()); System.out.println(coll); // addAll(Collection c); 将集合中的所有元素,全部添加到当前集合 Collection coll2 = new ArrayList(); coll2.add("a"); coll2.add("b"); coll2.add("c"); System.out.println(coll2); System.out.println(coll2.size()); Collection coll3 = new ArrayList(); coll3.add(1); coll3.add(2); coll3.add(3); coll3.add(coll2); System.out.println(coll3); System.out.println(coll3.size()); Collection coll4 = new ArrayList(); coll4.add(1); coll4.add(2); coll4.add(3); coll4.add("a"); coll4.add("b"); coll4.add("c"); // boolean remove System.out.println(coll4); coll4.remove(1); System.out.println(coll4); // boolean removeAll 删除全部 可以用于删除两个集合的交集的部分元素 coll4.removeAll(coll4); System.out.println(coll4); } // retainAll() 交集部分全保留,不是交集的全部删除。 Collection c1 = new ArrayList(); c1.add("a"); c1.add("b"); c1.add("c"); c1.add("d"); Collection c2 = new ArrayList(); c2.add("a"); c2.add("b"); c1.retainAll(c2); System.out.println(c1); // 判断是否包含 contains() Collection c3 = new ArrayList(); c3.add("a"); c3.add("b"); c3.add("c"); System.out.println(c3.contains("c")); System.out.println(c3.contains("A")); // 判断是否为空 System.out.println(c3.isEmpty());; // 清理集合 c3.clear(); System.out.println(c3.isEmpty());
三,泛型
泛型就是一种比较宽泛的类型定义,是一种抽象的类型。
1.作用:消除强制类型转换。
泛型使用:
在类或者方法参数定义使用泛型字母来取代之前固定的数据类型。
add(Object obj) --> add(E e)
常见的泛型字母
E(element)T(target) K(key) V(value) ?(未知)
public static void main(String[] args) {
// 设置泛型,一旦设置泛型就约束了集合只能存储该类型数据
Collection <String> c1 = new ArrayList<>();
// 这么做的目的,为了消除强制类型转换。
c1.add("a"); // 不能加入其他类型的参数。
}
四,迭代(重要)
迭代(遍历),将集合元素迭代,目的是取出来元素。
Collection 根接口,提供了一个迭代器规范 iterator(),调用该方法返回
Collection<String> c = new ArrayList<>();
c.add("a");
c.add("b");
c.add("c");
c.add("d");
c.add("e");
// 获得迭代器(里面拥有所有元素)
Iterator<String> iterator = c.iterator();
// 判断有没有下一个
while (iterator.hasNext()){
// 有下一个就返回
String e = iterator.next();
System.out.println(e);
// 体会一下泛型的好处
Collection c1 = new ArrayList();
c1.add("1");
c1.add("2");
c1.add(2);
c1.add("4");
c1.add("5");
c1.add("6");
Iterator iterator1 = c1.iterator();
while (iterator1.hasNext()){
String e = (String) iterator1.next();
System.out.println(e);
}
注意:
在迭代的过程中不能删除元素添加元素只能使用一次,必须要使用自身的添加和删除。
增强for循环
for(数据类型 变量名 : 要遍历的集合/数组){ // ... } 左则的数据类型,变量要根据集合/数组类定,变量是每次循环输出的东西。
List
List 是 Collection的子接口。
List是有序的集合:有序是指迭代顺序和和插入顺序。
特点:允许有重复的元素。
提供了可以针对索引下标操作元素的方法。
List接口中的方法大部分与父类接口Collection一样
但是除此之外的方法,确实提了可以通过下标操作元素的方法
void add(int index ,E e)
E remove(int index)
E get(int index)
E set(int index,E e)
List 是接口,没有办法演示其中的方法
List接口的两个实现类,Array List 和Link List;
Array List [重点]
array List 实现了List接口,即Array List也是有序集合,允许重复元素,且那些关于下标操作集合的方法Arra List都有。
Array List 底层是数组,大小可变是指它会扩容(不是真正的变化大小)
构造方法
- ArrayList() 创建空集合,默认创建一个长度为10 的数组
- ArrayList(Collection c) 创建一个集合,集合内容直接就是有指定的参数
- ArrayList(int initialCapacity) 创建一个指初始化容量的数组。
ArrayList<Integer> list = new ArrayList<>();
list.add(6);
list.add(8);
list.add(6);
list.add(8);
// for (Integer in : list) {
// System.out.print(in);
// }
System.out.println();
list.remove(2);
// for (Integer in : list) {
// System.out.print(in);
// }
list.add(1,7);
System.out.println(list);
list.set(2,0);
System.out.println(list);
方法
void add(int index ,E e)
E remove(int index)
E get(int index)
E set(int index,E e)
底层原理
Array List 的底层是数组。默认的长度是10,但是存储元素多余10会扩容
如何扩容的?
- 当加入元素时,先判断加入后会不会超出默认值。
- 如果没有超出默认长度
- add(Object0 ) 元素直接放后
- add(int index,Object o) 先将该位置以后的元素依次往后移动一个,然后放放到该位置
- 当加入元素时查看会不会超过容量,如果超出就扩容 阔为原来的1.5倍。
- 将原来的数组拷贝到原来的数组
- 然后再放入新元素
特点
1,有序 2,重复 3,查询更新效率低 4,删除插入效率低
应用场景 :适用于查询频率高的地方。经常查不经常改。
并发修改异常。
Linked List
是list的实现类,也是可以重复,有序,
且Link List集合也有关于下标的操作的集的方法,但是还提供一些,关于操作开头和结尾的方法
底层是使用链表实现:
特点
1.有序
2.允许重复
3.查找更新时相对效率比较低
4。插入删除时效率比较高
LinkedList<Integer> ll = new LinkedList<>();
ll.add(9);
ll.add(4);
ll.add(2);
ll.add(8);
ll.add(6);
ll.add(8);
System.out.println(ll);
ll.add(3,5);
System.out.println(ll);
ll.set(3,50);
System.out.println(ll);
ll.remove(3);
System.out.println(ll);
// 特殊的方法 操作头尾
// 获取一个头部
System.out.println(ll.getFirst());
// 获取最后一个
System.out.println(ll.getLast());
// 向头部插入
ll.addFirst(0);
System.out.println(ll);
// 向尾部添加一个
ll.addLast(66);
System.out.println(ll);
// peek() 获取移除第一个
// poll() 获取并移除第一个
// pop()
Array List | Link List | |
---|---|---|
特点 | ||
不同点 | ||
查询效率 | ||
删除效率 | ||
底层原理 |
总结:
Collection : 里面的方法都很常见,其中的方法必须记住。泛型会用就行。
迭代Iterator 或者 foreach都要会
Array List全部都是重点。创建集合,方法的使用,原理特点。
Link List 主要记住特点。