1、Collection顶层接口
Collection接口是集合框架的顶层接口是list和set的父接口,不是Map集合的父接口,以下是关系图如示:
2、有序、无序
有序:元素添加的顺序和元素输出的顺序一致
无序:允许添加重复元素
案例:
List list = new ArrayList();
list.add("ewq");
list.add("wq");
list.add("q");
list.add("dsa");
list.forEach(System.out::println);
输出结果:
3、遍历方式for&foreach&iterator
for:根据下标获取元素
List list = new ArrayList();
list.add("ewq");
list.add("wq");
list.add("q");
list.add("dsa");
int size = list.size();
for (int i=0;i <size;i++){
System.out.println(list.get(i));
}
foreach:循环输出集合中所有元素
for (Object i : list) {
System.out.println(i);
}
iterator:获取迭代器循环输出集合中所有元素
Iterator ite = list.iterator();
while (ite.hasNext()){
Object var=ite.next();
System.out.println(var);
}
4、迭代器的原理
两个重要的方法:
1) hashNext():用于判断迭代器中的下一个元素是否存在,不移动下标
2) naxt():移动下标并读取当前数据
// while(it.hasNext()){
// System.out.println(it.next());
// }
5、删除方法
1) for正面删除
int size = list.size();
//1) for正向删除
// System.out.println("数据大小为:"+list.size());
// for (int i = 0;i<size; i++){
// list.remove(0);
// }
// System.out.println("数据大小为:"+list.size());
2) for负面删除
// System.out.println("数据大小为:"+list.size());
// for (int i = size-1;i>=0;i--){
// list.remove(i);
// }
// System.out.println("数据大小为:"+list.size());
3)迭代器(推荐)
while (it.hasNext()){
it.next();
it.remove();
}
6、集合优化
避免造成资源空间浪费,对于一些大型项目而言就尤为重要
案例:
package com.zking.test;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class text02 {
public static void main(String[] args) {
//1.list集合优化
//核心概念:
//1、负载因子:1.5
//2、初始容量:10
//3、扩容计算公式:容器大小*负载因子
List lst =new ArrayList<>(50);
for(int i = 0;i<50;i++){
lst.add(i);
System.out.println(i);
getLen(lst);
}
}
public static void getLen(List lst){
try{
//获取类对象
Class cls = lst.getClass();
//获取类对象中的属性
Field field = cls.getDeclaredField("elementData");
//设置权限
field.setAccessible(true);
//获取属性的值
Object[] arr = (Object[]) field.get(lst);
System.out.println("list集合的大小:"+arr.length);
}catch (Exception e){
e.printStackTrace();
}
}
}
7、范型
从 Java 1.5 开始提供了泛型。泛型可以在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。
注意:
> JDK1.5以上才有。
> 1)以类型为参数的类叫做泛型
> 2)泛型的默认类型为Object
> 3)作用:提高程序的健壮性、简化代码
案例:
package com.zking.test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class test3 {
public static void main(String[] args) {
//范型
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
//获取迭代器
Iterator ite = list.iterator();
while (ite.hasNext()){
ite.next();
ite.remove();
}
}
}
8、装拆箱
示例:送快递,寄快递时需要对物品进行包裹,收快递后就需要对包裹进行拆包。
> 装箱:值类型到引用类型
> 拆箱:引用类型到值类型
9、ArrayList、LinkedList和Vector的区别
ArrayList和LinkedList的区别
- **相同点**
1、LinkedeList和ArrayList都实现了List接口。
2、ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用(references)。
- **不同点**
1、ArrayList底层实现是数组,而LinkedList是双向链表。
2、ArrayList查询快(下标)、增删改慢、LinkedList是查询慢,但是在插入删除时效率比较高。
ArrayList和Vector的区别
- **相同点**
1、ArrayList和Vector都是用数组实现的
2、默认初始化大小都是10
- **不同点**
1、Vector多线程是安全的,而ArrayList不是。Vector类中的方法很多有synchronized进行修饰,这样就导致了Vector在效率上无法与ArrayList相比;
2、两个都是采用的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式是不同的。(ArrayList每次存储时会检查空间大小,不够时会扩充为原来的1.5倍,Vector会扩充为原来空间的2倍)。