面试题整理:,多线程,集合

一.java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?同步有几种实现方法?
答:继承Thread类,实现runnable接口。
用synchronizd关键字修饰同步方法。
同步的实现方法有两种,分别是synchronized,wait与notify。

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

三.同步和异步有何异同,在什么情况下分别使用他们?
答:如果数据将在线程间共享,例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能被另一个线程写过了,那么这写数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不许忘让程序等待方法的返回时,就应该使用一部编程,在很多情况下采用异步途径往往更有效率。

四.当一个线程进入一个对象的一个synchronized方法后,其他线程是否可进入此对象的其他方法?
答:其他方法前是否加了synchronized关键字,如果没加,则能。
如果这个方法内部调用了wait,则可以进入其他synchronized方法。
如果其他方法都加了synchronized关键字,并且内部没有调用wait,咋不能。
如果其他方法是static,他用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this。

五.线程的基本概念,线程的基本状态以及状态之间的关系?
答:一个程序中可以有很多条执行线索同时执行,一个线程就是程序中的一条执行线索,每个线程上都关联有要执行的代码,即可以有多段程序代码同时运行,每个程序至少都有一个线程。
状态:就绪,运行,synchronized阻塞,wait和sleep挂起,结束。wait必须在synchronized内部调用。
调用线程的start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized语句时,由运行状态为阻塞,当synchronized获得锁后,由阻塞转为运行,在这种情况可以调用wait方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。

六.ArrayList和Vector的区别?
答:这两个了都实现了List接口,他们都是有序集合,即存储在这两个集合的元素的位置都是有顺序的,相当于一种动态数组,我们可以按位置索引号取出某个元素,并且其中的数据是允许重复的,这是HashSet之类的集合的最大不同之处。
ArrayList是线程不安全的,他的方法之间是线程不同步的,Vector是线程安全的,他的方法之间是线程同步的。
Vector增长原来的一倍,ArrayList增加原来的0.5倍。

七.HashMap和Hashtbale的区别?
答:HashMap和Hashtbale都实现了Map接口,主要区别在于HashMap允许空键值,由于非线程安全,在只有一个线程访问的情况下,效率要高于Hashtable。

八.List和Map区别?
答:一个是存储单列数据的聚合,另一个是存储键和值这样的双列数据的集合。
List中存储的数据是有顺序的,并且允许重复,Map中存储的数据是没有顺序的,其键是不能重复的,他的值是可以有重复的。

九.List、Map、Set三个接口,存取元素时,各有什么特点?
答:List和Set具有相似性,他们都是单列元素的集合,不同之处在于set里面不允许有重复的元素,set取元素时,没法说取第几个,只能以Iterator接口取的所有的元素。List取元素时,除了可以以Iterator接口取的所有的元素,在逐一遍历各个元素之外,还可以调用get(index i)来明确说明取第几个。Map与List和Set不同,他是双列的集合,每次存储时要存储key/value,不能存储重复的key。

十.说出ArrayList,Vector,LinkedList的存储性能和特性?
答:ArrayList和Vector都是使用数组方式存储数据,此数据大于实际存储的数据以便增加和插入元素,他们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector通常性能上比ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前后或后向遍历,但是插入数据时只需要记录本想的前后项即可,所以插入速度较快。

十一.heap和stack有什么区别?
答:java的内存分为两类,一类是栈内存,一类是堆内存,栈内存是指程序进入一个方法时,会为方法单独分配一块空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配个这个方法的栈会释放,这个栈中的变量也将随之释放,栈中的数据存取效率高,栈的存储空间小。
堆一般存放不在当前方法栈中的那些数据,例如,使用new创建的对象都放在堆里,所以,他不会碎方法的结束而消失,方法中的局部变量使用final修饰后,放在堆中,而不是栈中,堆内存容量大,存取效率低。

十二.描述一下JVM加载class文件的原理机制?
答:JVM中类的装载是有ClassLoader和他的自雷来实现的,Java ClassLoder是一个重要的Java运行时系统组件,他负责在运行时查找和装入类文件的类。

十三.GC是什么?为什么要有GC?
答:GC是垃圾回收的意思,内存处理是变成人员容易出现问题的地方,忘记或者错误的内存回收会导致成续或系统的不稳定甚至崩溃,Java提供的GC功能可以自动检测对象是否超过作用域从而达到自动回收内存的目的。

十四.垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
答:对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况,通常GC采用邮箱的方式记录和管理堆中的所有对象,通过这中方式确定哪些对象是'可达的',哪些对象是'不可达的',当GC确定一些对象为'不可达'时,GC就有责任回收这些内存空间。
可以,程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

十五.java中会存在内存泄漏吗,请简单描述。
答:java中内存泄漏的情况,长生命周期的对象持有短生命周期对象引用就很可能发生内存泄漏。尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄漏的发生场景。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务