final 加在类或者是方法中,子类分别不能继承和重写
重构:是重写的一种特殊方式,子类与父类的成员方法的返回值、方法名称、参数类型及个数完全相同,唯一不同的是方法实现内容,这种特殊重写方式被称为重构。
垃圾回收算法
1.引用计数(被引用一次就计数一次,最后为0的就回收)
缺点:循环引用无用对象,无法识别
2.引用可达法
引用关系制图,跟踪(从上至下去跟踪,看到达不到达的了这个对象)
分代的垃圾回收机制
jvm将堆中的内存划分为 eden suvivor tenured/old空间
1.新的对象放入eden中
2.eden满了以后,不能创建对象,触发垃圾回收机制,将无用对象清理掉,将剩余对象复制放入suvivor中S1,清空eden
(经历垃圾回收算法)
3.eden再次满了,将S1中不能清空的对象存入另一个suvivor中,S2,
4.重复多次(15次)suvivor中没有清理对象,则会复制到old中
5.当old满了,则会触发一个完整的垃圾回收(fullGC)
易造成内存泄露的操作
1.创建大量无用对象(String用for连接字符创建了大量String对象)
2.静态集合类的使用(hashmap,vector.list使用易造成泄露,其生命周期与应用程序一致)
3.连接对象(io流,数据库连接对象,网络连接对象)未关闭
4.监听器(书房对象没有删除相应的监听器)
内部类
//创建内部类的对象
Face f=new Face();
Nose n=f.new Nose();
Face.Nose n=f.new Nose();
String 与StringBuffer(StringBuilder)区别在于前者是不可变字符串,后者可变。
StringBuffer线程不安全,效率高,StringBuilder线程安全,效率低
StringBuffer sb=new StringBuffer();//其中长度预先创建为16,但可以成两倍加2的速度扩展容度
Map
Map中包含HashMap和TreeMap
Collection
Collection中包含Set和List
Set中有HashSet和TreeSet
List中有ArrayList和linkedList
Collection接口不能直接用,但提供添加数据、删除数据、管理数据的办法,故而其中的Set与List可用
List
ArrayList 可实现可变的数组,可保存包括null在内的所有元素,可根据索引位置对集合快速访问,但插入删除速度慢
LinkedList利用链表存储数据,易插入和删除对象,但访问对象速度慢
List<E> list=new ArrayList<>();
List<E> list=new LinkedList<>();
E为存储数据类型
Set
Set中不按照特定的顺序排序,仅是将对象加入集合中,但不包括重复对象
Hashset不保证Set的迭代顺序,特别是不保证该顺序恒久不变,允许用null元素
TreeSet实现的Set集合在遍历时按照自然顺序递增排序
Map
Map中有key和value相对应
HashMap
TreeMap
异常
NullPointerException 空指针异常,之前加上一个判断是否为空
ClassCastException 类型转化异常 instanceof 是不是后者的实例
捕获异常(try,catch,finally)
try 指定一段代码,处理的范围,当其中的任意语句产生异常时就会跳过后面代码,catch对异常处理
finally最终会执行(例如关闭前面打开资源的程序)
catch中填入异常类型(子类异常放上面,不然处理到父类异常时就停止了
public class TestReaderFile{
public static void main(String[] args){
try{
FileReader reader=new FileReader("d:/a.txt");
char c =(char)reader.read();
char c2=(char)reader.read();
System.out.println(""+c+c2);
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(reader!=null){
reader.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}
执行顺序 1.try catch 给返回值赋值 2.执行finally 3.return
throws异常,谁调用这个函数谁处理
子类声明的异常范围不能超过父类声明的范围
1.父类没有声明异常,子类也不行
2.不可抛出原有方法跑出异常类的父类或者上层类
3.跑出的异常类型的树木不可以比原有的方法抛出的还多