什么是死锁(deadlock)?
两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个进程都陷入了无限的等待中。
代码表示:
代码描述:
publicclassDieLockDemo{publicstaticvoidmain(String[]args){DieLockdl1=newDieLock(true);DieLockdl2=newDieLock(false); dl1.start(); dl2.start();}}
*...理想状态下dl1线程为true从if执行先打出"ifobjA"然后再接着打出"ifobjB"之后释放A、B的锁对象,之后dl2线程执行else语句打出"elseobjB","elseobjA"。
非理想状态下dl1先打出"ifobjA",之后线程dl2执行打出"elseobjB",然后1、2线程的锁对象A和B都处于被锁的状态,两个线程争夺锁对象发生死锁现象。..*
publicclassDieLockextendsThread{ privatebooleanflag; publicDieLock(booleanflag){ this.flag=flag; } @Override publicvoidrun(){ if(flag){ synchronized(MyLock.objA){ System.out.println("ifobjA"); synchronized(MyLock.objB){ System.out.println("ifobjB"); } } }else{ synchronized(MyLock.objB){ System.out.println("elseobjB"); synchronized(MyLock.objA){ System.out.println("elseobjA"); } } } } }
如何确保N个线程可以访问N个资源同时又不导致死锁?
使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。
Java集合类框架的基本接口有哪些?
Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有:
Collection:代表一组对象,每一个对象都是它的子元素。
Set:不包含重复元素的Collection。
List:有顺序的collection,并且可以包含重复元素。
Map:可以把键(key)映射到值(value)的对象,键不能重复。
什么是迭代器(Iterator)?
Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的迭代方法。迭代器可以在迭代的过程中删除底层集合的元素。
Iterator和ListIterator的区别是什么?
下面列出了他们的区别:
Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。
Java中的HashMap的工作原理是什么?
Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(loadfactor)和扩容极限(thresholdresizing)。
HashMap和Hashtable有什么区别?
HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点:
HashMap允许键和值是null,而Hashtable不允许键或者值是null。
Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。
o一般认为Hashtable是一个遗留的类。
数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?
下面列出了Array和ArrayList的不同点:
Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
Array大小是固定的,ArrayList的大小是动态变化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。
ArrayList和linkedList有什么区别?
ArrayList和linkedList都实现了List接口,他们有以下的不同点:
ArrayList是基于索引的数据接口**,它的底层是数组**。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,linkedList是以元素链表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。
相对于ArrayList,linkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。
linkedList比ArrayList更占内存,因为linkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
也可以参考ArrayListvs.linkedList。
以上就是北大青鸟长沙麓谷校区java培训机构的小编针对“2020年Java经典企业笔试题”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。
Java笔试题