Java基础—Day16
目标:
- 掌握集合体系
- 常用的集合必须熟练使用
- 对于常用的面试题要游刃有余,只要点到为止,大致知道一些源码知识
1. 集合概述
1.1 为什么学集合
提高开发效率,简化开发!!!!!!
对比数组:优缺点&特点
- 长度固定,一旦定义,不能修改 所以让它自动去扩容---》ArrayList,本质上是一个数组
- 能放任意类型的数据
- 根据下标查询某个元素,快
- 但是对于插入和删除,慢!对于这个操作,我们需要挪位,同时需要拿一个新数组去装新数据---》链表结构
- 我们之前存放的数据:一维数组存放的是 单列数据 ;针对 双列数据 ,比如我们常见的书的目录 ---》详情页;电话号码 --- 》 张三,怎么存?假定你用数组【多维】,应该也很麻烦, Map( Key 、 Value )
1.2 集合是什么
数组是一个容器,集合也是一个容器!!!就是放数据的,可以放任意类型的数据!!!
1.3 集合的体系
2. 使用层面
2.1 Collection之方法概览
掌握这个接口中有哪些公共的方法
方法整体概览:
2.2 泛型集合
我们在遍历集合的时候,若该集合中存放的是多种数据类型,若只想获取某一种,需要强转;若不强转,则 会抛出运行时异常:类型转换异常
- 期望能否不需要强转,将运行时异常,提前到编译时
- 限定这个集合中只能存放学生,若放别的,编译不通过!!!!
----》 使用泛型约束,泛型集合,即约束当前集合中,只能存放的数据类型
好处:
- 限定类型,将运行时异常,提前到编译器 ----》屎黄色也没了
- 不需要进行类型转换
2.3 Iterator
使用迭代器的目的就是获取元素!!不要在这里面用集合的方法进行修改了!!!!会用即 可!!!!
1. 基本使用,常用的两个方法:
- hasNext() :判断是否有下一个元素
- next() :获取当前迭代器中的每个元素值
2. 使用 Iterator 的注意事项,在使用集合的方法进行修改操作【修改、删除】,可能出现如下异常: ConcurrentModificationException
注意:在使用迭代器的时候,尽量不要使用集合的方法,进行修改操作!!!!你要移除元素的话,用 迭代器中的remove()
3. 大致原理:做一个大致了解
有一个指针一样的东西,在指向你要取到哪一个元素。在 hasNext() 方法中,有元素的条件如下:
next() 的逻辑
2.4 ArrayList 重点*****
2.4.1 基本使用
部分如下:
需要掌握的特有方法:
add(int index,Object obj)
get(int index)
sort(Comparator c) :这个Comparator是一个函数式接口,可以直接使用lambda
ArrayList 的遍历方式:
- 经典for循环
- 增强for循环
- 迭代器
- foreach
注意:经典for的速度快于迭代器
2.4.2 源码部分
构造方法:提供了3个构造方法
3.泛型
目标:知道泛型是啥,见到认识即可!!!!!!
3.1 泛型类
public class ArrayList < E > {
}
3.2 泛型方法
使用格式:调用方法时,确定泛型的类型
语法: 修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }
3.3 泛型接口
public interface List<E> extends Collection<E>
在定义一个类实现某个接口时,可以指定当前类的泛型,或者当前这个类的数据类型你也不确定,可以继续使用泛型类去约束
3.4 泛型通配符
当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符 <?> 表示。但是一旦使用
泛型的通配 符后,只能使用Object 类中的共性方法,集合中元素自身方法无法使用。
通配符基本使用:
泛型的通配符 : 不知道使用什么类型来接收的时候 , 此时可以使用 ? ,? 表示未知通配符。
3.5 泛型上下界
上界: 类型名称 <? extends 类 > 对象名称 ,只能接收该类及其子类
下界: 类型名称 <? super 类 > 对象名称 ,只能接收该类及其父类类型
// 泛型的上限:此时的泛型 ? ,必须是 Number 类型或者 Number 类型的子类
public static void getElement1 ( Collection <? extends Number > coll ){}
// 泛型的下限:此时的泛型 ? ,必须是 Number 类型或者 Number 类型的父类
public static void getElement2 ( Collection <? super Number > coll ){}
3.6 4大函数式接口
- Function<T, R> :功能型接口, R apply(T t)
- Consumer<T> :消费型接口, void accept(T t)
- Supplier<T> :供给型接口, T get()
- Predicate<T>:预测型接口, boolean test(T t)
4.ArrayList面试题
4.1 ArrayList是如何扩容的
第一次扩容 10
以后每次都是原容量的 1.5 倍
4.2 ArrayList频繁扩容导致添加性能急剧下降,如何处理?
构造具有指定初始容量的空列表。
4.3 ArrayList是线程安全的吗?
ArrayList不是线程安全的
需要线程安全怎么办?
- 使用Collections.synchronizedList(list)
- Vector
- CopyOnWriteArrayList:写时复制
4.4 如何复制某个ArrayList到另一个ArrayList中去?
- 使用clone()方法
- 使用ArrayList构造方法
- 使用addAll方法
5.作业
打印超市小票,使用集合完成!!!
- Product :pid、pname、price
- OrderItem :itemId、Product、count、money
- Order :oid、List、totalMoney、优惠money、realMone
初始化 3 个 Product ,键盘输入商品编号模拟购物过程,最后打印购物小票!!!
结果: