Java基础—Day16

目标:

  1. 掌握集合体系
  2. 常用的集合必须熟练使用
  3. 对于常用的面试题要游刃有余,只要点到为止,大致知道一些源码知识

1. 集合概述

1.1 为什么学集合

提高开发效率,简化开发!!!!!!

对比数组:优缺点&特点

  1. 长度固定,一旦定义,不能修改     所以让它自动去扩容---》ArrayList,本质上是一个数组
  2. 能放任意类型的数据
  3. 根据下标查询某个元素,快
  4. 但是对于插入和删除,慢!对于这个操作,我们需要挪位,同时需要拿一个新数组去装新数据---》链表结构
  5.   我们之前存放的数据:一维数组存放的是 单列数据 ;针对 双列数据 ,比如我们常见的书的目录 ---》详情页;电话号码 --- 》 张三,怎么存?假定你用数组【多维】,应该也很麻烦, Map( Key 、 Value )

1.2 集合是什么


数组是一个容器,集合也是一个容器!!!就是放数据的,可以放任意类型的数据!!!


 


1.3 集合的体系

2. 使用层面

2.1 Collection之方法概览

掌握这个接口中有哪些公共的方法

方法整体概览:

java 小票打印序号自增_数据

2.2 泛型集合

 我们在遍历集合的时候,若该集合中存放的是多种数据类型,若只想获取某一种,需要强转;若不强转,则 会抛出运行时异常:类型转换异常 

  1. 期望能否不需要强转,将运行时异常,提前到编译时 
  2. 限定这个集合中只能存放学生,若放别的,编译不通过!!!! 

----》 使用泛型约束,泛型集合,即约束当前集合中,只能存放的数据类型 
好处: 

  1. 限定类型,将运行时异常,提前到编译器 ----》屎黄色也没了 
  2. 不需要进行类型转换

2.3 Iterator

使用迭代器的目的就是获取元素!!不要在这里面用集合的方法进行修改了!!!!会用即 可!!!!

 


1. 基本使用,常用的两个方法:



  1. hasNext() :判断是否有下一个元素
  2. next() :获取当前迭代器中的每个元素值

2. 使用 Iterator 的注意事项,在使用集合的方法进行修改操作【修改、删除】,可能出现如下异常: ConcurrentModificationException



 



注意:在使用迭代器的时候,尽量不要使用集合的方法,进行修改操作!!!!你要移除元素的话,用 迭代器中的remove()



 




java 小票打印序号自增_java 小票打印序号自增_02


 


3. 大致原理:做一个大致了解


 


有一个指针一样的东西,在指向你要取到哪一个元素。在 hasNext() 方法中,有元素的条件如下:


 


java 小票打印序号自增_迭代器_03


 next() 的逻辑

2.4 ArrayList  重点*****

2.4.1 基本使用

部分如下:

java 小票打印序号自增_数据_04

java 小票打印序号自增_迭代器_05


需要掌握的特有方法:


 


add(int index,Object obj)


 


get(int index)


 


sort(Comparator c) :这个Comparator是一个函数式接口,可以直接使用lambda


java 小票打印序号自增_迭代器_06


 


java 小票打印序号自增_java 小票打印序号自增_07


 


ArrayList 的遍历方式:


  1. 经典for循环
  2. 增强for循环
  3. 迭代器
  4. foreach

注意:经典for的速度快于迭代器

java 小票打印序号自增_java 小票打印序号自增_08

2.4.2 源码部分

构造方法:提供了3个构造方法

java 小票打印序号自增_数据_09

3.泛型

目标:知道泛型是啥,见到认识即可!!!!!!

3.1 泛型类


public class ArrayList < E > {


 


}


 


3.2 泛型方法

使用格式:调用方法时,确定泛型的类型


语法: 修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }


 



java 小票打印序号自增_泛型_10


 


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大函数式接口

  1. Function<T, R> :功能型接口, R apply(T t)
  2. Consumer<T> :消费型接口, void accept(T t)
  3. Supplier<T> :供给型接口, T get()
  4. Predicate<T>:预测型接口, boolean test(T t)

java 小票打印序号自增_java 小票打印序号自增_11

java 小票打印序号自增_迭代器_12

java 小票打印序号自增_java 小票打印序号自增_13

java 小票打印序号自增_泛型_14

 


4.ArrayList面试题

4.1 ArrayList是如何扩容的


第一次扩容 10


以后每次都是原容量的 1.5 倍


 


4.2 ArrayList频繁扩容导致添加性能急剧下降,如何处理?


构造具有指定初始容量的空列表。


 


4.3 ArrayList是线程安全的吗?

ArrayList不是线程安全的

需要线程安全怎么办?

  1. 使用Collections.synchronizedList(list)
  2. Vector
  3. CopyOnWriteArrayList:写时复制

4.4 如何复制某个ArrayList到另一个ArrayList中去?

  1. 使用clone()方法
  2. 使用ArrayList构造方法
  3. 使用addAll方法

5.作业


打印超市小票,使用集合完成!!!


  • Product :pid、pname、price
  • OrderItem :itemId、Product、count、money
  • Order :oid、List、totalMoney、优惠money、realMone

初始化 3 个 Product ,键盘输入商品编号模拟购物过程,最后打印购物小票!!!


 



java 小票打印序号自增_数据_15


 



java 小票打印序号自增_泛型_16


 



java 小票打印序号自增_迭代器_17


 



java 小票打印序号自增_泛型_18


 


结果:

java 小票打印序号自增_数据_19