Java面试常问题目(共18页).docx
《Java面试常问题目(共18页).docx》由会员分享,可在线阅读,更多相关《Java面试常问题目(共18页).docx(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上Java类别问题1. String与StringBuilder、StringBuffer的区别如果要操作少量的数据用 = String单线程操作字符串缓冲区 下操作大量数据 = StringBuilder多线程操作字符串缓冲区 下操作大量数据 = StringBuffer2. Collection类,Collection包结构,与Collections的区别Collection是集类,包含List有序列表,Set无序集合以及Map双列集合Collection是集合类的上级接口,子接口主要有Set 和List、Map。 Collections是针对集合类的一个帮助类,提
2、供了操作集合的工具方法:一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。3. java哪些集合类是线程安全的vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。statck:堆栈类,先进后出enumeration:枚举,相当于迭代器hashtable:就比hashmap多了个线程安全4. 线程安全是什么意思就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访
3、问5. 九种基本数据类型的大小,以及他们的封装类。java提供了一组基本数据类型,包括boolean, byte, char, short, int, long, float, double, void. 同时,java也提供了这些类型的封装类,分别为Boolean, Byte, Character, Short, Integer, Long, Float, Double, Void既然提供了基本类型,为什么还要使用封装类呢比如,如果想使用List来保存数值,由于List中只能添加对象,另外,有些情况下,我们也会编写诸如func(Object o)的这种方法6. Switch能否用string
4、做参数在 Java 7之前,switch 只能支持 byte、short、char、int或者其对应的封装类以及 Enum 类型。在 Java 7中,String支持被加上了。7. equals与=的区别。1.=是一个运算符。2.Equals则是Object对象的方法,可以.(点)出来。8. Java的四种引用,强弱软虚,用到的场景1强引用,这是使用最普遍的引用。如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。2软引用
5、,如果一个对象只具有软引用,那就类似于可有可无的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。3弱引用,如果一个对象只具有弱引用,那就类似于可有可无的生活用品。 弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。4虚引用,虚引用顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。9. Hashcode
6、的作用Hashcode这个方法是用来鉴定2个对象是否相等的,hashcode方法一般用户不会去调用,比如在hashmap中,由于key是不可以重复的,他在判断key是不是重复的时候就判断了hashcode这个方法,而且也用到了equals方法。10. ArrayList、LinkedList、Vector的区别ArrayList,Vector底层是由数组实现,LinkedList底层是由双线链表实现,从底层的实现可以得出它们的性能问题,ArrayList,Vector插入速度相对较慢,查询速度相对较快,而LinkedList插入速度较快,而查询速度较慢。再者由于Vevtor使用了线程安全锁,所
7、以ArrayList的运行效率高于Vector。11. Map、Set、List、Queue、Stack的特点与用法Set集合类似于一个罐子,丢进Set集合里的多个对象之间没有明显的顺序。List集合代表元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。Stack是Vector提供的一个子类,用于模拟栈这种数据结构(LIFO后进先出)Queue用于模拟队列这种数据结构(先进先出 FIFO)。Map用于保存具有映射关系的数据,因此Map集合里保存着两组值12. HashMap和HashTable的区别Hashtable是基于陈旧的Dictionary类的,HashMap是Map接口的一
8、个实现Hashtable的方法是线程同步的,而HashMap的方法不是。只有HashMap可以让你将空值作为一个表的条目的key或value13. TreeMap、HashMap、LindedHashMap的区别Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序TreeMap取出来的是排序后的键值对。但如果您要按自然顺
9、序或自定义顺序遍历键,那么TreeMap会更好。14. try catch finally,try里有return,finally还执行么a.不管有木有出现异常,finally块中代码都会执行b.当try和catch中有return时,finally仍然会执行c.finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的d.finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值
10、15. OOM你遇到过哪些情况java.lang.OutOfMemoryError: Java heap space -java堆内存溢出,此种情况最常见,一般由于内存泄露或者堆的大小设置不当引起。java.lang.OutOfMemoryError: PermGen space -java永久代溢出,即方法区溢出了,一般出现于大量Class或者jsp页面,或者采用cglib等反射机制的情况,因为上述情况会产生大量的Class信息存储于方法区。java.lang.StackOverflowError - 不会抛OOM error,但也是比较常见的Java内存溢出。JAVA虚拟机栈溢出,一般是由
11、于程序中存在死循环或者深度递归调用造成的,栈大小设置太小也会出现此种溢出。可以通过虚拟机参数-Xss来设置栈的大小。16. Java面向对象的三个特征与含义封装性:它是将类的一些敏感信息隐藏在类的类部,不让外界直接访问到继承性:子类通过一种方式来接受父类所有的公有的,受保护的成员变量和成员方法多态性:程序在运行的过程中,同一种类型在不同的条件下表现不同的结果17. Override和Overload的含义去区别方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性
12、的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。18. Interface与abstract类的区别接口可以多重继承,抽象类不可以接口定义方法,不给实现;而抽象类可以实现部分方法接口中基本数据类型的数据成员,都默认为static和final,抽象类则不是19. Static cla
13、ss 与non static class的区别内部静态类不需要有指向外部类的引用。但非静态内部类需要持有对外部类的引用。非静态内部类能够访问外部类的静态和非静态成员。静态类不能访问外部类的非静态成员。他只能访问外部类的静态成员。一个非静态内部类不能脱离外部类实体被创建,一个非静态内部类可以访问外部类的数据和方法,因为他就在外部类里面。20. java多态的实现原理.设计时多态:方法【重载】实现的多态.运行时多态:方法【重写】实现的多态21. 实现多线程的两种方法:Thread与Runable使用Runnable接口实际工作中,几乎所有的多线程应用都用实现Runnable这种方式。Runnabl
14、e适合多个相同程序代码的线程去处理同一资源的情况。把虚拟CPU(线程)同程序的代码、数据有效的分离,较好的体现了面向对象的设计思想。避免由于Java的单继承特性带来的局限性。也就是如果新建的类要继承其他类的话,因为JAVA中不支持多继承,就只能实现java.lang.Runnable接口。有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。继承Thread类不能再继承他类了。编写简单,可以直接操纵线程,无需使用Thread.currentThread()。22. 线程同步的方法:sychronized、lock、reentrantLock等sychronized是java中最基本同
15、步互斥的手段,可以修饰代码块,方法,类,在修饰代码块的时候需要一个reference对象作为锁的对象,在修饰方法的时候默认是当前对象作为锁的对象,在修饰类时候默认是当前类的Class对象作为锁的对象.ReentrantLock除了synchronized的功能,多了三个高级功能.等待可中断,在持有锁的线程长时间不释放锁的时候,等待的线程可以选择放弃等待公平锁, 按照申请锁的顺序来一次获得锁称为公平锁.synchronized的是非公平锁,ReentrantLock可以通过构造函数实现公平锁绑定多个Condition. 通过多次newCondition可以获得多个Condition对象,可以简单
16、的实现比较复杂的线程同步的功能.通过await(),signal();23. Java锁的等级方法锁,synchronized标记的方法对象锁,在方法上加了synchronized的锁,或者synchronized(this)的代码段类锁,在代码中的方法上加了static和synchronized的锁,因为在静态方法中加同步锁会锁住整个类24. 写出生产者消费者模式阻塞队列实现生产者消费者模式超级简单,它提供开箱即用支持阻塞的方法put()和take(),开发者不需要写困惑的wait-nofity代码去实现通信。BlockingQueue 一个接口,Java5提供了不同的现实,如ArrayBl
17、ockingQueue和LinkedBlockingQueue,两者都是先进先出(FIFO)顺序。而ArrayLinkedQueue是自然有界的,LinkedBlockingQueue可选的边界。25. ThreadLocal的设计理念与作用ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。26. ThreadPool用法与优
18、势线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程所需的时间,从而提高效率。FixedThreadPool(int nThreads): 创建一个可重用的固定线程数的线程池,如果池中所有的nThreads个线程都处于活动状态时提交任务(任务通常是Runnable或Callable对象), 任务将在队列中等待, 直到池中出现可用线程CachedThreadPool(): 调用此方法创建的线程池可根据需要自动调整池中线程的数量,执行任务时将重用存在先前创建的线程(如果池中存在可用线程的话). 如果池中没有可用线程, 将创建一个新的线程, 并将其添加到
19、池中. 池中的线程超过60秒未被使用就会被销毁, 因此长时间保持空闲的SingleThreadExecutor(): 创建一个单线程的Executor. 这个Executor保证按照任务提交的顺序依次执行任务.ScheduledThreadPool(int corePoolSize): 创建一个可重用的固定线程数的线程池. ScheduledExecutorService是ExecutorService的子接口, 调用ScheduledExecutorService的相关方法, 可以延迟或定期执行任务.以上静态方法均使用默认的ThreadFactory(即Executors.defaultTh
20、readFactory()方法的返回值)创建线程, 如果想要指定ThreadFactory, 可调用他们的重载方法.通过指定ThreadFactory, 可以定制新建线程的名称, 线程组, 优先级, 守护线程状态等.如果Executors提供的创建线程池的方法无法满足要求, 可以使用ThreadPoolExecutor类创建线程池.27. wait()和sleep()的区别sleep指线程被调用时,占着CPU不工作,形象地说明为“占着CPU睡觉”,此时,系统的CPU部分资源被占用,其他线程无法进入,会增加时间限制。wait指线程处于进入等待状态,形象地说明为“等待使用CPU”,此时线程不占用任
21、何资源,不增加时间限制28. foreach与正常for循环效率对比针对列表的 foreach的效率是最低, 耗时是普通for循环的2倍以上。个人理解它的实现应该和iterator相似29. Java IO与NIOJava NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就
22、增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。30. 反射的作用于原理JAVA反射(放射)机制:Reflection,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。用途:Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。31. 泛
23、型常用特点,List能否转为List泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)在Java的泛型接口中 把List 转换成List 是可以的。32. 解析XML的几种方式的原理与特点:DOM、SAXDom解析 在内存中创建一个DOM树,该结构通常需要加载整个文档然后才能做工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的,树在内存中是持久的,因此
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 面试 题目 18
限制150内