任务一
常用的包
- java.lang 核心包 由JVM自动导入
- System类
- String类
- java.util包 工具包
- Scanner类
- Random类
- List类
- java.io 输入输出包
- FileInputStream类
- FileOutputStream类
- java.net 网络包
- ServerSocket类
- Socket类
- java.sql 数据包
- DriverManager类
- Connection接口
常用方法
- Object类 对象 万物皆对象
- 如果没有extends关键字声明其父类,默认父类为java.lang.Object类
- Object() 无参构造方法
- super()调用父类的无参方法
- boolean equals(Object) 对象.调用
- 调用对象和参数对象 是否相等
- equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是== 的判断。
- 重写实现比较内容
- 非空对象 null会引起空指针异常
- 非空和空比 false
- hashCode 总协议 返回对象的哈希码值 内存地址的编号
- 若调用equals相等 则hashCode结果相等,反之不等
- 想保持一致性 要重写
- toString 返回对象的字符串表示形式
- 格式:包名.类名@哈希码值的十六进制
- 返回相关特征,或者更加有意义的数据,需要重写方法
- 使用print println打印 引用或字符串拼接是自动调用该方法
- getclass 反射机制 返回 this 的运行时类Object。
包装类
-
将基本数据类型的变量,通过打包封装变成对象,而负责声明为成员变量进行对象化处理的相关类,就是包装类。
-
已经有包装类
-
java.lang.Integer int的一个包装类
- 提供int到Integer之间的转换
- String到Integer之间的转换
- 自动装箱和拆箱技术 通过赋值运算符
- Integer it5 = 100;装箱
- int ib = it5;拆箱
- 自动装箱池 128~127
- java.lang.Double double的一个包装类
- java.lang.Boolean Boolean的一个包装类
- java.lang.Character char的一个包装类
- 拆箱 value
- 装箱valueOf
Math类
- BigDecimal 精准计算
- BigInteger 超过long长度的数据处理
总结
![[模块三任务一总结.jpg]]
任务二
String
-
“123” 字面值 直接量
-
常量池
- 字符串放到常量池中 提升性能
- 常用构造方法
- String()
- 常量优化机制
- 常用成员方法
![[常用成员方法.jpg]]
![[常用成员方法2.jpg]]
-
String类方法的使用
-
正则表达式 格式验证
![[正则表达式.jpg]]
相关方法
boolean matches(String regex)规则
- 开头是^(异或运算符),结尾是$
- 格式验证 无法验证内容
- 表示\ 要增加一个 \
总结
![[模块二任务二总结.jpg]]
任务三
可变字符串类 (重点)
- StringBulider
- StringBuilder线程不安全,性能略高。
构造方法
- 无参 初始容量16
- capacity 根据指定容量来构造对象 容量为参数指定大小
- String 根据指定字符串来构造对象 容量16 + 字符串长度
成员方法
- capacity 总量
- length 实际量
- insert 指定位置前插入
- append 追加
底层采用Byte数组来存放字符内容
笔试考点
对象本身可以修改为什么成员方法还有返回值
连续调用StringBuilder 转String
toString
反之 直接String StringBuffer StringBuilder 效率依次提高
- StringBuffer
- StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。 一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。
- StringBuffer是线程安全的
StringBuffer是如何实现线程安全的呢?
StringBuffer类中实现的方法:
![[Pasted image 20210808072054.png]]
StringBuilder类中实现的方法:
![[Pasted image 20210808072107.png]]
StringBuffer类中的方法都添加了synchronized关键字,也就是给这个方法添加了一个锁,用来保证线程安全。
java 8 之前的相关类 (熟悉)
- System类
- long.currentTimeMillis当前时间与1970年1月1日毫秒时间
- java.util.Date
- 年减1970 月减1
-
Calendar类 全球化
-
多态
![[多态.jpg]]
![[多态2.jpg]]
Java 8 增加的日期相关类(熟悉)
- java8日期
Java 8通过发布新的DateTime APl来进一步加强对日期与时间的处理。
java.time包∶该包日期/时间API的基础包。
- LocalDate 年月日
- LocalTime当前时间
- LocalDateTime日期时间
java.time.chrono包∶该包提供对不同日历系统的访问。
java.time.format包:该包能够格式化和解析日期时间对象。
java.time.temporal包∶该包包含底层框架和扩展特性。
java.time.zone包:该包支持不同时区以及相关规则的类。
- LocalDateTime
默认时区
-
Instant
-
DateTimeFormatter 格式调整
总结
![[模块三任务三总结.jpg]]
任务四
Queue集合
- 先进先出
- Linklist
集合由来
-
当需要在Java程序中记录单个数据内容时,则声明一个变量。
-
当需要在Java程序中记录多个类型相同的数据内容时,声明一个一维数组。
-
当需要在Java程序中记录多个类型不同的数据内容时,则创建一个对象。
-
当需要在Java程序中记录多个类型相同的对象数据时,创建一个对象数组。
-
当需要在Java程序中记录多个类型不同的对象数据时,则准备一个集合。
-
框架结构
![[框架结构.jpg]]
Collection(收藏、容器)集合
-
ctrl查源码
-
常用方法(熟练)
-
接口不可实例化,不能创建对象,用多态
-
contains判定是否包含(单个)containsAll(多个)
-
工作原理:拿着参数对象和集合中元素进行对比用equals
-
equals:
判断地址
判断内容 -
Integer和String已经重写equals
-
-
retainAll交集
- 集合发生变化为True反之false
-
remove 删除
-
void clear(); 清空集合
-
int size(); 返回包含对象的个数
-
boolean isEmpty(); 判断是否为空
-
boolean equals(Object o) 判断是否相等
-
int hashCode() 获取当前集合的哈希码值
-
Object[] toArray() 将集合转换为数组
Iterator iterator() 获取当前集合的迭代器 Collection继承Iterator
Iterator常用方法 迭代器
- 遍历方法
- toString
- Iterator
- boolean hasNext() 判断集合中是否有可以迭代/访问的元素
- E next() 用于取出一个元素并指向下一个元素
- void remove() 用于删除访问到的最后一个元素
For each 迭代器简化版
- for each 的语句格式:
- for(元素类型t 元素变量x : 遍历对象obj){
引用了x的java语句;
}
List接口
- 基本概念
- ArraysList 动态 支持下标访问增删不方便 线性安全 取代Vector
*** ArraysList类** 当调用add方法添加元素时会给数组申请长度为10的一维数组,扩容原理是:原始长度的1.5- LinkedList 双向链表 访问不方便 增删方便
- Stack 动态 后进先出 叫做栈
- Vector 动态 线性安全 过时 官方未过时
- 元素可重复,有先后顺序
- 常用方法
- void add(int index, E element) 向集合中指定位置添加元素
- boolean addAll(int index, Collection extends E> c) 向集合中添加所有元素
- E get(int index) 从集合中获取指定位置元素
- int indexOf(Object o) 查找参数指定的对象
- int lastIndexOf(Object o) 反向查找参数指定的对象
- E set(int index, E element) 修改指定位置的元素
- E remove(int index) 删除指定位置的元素
- List subList(int fromIndex, int toIndex) 用于获取子List
总结
![[模块三任务四总结.jpg]]
任务五
泛型机制(熟悉)
- 基本概念
集合名称的右侧 <该集合可以存放的类型>
编译有效,运行不区分
菱形特性
前后的类型相同 用<>代替 后面数据类型省略集合中支持的数据类型不同,不可以直接赋值
- 底层原理
- E形式参数,负责占位。实际参数给形式参数初始化。
- 本质:参数化类型,直接传递数据类型,E形式参数,负责站位
- 自定义泛型接口 添加<>
- 可以有多个数据类型,<E,T,…>
- 与普通接口区别:接口后面加上类型参数列表
- 泛型类
- 与普通类区别:接口后面加上类型参数列表
- 父类有泛型,子类可以选择保留也可以选择指定泛型,还可以增加泛型
- 泛型方法
- 输入的参数是泛型参数,不是具体参数。
- 对象.调用,实现初始化。
- 只有在new对象时才能确定类型。
![[Pasted image 20210805105811.png]]
- 泛型在继承上的使用
- String是Object的子类,但是List< String>并不是List< Object>的子类。
- 通配符的使用
- < ?>无限制通配符,传入任意类型参数,不能放对象,不可添加元素。
- < ? extends E> 表示类型的上界是E,只能是E或者E的子类。
- < ? super E>表示下界是E,只能用E或者E的父类。
Set集合(熟悉)
- 基本概念
- 与List集合平级
- 特点:没有先后放入次序,且不允许重复,用于查重
- 主要实现类:HashSet、TreeSet、LinkedHashSet。哈希表、红黑树
- HashSet 哈希表管理
- TreeSet 红黑树管理
- LinkedHashSet 内部维护一个双向链表,链表中记录元素插入集合的先后顺序,后期便于迭代。
- 哈希表
元素为一个单项链表的一维数组
![[Pasted image 20210805144946.png]]- 红黑树
![[Pasted image 20210805145137.png]]
- 常用方法
- 参考Collection集合方法
- HashSet集合放入元素的过程及原理
![[Pasted image 20210805155917.png]]
- 思考:为什么重写equals方法后,要重写hashCode?
答案:通过equals方法来确认元素是否相等,重写hashCode方法保证这两个元素得到的哈希码值相同, 从而得到相同的索引位置,此时只需要比较该索引位置元素是否相同即可,从而提升效率避免重复元素出现。
- TreeSet集合的概念
二叉树
![[Pasted image 20210805160945.png]]有序二叉树
左小于根小于右
![[Pasted image 20210805160954.png]]红黑树
TreeSet底层采用红黑树,新元素与老元素比较,确认合理位置。比较方法:
自然排序:实现java.lang,Comparable接口。
比较器比较:实现java.utilComparator接口。区别:自然排序单一,比较器多元,优先比较器。
- Lambda表达式
- 从Java8开始支持Lambda表达式:(参数列表)-> {方法体}
Map集合(重点)
- 基本概念
- 存取元素的基本单位是:单对元素,类型参数如下:
K - 此映射所维护的键(Key)的类型,相当于目录。
V- 映射值(Value)的类型,相当于内容。- Key不可重复,K、V一一对应。
- 主要实现类:HashMap类,TreeMap类,LinkedHashMap类,LinkedHashMap类,Hashtable类,Properties类。
- HashMap:哈希表
- TreeMap:红黑树
- LinkedHashMap:双向链表
- Hashtable:线程安全,K、V不能为null
- Properties:Hashtable子类,处理属性文件,K、V不能为null
- Map集合是面向查询优化的数据结构,在大数据量情况下有着优良查询性能。
- 通常用于K检索V的业务场景
- Set和Map的区别
![[Pasted image 20210805182005.png]]
- 相关常量
- DEFAULT_INITIAL_CAPACITY : HashMap的默认容量是16。
- DEFAULT_LOAD_FACTOR:.HashMap的默认加载因子是0.75。
- threshold :扩容的临界值,该数值为︰容量*填充因子,也就是12。
- TREEIEY_THRESHOLD:若Bucket中链表长度大于该默认值则转化为红黑树存储,该数值是8。
- MIN_TREEIEY_CAPACITY:桶中的Node被树化时最小的hash表容量,该数值是64。
-
常用方法
-
![[Pasted image 20210805190010.png]]
-
遍历方法
![[Pasted image 20210805214054.png]]
Collections类(熟悉)
- ![[Pasted image 20210806064753.png]]
- 容量大小 要撑开内存
![[Pasted image 20210806065436.png]]
总结
![[Pasted image 20210806070719.png]]
任务六作业
作业1
题目
1.分析以下需求,并用代码实现:
(1)模拟Arrays.toString(int[] arr);方法,自己封装一个public static String toString(int[] arr);
(2)如果int类型数组arr为null,toString方法返回字符串"null"
(3)如果int类型数组arr长度为0,toString方法返回字符串"[]"
(4)如果int类型数组arr的内容为{1,2,3,4,5},toString方法返回字符串"[1, 2, 3, 4, 5]"code
![[Question1.java]]
![[StringTest.java]]videos
![[1自己封装toString.mp4]]
作业2
题目
分析以下需求,并用代码实现:
(1)定义一个Worker类型(属性私有、空参有参构造、set、get方法、toString方法、equals方法、hashCode方法),包含三个属性:姓名(String name)、年龄(int age)、工资(double salary),在Worker类中定义work方法打印一句话,如:“凤姐 正在工作”,其中"凤姐"代表当前对象的姓名
(2)定义List集合,在List集合中增加三个员工,基本信息如下:
“凤姐” 18 20000
“欧阳峰” 60 8000
“刘德华” 40 30000
(3)在"欧阳峰"之前插入一个员工,信息为:姓名:“张柏芝”,年龄:35,工资3300
(4)删除"刘德华"的信息
(5)利用for 循环遍历,打印List 中所有员工的信息
(6)利用迭代遍历,对List 中所有的员工调用work 方法
(7)为Worker类重写equals 方法,当姓名、年龄、工资全部相等时候才返回truecode
![[ListTest.java]]
![[Worker.java]]videos
![[2Worker.mp4]]
作业3
题目
分析以下需求,并用代码实现:
(1)定义一个学生类Student,包含属性:姓名(String name)、年龄(int age)
(2)定义Map集合,用Student对象作为key,用字符串(此表示表示学生的住址)作为value
(3)利用四种方式遍历Map集合中的内容,格式:key:valuecode
![[Student.java]]
![[StudentTest.java]]videos
![[3Map集合.mp4]]