Java容器的面试题

目录

1.Java容器分为 Colletion 和 Map 两大类,其下 又有很多子类

2.collection 和 Collections 有什么区别?

3.List、Map、Set之间的区别是什么?

4.HashMap和Hashtable有什么区别?

5.说一下HashMap的实现原理

6.说一下HashMap的实现原理

7.ArrayList和LinkedList的区别

8.如何实现数组和List之间的转换?

9.ArrayList和Vector的区别是什么?

10.ArrayList和Array有什么区别?

11.哪些集合类是线程安全的?

12.迭代器Iterator是什么?

13.线程与进程的区别?

14.创建线程有哪几种方式?

15.线程的状态

16.sleep()和wait()有什么区别?

17.线程run()和start()有什么区别?

18.在Java程序中怎么保证多线程运行时安全?

20.什么是死锁?

21.怎么防止死锁?

22.synchronized 和 Lock 有什么区别?


1.Java容器分为 Colletion 和 Map 两大类,其下 又有很多子类

 Collection

List :ArrayList、LinkedList、Vector、Stack

Set: HashSet、LinkedHashSet 、TreeSet

map:

1.HashMap: LinkedHashMap

2.TreeMap

3.ConcurrentHashMap

4.Hashtabl

2.collection 和 Collections 有什么区别?

  collection 是一个集合接口,它提供了对集合对象接口进行基本操作的通用的接口方法,所有集合都是他的子类,比如:List   Set等。

collections是一个包装类、包含了很多静态方法、不能被实例化。就像一个工具类,比如:提供了排序方法:collections.sort(list )

3.List、Map、Set之间的区别是什么?

List、Map、Set 的区别主要体现在两个方面:元素是否有序、是否允许元素重复(三者之间的区别)

4.HashMap和Hashtable有什么区别?

存储:HashMap运行时可以为null,而Hashtable不能

线程安全:Hashtable是线程安全的,而HashMap是非线程安全的

推荐使用:在 Hashtable 的类注释可以看到,Hashtable 是保留类不建议使用,推荐在单线程环境下使用 HashMap 替代,如果需要多线程使用则用 ConcurrentHashMap 替代。

5.说一下HashMap的实现原理

HashMap是基于Hash算法实现的,通过Put(K、V)存储、get(key)来获取。当传入key时、HashMap会根据key.hashCode()计算出hash值,根据hash值将value保存在bucket里。当计算出的hash值同时,我们称之为hash冲突。HashMap的做法是用链表和红黑叔存储相同hash值的value。当hash冲突的个数比较少时,使用链表否则使用红黑树。

6.说一下HashSet的实现原理

HashSet 是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。

7.ArrayList和LinkedList的区别

数据实现结构:ArrayList是动态数组的数据实现,而Linked是双向链表的数据结构实现

随机访问效率:ArrayList比LikedList在随机访问的时候效率高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。

增加删除效率:在非首尾的增加和删除操作,LinkedList要比ArrayList效率要高,因为ArrayList增删操作要影响数组内的其他数据下标。

综合来说,在需要频繁读取集合中的元素时,更推荐使用ArrayList,而在插入和删除操作比较多时,更推荐使用Linked List。

8.如何实现数组和List之间的转换?

数组转List:使用Arrays.asList(array)进行转换

List转换数组:使用List自带的toArray()方法。

9.ArrayList和Vector的区别是什么?

线程安全: vector使用了Synchronized来实现线程同步的,是线程安全的,而ArrayList是非线程全的。

线程:ArrayList性能方面要比vector高

扩容:ArrayList和vector都会根据实际的需要动态的调整容量、只不过在vector扩容每次会增加1陪,而ArrayList只会增加50%。

10.ArrayList和Array有什么区别?

Array 可以存储基本数据类型的对象,ArrayList只能存储对象。

Array 是固定的大小的,而ArrayList大小是自动扩展的

Array 内置方法没有ArrayList多,比如 addAll、removeAll、iteration 等方法只有 ArrayList 有。

11.哪些集合类是线程安全的?

vector、Hashtable、Stack都是线程安全的,而象HashMap则是非线程的,不过在JDK1.5之后睡着java.ulit.concurrent并发包的出现,它们有了自己对应的线程安全类,不如,HashMap对应的线程安全类就是ConcurrentHashMap。

12.迭代器Iterator是什么?

iterator接口提供遍历任何collection接口,我们可以从一个collection中使用迭代器方法来获取迭代器实例,迭代器取代了Java集合框架中的EnuMeration,迭代器允许调用者在迭代过程中移除元素。

13.线程与进程的区别?

一个程序下有一个进程,一个进程下至少有一个线程,一个进程下可以有多个线程来增加程序的执行速度。

14.创建线程有哪几种方式?

创建线程有三种方式:

继承:Thread重新 run 方法;

实现:Runable 接口;

实现:Callable 接口;

15.线程的状态

线程的状态:新建——>就绪——>运行.....阻塞——>结束。

NEW 尚未启动

RUNNABLE 正在执行中

BLOCKED 阻塞的(被同步锁或者IO锁阻塞)

WAITING 永久等待状态

TIMED_WAITING 等待指定的时间重新被唤醒的状态

TERMINATED 执行完成

16.sleep()和wait()有什么区别?

类的不同:sleep()来自Thread,wait()来自Object。

释放锁不同:sleep()不释放锁,wait()释放锁。

用法不同:sleep()时间到时间自动恢复,wait()可以使用 notify()/notifyAll()直接唤醒。

17.线程run()和start()有什么区别?

start()方法是用于启动线程,run()方法是用于执行线程的运行时代码,run()可以重复调用,而start只能调用一次。

18.在Java程序中怎么保证多线程运行时安全?

使用安全类:比如 Java. util. concurrent 下的类

使用自动锁:synchronized

使用手动锁:Lock

20.什么是死锁?

当线程 A 持有独占锁a,并尝试去获取独占锁 b 的同时,线程 B 持有独占锁 b,并尝试获取独占锁 a 的情况下,就会发生 AB 两个线程由于互相持有对方需要的锁,而发生的阻塞现象,我们称为死锁。

21.怎么防止死锁?

尽量使用tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),设置超时时间,超时可以退出防止死锁。

尽量使用 Java. util. concurrent 并发类代替自己手写锁。

尽量降低锁的使用粒度,尽量不要几个功能用同一把锁。

尽量减少同步的代码块。

22.synchronized 和 Lock 有什么区别?

synchronized 可以给类、方法、代码块加锁;而 lock 只能给代码块加锁。

synchronized 不需要手动获取锁和释放锁,使用简单,发生异常会自动释放锁,不会造成死锁;而 lock 需要自己加锁和释放锁,如果使用不当没有 unLock()去释放锁就会造成死锁。

通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值