集合
集合和数组的区别
集合的长度可变, 只能存储引用数据类型
数组的长度不可变 能存储基本数据类型,也能存储引用数据类型
建议集合的创建放在运行类中,这样调用其他类的时候就可以共享同一个集合
Collection类的API
List接口API
1.有索引
2.元素可以重复
3.存储和取出有顺序
ArrayList类
ArrayList的底层是一个数组,查询块,增删慢
当创建ArrayList的时候,数组的长度默认为0
当开始添加元素的时候,数组的长度默认为10,地址值发生变化
当一直添加元素直到超过10的时候,数组的长度扩容为原来的1.5倍,地址值发生变化
LinkedList类
底层结构是双链表,查询慢,增删快
数据结构
1、栈(先进后出)
2、队列(先进先出)
3、数组(查询速度快、增删慢)
查询速度快:查询数据通过地址值和索引定位,查询任意数据耗时相同。(元素在内存中是连续存储的)
删除效率低:要将原始数据删除,同时后面每个数据前移
4、链表(查询慢,增删快)
单向链表
双向链表
5、二叉树
二叉查找树(遵循左小右大的规则)
二叉平衡树
1.遵循左小右大的规则
2.高度差不超过1
红黑树(增删改查性能都很好)
1.遵循左小右大的规则
2.最大长度不超过最小长度的2倍
3.要求比平衡树低
迭代器
itr.next()返回当前元素,然后指向下一个元素
ConcurrentModificationException:并发修改异常.迭代器在获取数据时,不能往集合中添加数据
// 1.获取迭代器
Iterator<String> itr = coll.iterator();
// 循环判断是否有下一个元素
while (itr.hasNext()) {
// 取出下一个元素
String name = itr.next();
System.out.println(name);
}
增强for
int[] arr = new int[] {11, 22, 33};
for (int n : arr) {
System.out.println(n);
}
for (数据类型 变量名: 数组或集合) {
}
遍历数组的时候底层是一个普通for循环
遍历集合的时候底层是一个迭代器
缺点:无法操作索引
泛型
泛型的格式
<数据类型>
泛型其实就是一个标签,标记编译阶段只能操作某种数据类型。
泛型的好处
把运行时期的问题提前到了编译期间。 避免了强制类型转换。
泛型方法
public class Demo13 {
public static void main(String[] args) {
show(123);
show(6.66);
show("abc");
show(true);
}
// 定义泛型方法
public static <T> void show(T x) {
System.out.println(x);
}
}
泛型接口
//定义泛型接口
public interface Swimmable<E> {
public abstract void swimming(E msg);
}
// 1.定义实现类时指定泛型类型
public class Student implements Swimmable<String> {
@Override
public void swimming(String msg) {
System.out.println(msg);
}
}
<? extends Car>: 泛型可以是Car及其子类, 向上限定
<? super Car>: 泛型可以是Car及其父类, 向下限定