复习总结
ArrayList:查询速度快,效率高,但是插入和删除效率低
LinkedList:查询速度慢,效率低,但是插入和删除效率高
1,递归计算文件夹中所有文件的大小
什么是递归
public void a(){
a();
}
1)如果在递归的过程中,方法没有结束条件,一直循环,会导致方法栈溢出
Exception in thread "main" java.lang.StackOverflowError
抛出异常以后,程序继续执行
面向对象(类和对象,继承,重载,重写,接口,抽象类)
Java面向对象的三大特征:
封装、继承、多态
封装和继承几乎都是为多态而准备的
一、 封装
首先,属性能够描述事物的特征,方法能够描述事物的动作。封装就是把同一类事物的共性(包括属性和方法)归到同一类中,方便使用。
- 封装:封装也称信息隐藏,是指利用抽象数据类型把数据和基于数据的操作封装起来,使其成为一个不可分割的整体,数据隐藏在抽象数据内部,尽可能的隐藏数据细节,只保留一些接口使其与外界发生联系。也就是说用户无需知道内部的数据和方法的具体实现细节,只需根据留在外部的接口进行操作就行。
- 封装的好处:
1) 实现了专业的分工
2) 良好的封装能够减少耦合
3) 类内部的结构能够自有修改
4) 可以对成员进行更精确的控制
5) 隐藏信息,实现细节
- 封装的步骤
1) 修改属性的可见性来限制对属性的访问
2) 为每个属性创建一队赋值和取值方法,用于对这些属性的访问
3) 在赋值和取值方法中,加入对属性的存取限制
二、 继承
- 1. Java继承
Java继承是面向对象的最显著的一个特征。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。JAVA不支持多继承,单继承使JAVA的继承关系很简单,一个类只能有一个父类,易于管理程序,父类是子类的一般化,子类是父类的特化(具体化)
继承所表达的就是一种对象类之间的相交关系,它使得某类对象可以继承另外一类对象的数据成员和成员方法。若类B继承类A,则属于B的对象便具有类A的全部或部分性质(数据属性)和功能(操作),我们称被继承的类A为基类、父类或超类,而称继承类B为A的派生类或子类。
继承避免了对一般类和特殊类之间共同特征进行的重复描述。同时,通过继承可以清晰地表达每一项共同特征所适应的概念范围——在一般类中定义的属性和操作适应于这个类本身以及它以下的每一层特殊类的全部对象。运用继承原则使得系统模型比较简练也比较清晰。
- 2. Java继承的特征
1) 继承关系是传递的。若类C继承类B,类B继承类A(多继承),则类C既有从类B那里继承下来的属性与方法,也有从类A那里继承下来的属性与方法,还可以有自己新定义的属性和方法。继承来的属性和方法尽管是隐式的,但仍是类C的属性和方法。
2) 继承提供了软件复用功能。若类B继承类A,那么建立类B时只需要再描述与基类(类A)不同的少量特征(数据成员和成员方法)即可。这种做法能减小代码和数据的冗余度,大大增加程序的重用性。
3) 继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。
三、 多态
方法的重写、重载与动态连接构成多态性;
Java之所以引入多态的概念,原因之一是它在类的继承问题上和C++不同,后者允许多继承,这确实给其带来的非常强大的功能,但是复杂的继承关系也给C++开发者带来了更大的麻烦,为了规避风险,Java只允许单继承,派生类与基类间有IS-A的关系(即“猫”is a “动物”)。这样做虽然保证了继承关系的简单明了,但是势必在功能上有很大的限制,所以,Java引入了多态性的概念以弥补这点的不足,此外,抽象类和接口也是解决单继承规定限制的重要手段。同时,多态也是面向对象编程的精髓所在。
常用类,集合框架
Map接口
Map接口在Collection的基础上,为其中的每个对象指定了一个key,并使用Entry保存每个key-value对,以实现通过key快速定位到对象(value)。Map接口的主要方法包括:
- size() - 集合内的对象数量
- put(K,V)/putAll(Map) - 向Map内添加单个/批量对象
- get(K) - 返回Key对应的对象
- remove(K) - 删除Key对应的对象
- keySet() - 返回包含Map中所有key的Set
- values() - 返回包含Map中所有value的Collection
- entrySet() - 返回包含Map中所有key-value对的EntrySet
- containsKey(K)/containsValue(V) - 判断Map中是否存在指定key/value
等
List接口继承自Collection,用于定义以列表形式存储的集合,List接口为集合中的每个对象分配了一个索引(index),标记该对象在List中的位置,并可以通过index定位到指定位置的对象。
List在Collection基础上增加的主要方法包括:
- get(int) - 返回指定index位置上的对象
- add(E)/add(int, E) - 在List末尾/指定index位置上插入一个对象
- set(int, E) - 替换置于List指定index位置上的对象
- indexOf(Object) - 返回指定对象在List中的index位置
- subList(int,int) - 返回指定起始index到终止index的子List对象
等
ArrayList
ArrayList基于数组来实现集合的功能,其内部维护了一个可变长的对象数组,集合内所有对象存储于这个数组中,并实现该数组长度的动态伸缩
ArrayList使用数组拷贝来实现指定位置的插入和删除:
插入:
删除:
LinkedList
LinkedList
LinkedList基于链表来实现集合的功能,其实现了静态类Node,集合中的每个对象都由一个Node保存,每个Node都拥有到自己的前一个和后一个Node的引用
LinkedList追加元素的过程示例:
ArrayList vs LinkedList
ArrayList的随机访问更高,基于数组实现的ArrayList可直接定位到目标对象,而LinkedList需要从头Node或尾Node开始向后/向前遍历若干次才能定位到目标对象
LinkedList在头/尾节点执行插入/删除操作的效率比ArrayList要高
由于ArrayList每次扩容的容量是当前的1.5倍,所以LinkedList所占的内存空间要更小一些
二者的遍历效率接近,但需要注意,遍历LinkedList时应用iterator方式,不要用get(int)方式,否则效率会很低
IO,异常
java中的异常
1)Throwable是所有错误和异常超类(Error,Exception)
2)Error是程序中出现的严重问题,栈溢出,内存溢出,系统崩溃
Exception:
运行时异常:不需要try...
NullPointerException,
ArrayIndexOutOfBoundsException,
运行时异常发生以后,程序会立马中止
强制检测异常(Checked):需要try
IOException
FileNotFoundException
SQLException