第17次(数组深化)
学习主题:数组深化
学习目标:
1. 掌握冒泡排序
2. 掌握二分法查找
3. 掌握什么是异常,异常的处理方式
对应视频:
http://www.itbaizhan.cn/course/id/85.html
对应文档:
无
对应作业:
1. 冒泡排序的优化算法
(1) 冒泡排序的基础算法有哪些缺点?
1、 每一趟比较都要比较到数据的最后,没有必要,只要比较无序数列即可
2、 不管是否有序都要进行N-1次循环
如何判断有序:比较一趟,如果没有发生交换,就是有序。定义一个boolean类型的变量flag,默认有序 true,发生交换时,置为false,一趟循环结束后,根据flag的值判断是否有序,有序则退出循环
3、 int temp 每次比较的时候都要给temp分配空间,比较完后释放空间
所有的比较都使用一个temp变量,同一个空间,将temp提取到大循环外
(2) 可以从哪几个方面来对基础算法进行优化?
1、 将数组分成有序和无序两部分,每次只比较无序部分
2、 将temp变量声明到大循环的外面,避免重复分配、释放空间
2. 二分法
(1) 折半查找算法的原理是什么?(前提:数组必须有序,且是升序)
1、折半查找的原理是将排序好的数列分割成两份,然后将要查找的数字与中间位置的数字比较。如果要查找的数字小于中间位置的数字,就可以确定要找的数字在整个数列的前半段,反之在后半段,如果要查找的数字正好与中间位置的数字相等,说明位置已经找到。如此分割数次直到找到或确定不存在为止。
(2) 简述如何进行折半查找?
1、根据有序(升序)数组a[]的长度,声明变量low=0;high=a.length-1;
2、当满足low<high的条件下,计算mid=(low+high)/2,用mid与要查找的值(key)比较,若mid>key,则high=mid-1,若mid<key,则low=mid+1;
3、重复第2步,直到找到key值,并返回key的索引
3. 异常概念_分类
(1) 什么叫异常?
异常就是在程序运行过程中所发生的不正常的事件,它会中断正在运行的程序
(2) 请简述异常的分类?
1、 runtimeException 运行异常:不要求程序必须做出处理
2、 checkedException 检查异常:程序必须处理该异常
4. 异常处理方式之一_捕获异常
(1) 捕获异常所使用的关键字有哪些?
try catch final
(2) try-catch-finally有几种结合形式,每种组合形式的执行顺序是什么?
1、 try—catch组合
正常情况:只执行try中的代码,不会执行catch中的代码
异常情况(异常出现的类型与捕获的类型匹配):先执行try中的代码,当出现异常时,直接跳转到catch中,创建一个异常对象,并打印异常信息。程序继续执行,不会停止。
异常情况(异常出现的类型与捕获的类型不匹配):先执行try中的代码,当出现异常时,尝试创建一个异常对象,但由于类型不匹配无法创建异常对象,所以打印异常信息,程序停止。而不会执行catch中的代码
2、 try-finally组合
finally无论是否产生异常,都执行的代码,但有一种情况finally不执行,即退出Java虚拟机。
3、 try-catch-finally组合
正常情况:执行try - finally
异常情况(类型匹配):执行try - catch - finally
异常情况(类型不匹配):执行try - finally
若catch中存在return语句,则先执行finally中语句,在返回执行return语句
5. 异常处理方式之二_声明异常
(1) 继承关系中如何声明异常?
1、 父类是方法声明了Exception类型的异常,子类在重写方法时,可以声明也可以不声明。但是如果子类重写后的方法使用super关键字调用父类的方法,那么要求必须对异常进行处理
2、 若父类的方法没有异常,那么子类方法如果一定会有Exception或checked异常,要求子类必须自己使用try-catch处理,或者给父类方法加上异常声明
3、 如果子类在重写父类的方法时,产生的异常是runtimeException,那么可以不处理
(2) throw与throws的区别是什么?
1、作用不同:throw用于程序员自行产生并抛出异常;throws用于声明在该方法可能产生的异常类型
2、使用的位置不同:throw位于方法体内部,可以作为单独语句使用;throws必须跟在方法参数列表的后面,不能单独使用。
3、内容不同:throw抛出一个异常对象,且只能是一个;throws后面跟异常类,而且可以有多个。
第18次(异常机制,常用类)
学习主题:面向对象初步
学习目标:
1 掌握简单的异常处理方案,以及自定义异常
2 掌握什么是包装类,以及包装类的用法
3 掌握自动装箱,拆箱
4 掌握StringBuffer,StringBuilder的用法
5 掌握什么String类,Date类的用法
对应视频:
http://www.itbaizhan.cn/course/id/85.html
对应文档:
无
对应作业
1. 常见简单异常的解决办法
(1) 请你列举出五个常见的运行时异常?
1、 算术异常(ArithmeticException)
2、 空指针异常(NullPointException)(没有创建对象(new)而调用了对象的属性和方法)
3、 类型转换异常(ClassCastException)
4、 数组下标越界异常(ArrayIndexOutOfBoundsException)
5、 期望的数据类型与输入的数据类型不匹配(InputMismatchException)
(2) 请你列举出几个常见的检查时异常?
1、 SQL语句异常(SQLExcepion)
2、 输入输出异常(IOException)
3、 分析异常(parseException)
4、 文件不存在异常(FileNotFoundException)
2. 自定义异常
(1) 为什么需要自定义异常?
在程序中,可能会遇到任何标准异常类都没有充分的描述清楚问题,这种情况下可以创建自己的异常类
(2) 自定义异常的步骤是什么?
1、 继承Exception或RuntimeException
2、 定义构造方法
3、 使用异常
3. 包装类的基本用法
(1) 为什么需要包装类?
Java并不是纯面向对象的语言。Java语言是一个面向对象的语言,但是Java中的基本数据类型却不是面向对象的。但是我们在实际使用中经常需要将基本数据类型转换成对象,便于操作。比如:集合的操作。这时,我们就需要将基本数据类型转化成对象
(2) 包装类的继承关系是什么?
4. 自动装箱和拆箱
(1) 请你简述什么叫自动装箱?什么叫自动拆箱?
自动装箱:基本数据类型自动地封装到与它相同的类型的包装类中
自动拆箱:包装类对象自动转换成基本数据类型
(2) 请你简述Integer类中的内部类IntegerCache的作用?
Cache为[-128,127],IntegerCache有一个静态的数组,在类加载时就将-128到127的Integer对象创建过了,并保存到cache数组中,一旦程序调用valueOf方法,如果取值在-128到127之间就直接在cache缓存数组中去取Integer对象,超出范围就new一个新对象
5. String类底层分析_JDK源码分析
(1) String类的底层数据结构是什么?
String类的底层数据结构是char类型的数组(String类的相关方法实际上就是在操作数组)
(2) 为什么String类的值只能被共享不能被更改?
因为String类被finally修饰,所以无法被继承,即父类方法不可以被子类重写。String类的底层数据结构是被finally修饰的char类型的数组
6. StringBuilder,Stringbuffer用法_jdk底层源码分析
(1) StringBuffer与StringBuilder的异同点是什么?
StringBuffer效率低,安全性高。StringBuilder效率高,安全性低。构造方法和方法基本相同。StringBuffer是线程安全的,而StringBuilder是线程不安全的,创建一个内容可变的字符串,应该优先考虑使用StringBuilder
(2) String与StringBuffer的异同点是什么?
String类是不可变类,即一旦一个String对象被创建后,包含在这个对象中的字符序列是不可改变的,直至这个对象销毁。
StringBuffer类则代表一个字符序列可变的字符串,可以通过append、insert、reverse、setChartAt、setLength等方法改变其内容。一旦生成了最终的字符串,调用toString方法将其转变为String
7. 不可变字符序列和可变字符序列的使用陷阱
(1) String为什么称为不可变字符?
执行String=a 就是在栈内存中开辟一个空间,存放变量a,
执行 =“abc” 就是将a指向堆内存中值为abc的地址
执行String a=“def” 就是将a指向堆内存中值为def的地址
即,在栈中a的地址不变,而a的值改变
(2) StringBuffer与StringBuilder为什么称为可变字符?
底层使用 char[] 数组实现。数组的长度可以被重新定义。
对外提供了修改 数组元素内容的方法。
8. java.uitl.Date类
(1) 日期时间相关类有哪些?
(2) java.util.Date类的子类有哪些?位于哪个包中?
有java.sql.Date、java.sql.Time、java.sql.Timestamp
位于java.util包中