Java基础—Day16——集合1

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之方法概览

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

方法整体概览:

2.2 泛型集合

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

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

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

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

2.3 Iterator

使用迭代器的目的就是获取元素!!不要在这里面用集合的方法进行修改了!!!!会用即 可!!!!
 
1. 基本使用,常用的两个方法:
  1. hasNext() :判断是否有下一个元素
  2. 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 的遍历方式:
  1. 经典for循环
  2. 增强for循环
  3. 迭代器
  4. 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大函数式接口

  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)

 

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 pidpnameprice
  • OrderItem itemIdProductcountmoney
  • Order oidListtotalMoney、优惠moneyrealMone
初始化 3 Product ,键盘输入商品编号模拟购物过程,最后打印购物小票!!!
 
 
 
 
 

结果:

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值