一、5个常用的包、接口、类
lang:为java编程提供基础类
util: collection 框架,日期和各种实用工具类
math:提供用于任意精度整数算法和任意精度小数算法的类
io:输入输出流、序列化
java.swt: 用于创建用户界面和绘制图形的所有类
接口:List,Map,Set,Comparable ,Iterator
类:String,StringBuffer,Date,System,Object
二、api接口注意事项
1、通用的数据交换格式,对于接口和客户端的数据交换格式,基本上就是三种,xml和json和webservice
2、安全问题,请求来源(身份)是否合法且唯一 ,数据传输是否安全;签名验证,ip验证,时间戳验证,敏感数据进行加密
3、参数命名准确,提供明确的数据状态信息。
三、List、Map、Set三个接口,存取元素时,各有什么特点?
其中Vector、HashTable、Properties是线程安全的。其中ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等都是线程不安全的。(线程不安全是指:当多个线程访问同一个集合或Map时,如果有超过一个线程修改了ArrayList集合,则程序必须手动保证该集合的同步性。)
List表示有先后顺序的集合,Set里面不允许有重复的元素,Map是双列的集合
四、创建线程的几种方式。
Thread,Runnable,Callable,使用Executor框架来创建线程池
五、实现线程同步的方法
1、使用synchronized关键字
2、wait和notify
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
3、使用特殊域变量volatile实现线程同步
4、使用重入锁实现线程同步
5、使用局部变量来实现线程同步
6、使用阻塞队列实现线程同步
六、sleep和wait的区别
“sleep是Thread类的方法,wait是Object类中定义的方法”。尽管这两个方法都会影响线程的执行行为,但是本质上是有区别的。
Thread.sleep不会导致锁行为的改变,如果当前线程是拥有锁的,那么Thread.sleep不会让线程释放锁。如果能够帮助你记忆的话,可以简单认为和锁相关的方法都定义在Object类中,因此调用Thread.sleep是不会影响锁的相关行为。
Thread.sleep和Object.wait都会暂停当前的线程,对于CPU资源来说,不管是哪种方式暂停的线程,都表示它暂时不再需要CPU的执行时间。OS会将执行时间分配给其它线程。区别是,调用wait后,需要别的线程执行notify/notifyAll才能够重新获得CPU执行时间。
七、Runnable接口和Callable接口的区别。
(1)Callable规定的方法是call(),Runnable规定的方法是run().
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
(3)call方法可以抛出异常,run方法不可以
(4)运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。
八、如何实现线程安全。
1. 多实例、或者是多副本(ThreadLocal):ThreadLocal可以为每个线程的维护一个私有的本地变量
2. 使用锁机制 synchronize、lock方式:为资源加锁
3. 使用 java.util.concurrent 下面的类库:有JDK提供的线程安全的集合类
九、如何实现浅克隆和深克隆。
一般步骤是(浅克隆):
1. 被复制的类需要实现Clonenable接口(不实现的话在调用clone方法会抛出CloneNotSupportedException异常), 该接口为标记接口(不含任何方法)
2. 覆盖clone()方法,访问修饰符设为public。方法中调用super.clone()方法得到需要的复制对象。(native为本地方法)
深克隆:
浅复制只是复制了addr变量的引用,并没有真正的开辟另一块空间,将值复制后再将引用返回给新对象。
所以,为了达到真正的复制对象,而不是纯粹引用复制。我们需要将Address类可复制化,并且修改clone方法
@Override
protected Object clone() throws CloneNotSupportedException {
Student stu = null;
try {
//浅复制
stu = (Student) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
//深度复制
stu.address = (Address) address.clone();
return stu;
}