学习主题:数组深化
学习目标:
1.掌握冒泡排序
2.掌握二分法查找
3.掌握什么是异常,异常的处理方式
1.冒泡排序的优化算法
(1)冒泡排序的基础算法有哪些缺点?
冒泡排序的基础算法是从第一个数开始到最后一个数之间两两比较,这中间会存在重复还有无意义的比较,所以比较次数过于庞大,浪费资源。
(2)可以从哪几个方面来对基础算法进行优化?
1.整个数列分成两部分:前面是无序数列,后面是有序数列。
2.初始状态下,整个数列都是无序的,有序数列是空。
3.每一趟循环可以让无序数列中最大数排到最后,(也就是说有序数列的元素个数增加1),也就是不用再去顾及有序序列。
4.每一趟循环都从数列的第一个元素开始进行比较,依次比较相邻的两个元素,比较到无序数列的末尾即可(而不是数列的末尾);如果前一个大于后一个,交换。
5.判断每一趟是否发生了数组元素的交换,如果没有发生,则说明此时数组已经有序,无需再进行后续趟数的比较了。此时可以中止比较。
2.二分法
(1)折半查找算法的原理是什么?
二分法检索(binary search)又称折半检索,二分法检索的基本思想是设数组中的元素从小到大有序地存放在数组(array)中,首先将给定值key与数组中间位置上元素的关键码(key)比较,如果相等,则检索成功; 否则,若key小,则在数组前半部分中继续进行二分法检索;若key大,则在数组后半部分中继续进行二分法检索。
(2)简述如何进行折半查找?
定义一组数组的下标,low=0;high=数组名.length-1,还有定义要查找的元素key;当low<high时,定义中间位置mid=(low+high)/2,然后将mid与key进行比较,分三种情况,当这个要查找的元素可以被找到时:当mid>key,则代表要找的这个元素在mid 的左边,然后重新定义high值,high=mid-1;再重新进行查找比较。当mid<key,定义low=mid+1,然后再重新进行查找。直到查到为止,然后输出这个值得下标。如果这个数在数组中不存在,则直接输出-low,就是(-插入点-)。
3.异常概念_分类
(1)什么叫异常?
异常指程序在运行中出现的非正常现象。
(2)请简述异常的分类?
所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception。Java异常类的层次结构如图。
4.异常处理方式之一_捕获异常
(1)捕获异常所使用的关键字有哪些?
try,catch,final
(2)try-catch-finally有几种结合形式,每种组合形式的执行顺序是什么?
1、正常情况:执行try-finally
2、异常情况:类型相匹配,执行try-catch-finally
3、异常情况:类型不相匹配,执行try-finally
如果在catch中存在return语句,则先执行完finally语句在回头执行return语句
5.异常处理方式之二_声明异常
(1)继承关系中如何声明异常?
1、父类的方法声明了Exception类型的异常,子类在重写方法的时候,可以声明也可以不声明。但是如果子类重写后的方法使用super关键字调用父类的方法,那么要求必须对异常进行处理。
2、如果父类的方法没有异常,那么子类的方法如果一定会有Exception或Checked异常,要求子类必须自己使用try-catch处理,或者给父类方法加上异常的声明。
3、如果子类在重写父类的方法时,产生的异常是RuntimeException异常时,那么可以不处理。
(2)throw与throws的区别是什么?
1、throws用于声明方法可能会出现的异常类型
throw 手动抛出异常
2、throws写在方法名后面
throw写在方法里
分享/讲解/扩展思考
点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。
异常机制,常用类
学习主题:面向对象初步
学习目标:
1 掌握简单的异常处理方案,以及自定义异常
2 掌握什么是包装类,以及包装类的用法
3 掌握自动装箱,拆箱
4 掌握StringBuffer,StringBuilder的用法
5 掌握什么String类,Date类的用法
1.常见简单异常的解决办法
(1)请你列举出五个常见的运行时异常?
1、算数异常ArithmeticException
2、空指针异常NullPointException
3、类型转换异常ClassCastException
4、数组下标异常ArrayIndexOutOfBoundsException
5、期望数据类型与实际输入类型不匹配异常InputMismatchException
(2)请你列举出五个常见的检查时异常?
1、SQLException
2、IOException
3、ParseException
(1)向上声明异常类
(2)添加try-catch方法
2.自定义异常
(1)为什么需要自定义异常?
在程序中,可能会遇到任何标准异常类都没有充分的描述清楚问题,这种情况下可以创建自己的异常类。
(2)自定义异常的步骤是什么?
1、继承Exception 或 RuntimeException
2、定义构造方法
3、使用异常
3.包装类的基本用法
(1)为什么需要包装类?
java并不是纯面向对象的语言。java语言是一个面向对象的语言,但是java中的基本数据类型却不是面向对象的。但是我们在实际使用中经常需要将基本数据转化成对象,便于操作。
(2)包装类的继承关系是什么?
4.自动装箱和拆箱
(1)请你简述什么叫自动装箱?什么叫自动拆箱?
自动装箱:基本类型的数据处于需要对象的环境中时,会自动转为“对象”。
自动拆箱: 每当需要一个值时,对象会自动转成基本数据类型,没必要再去显式调用intValue()、doubleValue()等转型方法。
(2)请你简述Integer类中的内部类IntegerCache的作用?
Cache为[-128,127].IntegerCache有一个静态的Integer数组,在类加载时就将-128到127的Integer对象创建了,并保存在cache数组中,一旦程序调用valueOf方法,如果取值在-128到127之间就直接在cache缓存数组中去取Integer对象,超出范围就new一个对象。
5.String类底层分析_JDK源码分析
(1)String类的底层数据结构是什么?
char类型的数组
(2)为什么String类的值只能被共享不能被更改?
1、String 在底层是用一个 private final 修饰的字符数组 value 来存储字符串的。final 修饰符保证了 value 这个引用变量是不可变的,private 修饰符则保证了 value 是类私有的,不能通过对象实例去访问和更改 value 数组里存放的字符。
2、String 类并没有对外暴露可以修改 value[] 数组内容的方法,并且 String 类内部对字符串的操作和改变都是通过新建一个 String 对象去完成的,操作完返回的是新的 String 对象,并没有改变原来对象的 value[] 数组。
3、String 类是用 final 修饰的,保证了 String 类是不能通过子类继承去破坏或更改它的不可变性的。
6.StringBuilder,Stringbuffer用法_jdk底层源码分析
(1)StringBuffer与StringBuilder的异同点是什么?
异:
StringBuilder:效率高,安全性低
StringBuffer:效率低,安全性高
同:
StringBuffer和StringBuilder非常类似,均代表可变的字符序列。 这两个类都是抽象类AbstractStringBuilder的子类,方法几乎一模一样。
(2)String与StringBuffer的异同点是什么?
异:
String代表不可变的Unicode字符序列
StringBuffer代表可变系列
同:
底层数据结构都是char[]类型的数组
7.不可变字符序列和可变字符序列的使用陷阱
(1)String为什么称为不可变字符?
1、String 在底层是用一个 private final 修饰的字符数组 value 来存储字符串的。final 修饰符保证了 value 这个引用变量是不可变的,private 修饰符则保证了 value 是类私有的,不能通过对象实例去访问和更改 value 数组里存放的字符。
2、String 类并没有对外暴露可以修改 value[] 数组内容的方法,并且 String 类内部对字符串的操作和改变都是通过新建一个 String 对象去完成的,操作完返回的是新的 String 对象,并没有改变原来对象的 value[] 数组。
3、String 类是用 final 修饰的,保证了 String 类是不能通过子类继承去破坏或更改它的不可变性的。
(2)StringBuffer与StringBuilder为什么称为可变字符?
底层char[]类型的数组的长度可以被重新定义,对外提供了修改 数组元素内容的方法。
8.java.uitl.Date类
(1)日期时间相关类有哪些?
(2)java.util.Date类的子类有哪些?位于哪个包中?
java.util.Date类的子类有java.sql.Date类,java.sql.Time类,java.sql.Timestamp类。位于java,sql包中。