学习主题:数组深化
对应视频:
http://www.itbaizhan.cn/course/id/85.html
对应作业:
1. 冒泡排序的优化算法
(1) 冒泡排序的基础算法的缺点:
- 1、 每一趟都要比较到数组的最后,没有必要,只要比较到无序数列即可
- 2、 不管是否有序,都要进行n-1趟循环
- 3、 int temp 每次比较的时候都要给stmp分配空间,比较完毕后释放空间
(2) 可以三个方面来对基础算法进行优化:
- 1、 将内层循环比较次数减少,只要碰到有序就停止 。j<n-1-i
- 2、 定义一个boolean类型的变量flag,默认有序true,若发生交换,置为false,一趟循环结束后,根据flag的值判断是否有序,若有序,则退出循环
- 3、 所有的比较都使用一个temp变量,同一个空间,将temp 变量提取到大循环外
2. 二分法
(1) 折半查找算法的原理:
二分法检索(binary search)又称折半检索,二分法检索的基本思想是设数组中的元素从小到大有序地存放在数组(array)中,首先将给定值key与数组中间位置上元素的关键码(key)比较,如果相等,则检索成功;否则,若key小,则在数组前半部分中继续进行二分法检索;若key大,则在数组后半部分中继续进行二分法检索。这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败。
(2) 简述如何进行折半查找
二分法检索是一种效率较高的检索方法。比如,我们要在数组[7, 8, 9, 10, 12, 20, 30, 40, 50, 80, 100]中查询到10元素,过程如下:
![5391ea80cf3bb5e01411b9f31a58e03f.png](https://i-blog.csdnimg.cn/blog_migrate/fbe1d3e389dfc1600bcfc50bd72df2fa.jpeg)
3. 异常概念_分类
(1) 异常:exception (例外),是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序
(2) 异常的分类
![e0d4fc115cf4454f47a642c9affbcf3f.png](https://i-blog.csdnimg.cn/blog_migrate/063ca81687b4427aeec40a287f1304ae.jpeg)
4. 异常处理方式之一_捕获异常
(1) 捕获异常所使用的关键字
try catch finally
(2) try-catch-finally有三种结合形式,每种组合形式的执行顺序
1、 try _ catch 组合
(1) 正常情况
![7b263da64bf862484d00a0e2fe040f6a.png](https://i-blog.csdnimg.cn/blog_migrate/699cc5d9c06f4112c8acd86e2db2188b.jpeg)
(2) 异常情况,异常出现的类型与捕获的类型匹配
![a548f91dc9c81550131930a6dc086c80.png](https://i-blog.csdnimg.cn/blog_migrate/12875e1384304bc6cd886c9ea3f8f8d9.jpeg)
(3) 异常情况,异常出现的类型与捕获的类型不匹配
![6d4c9d763f59245d6e73ae85eac745f7.png](https://i-blog.csdnimg.cn/blog_migrate/4396c1ea2125fe17df180ac6edc339ac.jpeg)
2、try _ finally 组合
finally 是无论是否产生异常,都执行的代码,但是有一种情况finally不执行,即退出Java虚拟机。
3、try _ catch _ finally 组合
(1)正常情况:执行try _ catch
(2)异常情况:类型相匹配,执行try _ catch _ finally
(3)异常情况:类型不相匹配,执行try _ finally
如果在catch中存在return语句,则先执行完finally语句再回头执行return语句
![c9f5b5d7b6f4df69d5606c0efe51930e.png](https://i-blog.csdnimg.cn/blog_migrate/ef44a9caa907a97583afede95ea21ad1.jpeg)
5. 异常处理方式之二_声明异常
(1) 继承关系中的声明异常:
- 1) 父类的方法声明了 Exception 类型的异常,子类在重写方法时可以声明也可以不声明。但是如果子类重写后的方法使用 super 关键字调用父类的方法,那么要求必须对异常进行处理。处理方式为给父类声明异常或子类使用try_catch处理
- 2) 如果父类的方法没有异常,那么子类的方法如果一定会有 Exception 或 Checked 异常,要求子类必须自己使用 try-catch 处理,或者给父类方法加上异常的声明
- 3) 如果子类在重写父类的方法时,产生的异常是RuntimeException 异常时,那么可以不用处理
(2) throw与throws的区别
1) throws 用于声明方法可能会产生的 异常类型
throw 手动抛出 异常对象
2) throws 写在方法名称后面
throw 用于写在方法里
学习主题:面向对象初步
对应视频:
http://www.itbaizhan.cn/course/id/85.html
对应作业:
1. 常见简单异常的解决办法
(1) 请列举出五个常见的运行时异常
- 1、 算术异常 ArithmeticException
- 2、 空指针异常 NullthmeticException
- 3、 类型转换异常 ClasscastException
- 4、 数组下标越界 ArrayIndexOutOfBoundsException
- 5、 期望的数据类型与实际输入类型不匹配 InputMismatchException
(2) 请你列举出常见的检查时异常
- 1、 SQLException
- 2、 IOException
- 3、 ParseException
检查时异常要求必须做处理:1、throws向上声明
2、try_catch_finally处理
2. 自定义异常
(1) 为什么需要自定义异常
在程序中,可能会遇到任何标准异常类都没有充分的描述清除问题,这种情况下可以创建自己的异常类
(2) 自定义异常的步骤
- 1、 继承Exception或RuntimeException
- 2、 定义构造方法
- 3、 使用异常
3. 包装类的基本用法
(1) 为什么需要包装类
Java并不是纯面向对象的语言。Java语言是一个面向对象的语言,但是Java中的基本数据类型确实不面向对象的。但是我们在实际使用中经常需要将基本数据类型转化为对象,便于操作。比如:集合的操作中。这时,我们就需要将基本数据类型转化为对象。
(2) 包装类的继承关系
![c364d5797a994c01d54e51c38a807737.png](https://i-blog.csdnimg.cn/blog_migrate/3c3a60019a918b06e2ff0a1d95b85680.jpeg)
4. 自动装箱和拆箱
(1) 自动装箱(auto-boxing):基本类型自动地封装到与它相同的类型的包装类中
自动拆箱(unboxing):包装类对象自动转换为基本数据类型
(2) Integer类中的内部类IntegerCache的作用
Integer 中的缓存类 IntegerCache: Cache 为[-128,127],IntegerCache 有一个静态的 Integer 数组,在类加载时就将-128 到 127 的 Integer 对象创建了,并保存在cache 数组中,一旦程序调用 valueOf 方法,如果取的值是在-128 到 127之间就直接在 cache 缓存数组中去取Integer 对象,超出范围就 new 一个对象。
5. String类底层分析_JDK源码分析
(1) String类的底层数据结构
String 的底层数据结构是 char 类型的数组
String 的相应方法的实现实际上就是对数组的一个操作
(2) 为什么String类的值只能被共享不能被更改
String 类对象代表不可变的Unicode字符序列,因此我们可以将String对象称为“不可变对象”。指的是对象内部的成员变量的值无法再改变。打开String类的源码:
![78bde33e06d1b80a89553f5de33ba251.png](https://i-blog.csdnimg.cn/blog_migrate/c67d6cf6d1c4bf44a418d3391de387bf.jpeg)
我们发现字符串内容全部存储到value[]数组中,而变量value是final类型的,也就是常量(即只能被赋值一次)。 这就是“不可变对象”的典型定义方式。
6. StringBuilder,Stringbuffer用法_jdk底层源码分析
(1) StringBuffer与StringBuilder的异同点
StringBuilder:效率高,安全性低
StringBuffer:效率低,安全性高
(2) String与StringBuffer的异同点
String:不可变字符序列。
StringBuffer:可变字符序列。
7. 不可变字符序列和可变字符序列的使用陷阱
(1) String为什么称为不可变字符
String一经初始化后,就不会再改变其内容了。对String字符串的操作实际上是对其副本(原始拷贝)的操作,原来的字符串一点都没有改变。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的时间和空间性能,甚至会造成服务器的崩溃。
(2) StringBuffer与StringBuilder为什么称为可变字符
StringBuffer类和StringBuffer类是对原字符串本身操作的,可以对字符串进行修改而不产生副本拷贝或者产生少量的副本。因此可以在循环中使用。
8. java.uitl.Date类
(1) 日期时间相关类
![159c80069dbe254a795882f6bb9a393c.png](https://i-blog.csdnimg.cn/blog_migrate/3d86391a3f0ef5d0b08f9d863aba9ebf.jpeg)
(2)Java.util.Date类的子类有:
- java.sql.Date
- java.sql.Tme
- java.sql.Timestamp
位于java.util 包中
![fb280772f882ee91640ab08d9a0f69c8.png](https://i-blog.csdnimg.cn/blog_migrate/7b1fac3f224e7d8115d8a48a95301572.jpeg)