1、接口和抽象类的区别
接口和抽象类都是为多态而生的,都不能实例化,都包含抽象方法;不同点是,接口中全是抽象方法,抽象类中则可以有正常的方法(供子类继承使用);接口成员变量默认是static final类型的,抽象类则默认是default类型的;接口需要实现,抽象类需要继承;
附:抽象方法都是只有方法名,没有实体,不用花括号,不能用final修饰(final修饰表示不能被覆盖),它只表示是一种定义;
2、有一些接口只有定义,内部没有函数,称为标识接口,例如Cloneable,Serializable;
3、重写clone方法
第一要继承Cloneable接口,第二要覆盖clone方法;
4、自定义类加载器
1)继承ClassLoader类;2)重写findclass方法;
5、四种内部类
把内部类看成类的成员变量就可以。1)静态内部类;2)成员内部类;3)局部内部类;4)匿名内部类;
6、获取Class对象的三种方法
1)对象.getClass();2)显式声明,如Class c = Java.class;3)用Class.forName方法,如Class c = Class.forName("Java");
7、Object类有九个方法
1)和多线程有关的wait(),notify(),notifyAll();2)和容器有关的equals(),hashcode();3)和序列化有关的toString(),clone();4)和反射有关的getClass();5)和内存回收有关的finalize();
8、断言assert用法
assert是java中用于调试的,有两种用法。1)assert exp1;2)assert exp1:exp2;assert断言的exp1是有个逻辑表达式,如果为false则说明程序已经不正常,需要修改,所以会抛出一个assertionerror退出程序,exp2是用来构造asserterror的参数;
运行assert断言:java -ea Test;
9、枚举类
Enum中的成员变量默认都是static final的,可以与switch共用,因为Enum中的成员变量对应序号都是数字。
Enum的常用方法:ordinal(),compareTo(),values(),valuesOf();(此处不太熟悉,有待进一步学习)
10、构造不可变类
1)不可被继承,所以要声明成final的;(此点不是必要的)2)成员变量不可变,所以要声明成private final的;3)方法不可被重写,所以要声明成final的;4)引用的其他类的变量要用clone解耦;
11、左移右移位运算
首先取模再计算,取模的基取决于数据类型,与平台无关。
12、异常
异常包括两种:Error和Exception,它们都继承于Throwable。Error是需要修正的。Exception有两种,检查异常和运行时异常,检查异常需要用try-catch捕获,例如IOException,SQLException,运行时异常可以由JVM捕获,如空指针,算术异常,类型转换异常。
13、序列化
一个类实现Serialiable接口就可以被序列化,序列化的方法是,首先构造一个输出流对象,指定文件输出的文件名,然后用该输出流对象构造一个对象流对象,最后调用对象流对象的writeobject方法,把需要序列化的对象作为参数传给该方法。
14、Collections类的功能
提供一些容器类操作,如排序,构造线程安全的容器。
15、synchronized的两种用法
1)定义在方法声明的前面,在执行方法的时候获取对象锁;
2)显示锁定某一个对象,如synchronized(obj){obj.function()}
16、Lock的四种用法
用Lock的时候,需要在类中显式的声明一个Lock对象,然后才能用。Lock有四种获取锁的方式,分别为lock(),tryLock(),tryLock(等待时间),lockInterrupedly,第一种的用法类似于synchronized,如果没有获得锁会阻塞;第二种尝试一次,如果没有获得锁就放弃;后两种分别对应了定时锁和中断锁。
Lock和synchronized对应不同的上锁机制,所以最好不要一起使用。(分别对应了什么机制)
17、守护线程
Thread.setDemon(true),JVM的gc就是一种守护线程
18、join方法
在当前线程中执行thread.join(),会阻塞当前线程直到thread执行完。
附:java显式通知操作系统执行线程调度的方式:sleep方法,yield方法, join方法,wait方法。不同的操作系统对线程的支持不同,所以线程不是跨平台的。如UNIX系列的操作系统中是没有线程的概念的,所以JVM在底层用不同的进程代替了线程;而windows系统线程与JVM就很类似。另外设置线程优先级的方法也不是跨平台的,因为不同的操作系统对优先级的划分并不一致。
19、java的并发包
1)Executors
Executors是用来管理线程池的工具类,可以用它的newCachedThreadPool, newFixedThreadPool, newSingleThreadPool创建线程池,创建的结果是一个ExecutorService,调用其execute,submit,shutdown方法运行或终止线程。
线程池底层的实现原理
Executors创建线程池的时候,实际上是在底层创建了ThreadPoolExecutor对象,这个类的构造函数有以下几个参数:最小线程数量,缓冲队列,最大线程数量,线程空闲存活时间,handler;依次处理顺序为,如果小于最小线程数量,则创建线程执行任务;如果等于最小线程数量且缓冲队列不为空,则把任务暂存到缓冲队列中;如果缓冲队列也满了,则继续创建线程;如果达到了最大线程数量,则执行handler定义的处理程序,包括抛弃当前任务、不处理、抛弃第一个任务等;如果线程在线程池中没有安排任务,则超过空闲存活时间就会销毁线程。
2)Lock和Condition
可以用lock.newCondition()创建Condition对象,用来实现wait(),notify(),notifyAll()方法,对应的是await(),singnal(),singnalAll();
3)并发集合类
例如concurrenthashmap
concurrenthashmap虽然是线程安全的hashmap,但是它的效率并不比hashmap低很多,因为它在实现的时候,对不同的key分成了不同的几段,每一段之间是并发执行的。具体还需要去看源码。
20、session
java servlet获取session的方法是Httprequest.getSession()得到HttpSession对象。
session中是如何存放数据的?
HttpSession有setAttribute和getAttrubute方法,用于数据读写。