简单面试题整理

一、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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值