javase基础十问(第四天)

1、说出ArrayList,Vector, LinkedList 的存储性能和特性
List:有序可重复
ArrayList:底层是由可变数组实现,采用顺序存储,长度默认为10,扩容时每次扩0.5倍。因为底层是数组,可以按索引进行查询,所以查询快增删慢,因为每次增删改之前都会对后面的元素进行操作。
LinkedList:底层由双向链表实现,采用链式存储,因为需要根据前一个节点来获取后一个节点的地址,所以查询相对较慢,因为是链表,地址不连续,所以增删快。

2、HashMap 和Hashtable 的区别
1)HashMap 没有排序,允许一个null 键和多个null 值,而Hashtable 不允许;

2)HashMap 把Hashtable 的contains 方法去掉了,改成containsvalue 和containsKey,因为contains 方法容易让人引起误解;

4)Hashtable 的方法是Synchronize 的,而HashMap 不是,

3、Arraylist 与Vector 区别
1)安全性:Vector 是线程安全的(同步),而ArrayList 是线程序不安全的;
2)扩容:当需要增长时,Vector 默认增长一倍,而ArrayList 却是一半。

4、sleep() 和wait() 有什么区别?
sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep 不会释放对象锁。
wait 是Object 类的方法,对此对象调用wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

5、请说出你所知道的线程同步的方法
wait():使一个线程处于等待状态,并且释放所持有的对象的lock;sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException 异常;
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM 确定唤醒哪个线程,而且不是按优先级;
notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
synchronized:同步关键字

6、多线程有几种实现方法,都是什么?
1、继承Thread类实现多线程
2、实现Runnable接口方式实现多线程
3、使用ExecutorService、Callable、Future实现有返回结果的多线程
4、通过线程池创建线程

7、简述synchronized 和java.util.concurrent.locks.Lock 的异同?
主要相同点:Lock 能完成synchronized 所实现的所有功能;主要不同点:Lock 有比synchronized 更精确的线程语义和更好的性能。synchronized 会自动释放锁,而Lock 一定要求程序员手工释放,并且必须在finally 从句中释放。

8、run()和start()有什么区别?

start()是启动一个线程,并没有运行,处于就绪状态,调用了run()才会运行。
run()是运行这个线程,单独调用不会创建新线程。

9、stop()和suspend()方法为何不推荐使用?
stop()会停止释放全部的对象锁,线程不安全。
suspend()会将目标线程挂起,但不会释放锁,这就导致其它线程拿不到该锁的资源。
正确的做法是设置一个标志,用标志来决定是否挂起。

10、线程yield()方法有什么用
Yield方法可以暂停当前正在执行的线程对象,让其它有相同优先级的线程执行。它是一个静态方法而且只保证当前线程放弃CPU占用而不能保证使其它线程一定能占用CPU,执行yield()的线程有可能在进入到暂停状态后马上又被执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值