Java面试常问题目.docx

上传人:b****2 文档编号:12872846 上传时间:2023-04-22 格式:DOCX 页数:27 大小:253.17KB
下载 相关 举报
Java面试常问题目.docx_第1页
第1页 / 共27页
Java面试常问题目.docx_第2页
第2页 / 共27页
Java面试常问题目.docx_第3页
第3页 / 共27页
Java面试常问题目.docx_第4页
第4页 / 共27页
Java面试常问题目.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

Java面试常问题目.docx

《Java面试常问题目.docx》由会员分享,可在线阅读,更多相关《Java面试常问题目.docx(27页珍藏版)》请在冰豆网上搜索。

Java面试常问题目.docx

Java面试常问题目

Java类别问题

1.String与StringBuilder、StringBuffer区别

如果要操作少量数据用=String

单线程操作字符串缓冲区下操作大量数据=StringBuilder

多线程操作字符串缓冲区下操作大量数据=StringBuffer

2.Collection类,Collection包构造,与Collections区别

Collection是集类,包括List有序列表,Set无序集合以及Map双列集合

Collection是集合类上级接口,子接口重要有Set和List、Map。

Collections是针对集合类一种协助类,提供了操作集合工具办法:

一系列静态办法实现对各种集合搜索、排序、线程安全化等操作。

3.java哪些集合类是线程安全

vector:

就比arraylist多了个同步化机制(线程安全),由于效率较低,当前已经不太建议使用。

在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑。

statck:

堆栈类,先进后出

enumeration:

枚举,相称于迭代器

hashtable:

就比hashmap多了个线程安全

4.线程安全是什么意思

就是线程同步意思,就是当一种程序对一种线程安全办法或者语句进行访问时候,其她不能再对她进行操作了,必要等到这次访问结束后来才干对这个线程安全办法进行访问

5.九种基本数据类型大小,以及她们封装类。

java提供了一组基本数据类型,涉及boolean,byte,char,short,int,long,float,double,void.同步,java也提供了这些类型封装类,分别为Boolean,Byte,Character,Short,Integer,Long,Float,Double,Void

既然提供了基本类型,为什么还要使用封装类呢

例如,如果想使用List来保存数值,由于List中只能添加对象,此外,有些状况下,咱们也会编写诸如func(Objecto)这种办法

6.Switch能否用string做参数

在Java7之前,switch只能支持byte、short、char、int或者其相应封装类以及Enum类型。

在Java7中,String支持被加上了。

7.equals与==区别。

1.==是一种运算符。

2.Equals则是Object对象办法,可以.(点)出来。

8.Java四种引用,强弱软虚,用到场景

1.强引用,这是使用最普遍引用。

如果一种对象具备强引用,那就类似于必不可少生活用品,垃圾回收器绝不会回收它。

当内存空间局限性,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终结,也不会靠随意回收具备强引用对象来解决内存局限性问题。

2.软引用,如果一种对象只具备软引用,那就类似于可有可无生活用品。

如果内存空间足够,垃圾回收器就不会回收它,如果内存空间局限性了,就会回收这些对象内存。

3.弱引用,如果一种对象只具备弱引用,那就类似于可有可无生活用品。

弱引用与软引用区别在于:

只具备弱引用对象拥有更短暂生命周期。

在垃圾回收器线程扫描它所管辖内存区域过程中,一旦发现了只具备弱引用对象,不论当前内存空间足够与否,都会回收它内存。

4.虚引用,"虚引用"顾名思义,就是形同虚设,与其她几种引用都不同,虚引用并不会决定对象生命周期。

如果一种对象仅持有虚引用,那么它就和没有任何引用同样,在任何时候都也许被垃圾回收。

9.Hashcode作用

Hashcode这个办法是用来鉴定2个对象与否相等,hashcode办法普通顾客不会去调用,例如在hashmap中,由于key是不可以重复,她在判断key是不是重复时候就判断了hashcode这个办法,并且也用到了equals办法。

10.ArrayList、LinkedList、Vector区别

ArrayList,Vector底层是由数组实现,LinkedList底层是由双线链表实现,从底层实现可以得出它们性能问题,ArrayList,Vector插入速度相对较慢,查询速度相对较快,而LinkedList插入速度较快,而查询速度较慢。

再者由于Vevtor使用了线程安全锁,因此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接口一种实现

Hashtable办法是线程同步,而HashMap办法不是。

只有HashMap可以让你将空值作为一种表条目key或value

13.TreeMap、HashMap、LindedHashMap区别

Hashmap是一种最惯用Map,它依照键HashCode值存储数据,依照键可以直接获取它值,具备不久访问速度,遍历时,获得数据顺序是完全随机。

LinkedHashMap保存了记录插入顺序,在用Iterator遍历LinkedHashMap时,先得到记录必定是先插入.也可以在构造时用带参数,按照应用次数排序

TreeMap取出来是排序后键值对。

但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。

14.trycatchfinally,try里有return,finally还执行么

a.不论有木有浮现异常,finally块中代码都会执行

b.当try和catch中有return时,finally依然会执行

c.finally是在return背面表达式运算后执行(此时并没有返回运算后值,而是先把要返回值保存起来,管finally中代码怎么样,返回值都不会变化,任然是之前保存值),因此函数返回值是在finally执行前拟定

d.finally中最佳不要包括return,否则程序会提前退出,返回值不是try或catch中保存返回值

15.OOM你遇到过哪些状况

java.lang.OutOfMemoryError:

Javaheapspace------>java堆内存溢出,此种状况最常用,普通由于内存泄露或者堆大小设立不当引起。

java.lang.OutOfMemoryError:

PermGenspace------>java永久代溢出,即办法区溢出了,普通浮现于大量Class或者jsp页面,或者采用cglib等反射机制状况,由于上述状况会产生大量Class信息存储于办法区。

java.lang.StackOverflowError------>不会抛OOMerror,但也是比较常用Java内存溢出。

JAVA虚拟机栈溢出,普通是由于程序中存在死循环或者深度递归调用导致,栈大小设立太小也会浮现此种溢出。

可以通过虚拟机参数-Xss来设立栈大小。

16.Java面向对象三个特性与含义

封装性:

它是将类某些敏感信息隐藏在类类部,不让外界直接访问到

继承性:

子类通过一种方式来接受父类所有公有,受保护成员变量和成员办法

多态性:

程序在运营过程中,同一种类型在不同条件下体现不同成果

17.Override和Overload含义去区别

办法重写Overriding和重载Overloading是Java多态性不同体现。

重写Overriding是父类与子类之间多态性一种体现,重载Overloading是一种类中多态性一种体现。

如果在子类中定义某办法与其父类有相似名称和参数,咱们说该办法被重写(Overriding)。

子类对象使用这个办法时,将调用子类中定义,对它而言,父类中定义犹如被“屏蔽”了。

如果在一种类中定义了各种同名办法,它们或有不同参数个数或有不同参数类型,则称为办法重载(Overloading)。

Overloaded办法是可以变化返回值类型。

18.Interface与abstract类区别

接口可以多重继承,抽象类不可以

接口定义办法,不给实现;而抽象类可以实现某些办法

接口中基本数据类型数据成员,都默以为static和final,抽象类则不是

19.Staticclass与nonstaticclass区别

内部静态类不需要有指向外部类引用。

但非静态内部类需要持有对外部类引用。

非静态内部类可以访问外部类静态和非静态成员。

静态类不能访问外部类非静态成员。

她只能访问外部类静态成员。

一种非静态内部类不能脱离外部类实体被创立,一种非静态内部类可以访问外部类数据和办法,由于她就在外部类里面。

20.java多态实现原理

ⅰ.设计时多态:

办法【重载】实现多态

ⅱ.运营时多态:

办法【重写】实现多态

21.实现多线程两种办法:

Thread与Runable

使用Runnable接口

实际工作中,几乎所有多线程应用都用实现Runnable这种方式。

Runnable适合各种相似程序代码线程去解决同一资源状况。

把虚拟CPU(线程)同程序代码、数据有效分离,较好体现了面向对象设计思想。

避免由于Java单继承特性带来局限性。

也就是如果新建类要继承其她类话,由于JAVA中不支持多继承,就只能实现java.lang.Runnable接口。

有助于程序健壮性,代码可以被各种线程共享,代码与数据是独立。

继承Thread类

不能再继承她类了。

编写简朴,可以直接操纵线程,无需使用Thread.currentThread()。

22.线程同步办法:

sychronized、lock、reentrantLock等

sychronized是java中最基本同步互斥手段,可以修饰代码块,办法,类,在修饰代码块时候需要一种reference对象作为锁对象,在修饰办法时候默认是当前对象作为锁对象,在修饰类时候默认是当前类Class对象作为锁对象.

ReentrantLock除了synchronized功能,多了三个高档功能.

等待可中断,在持有锁线程长时间不释放锁时候,等待线程可以选取放弃等待

公平锁,按照申请锁顺序来一次获得锁称为公平锁.synchronized是非公平锁,ReentrantLock可以通过构造函数实现公平锁

绑定各种Condition.通过多次newCondition可以获得各种Condition对象,可以简朴实现比较复杂线程同步功能.通过await(),signal();

23.Java锁级别

办法锁,synchronized标记办法

对象锁,在办法上加了synchronized锁,或者synchronized(this)代码段

类锁,在代码中办法上加了static和synchronized锁,由于在静态办法中加同步锁会锁住整个类

24.写出生产者消费者模式

阻塞队列实现生产者消费者模式超级简朴,它提供开箱即用支持阻塞办法put()和take(),开发者不需要写困惑wait-nofity代码去实现通信。

BlockingQueue一种接口,Java5提供了不同现实,如ArrayBlockingQueue和LinkedBlockingQueue,两者都是先进先出(FIFO)顺序。

而ArrayLinkedQueue是自然有界,LinkedBlockingQueue可选边界。

25.ThreadLocal设计理念与作用

ThreadLocal并不是一种Thread,而是Thread局部变量,也许把它命名为ThreadLocalVariable更容易让人理解某些

当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量线程提供独立变量副本,因此每一种线程都可以独立地变化自己副本,而不会影响其他线程所相应副本。

26.ThreadPool用法与优势

线程池是为突然大量爆发线程设计,通过有限几种固定线程为大量操作服务,减少了创立和销毁线程所需时间,从而提高效率。

FixedThreadPool(intnThreads):

创立一种可重用固定线程数线程池,如果池中所有nThreads个线程都处在活动状态时提交任务(任务普通是Runnable或Callable对象),任务将在队列中档待,直到池中浮现可用线程

CachedThreadPool():

调用此办法创立线程池可依照需要自动调节池中线程数量,执行任务时将重用存在先前创立线程(如果池中存在可用线程话).如果池中没有可用线程,将创立一种新线程,并将其添加到池中.池中线程超过60秒未被使用就会被销毁,因而长时间保持空闲

SingleThreadExecutor():

创立一种单线程Executor.这个Executor保证按照任务提交顺序依次执行任务.

ScheduledThreadPool(intcorePoolSize):

创立一种可重用固定线程数线程池.ScheduledExecutorService是ExecutorService子接口,调用ScheduledExecutorService有关办法,可以延迟或定期执行任务.

以上静态办法均使用默认ThreadFactory(即Executors.defaultThreadFactory()办法返回值)创立线程,如果想要指定ThreadFactory,可调用她们重载办法.通过指定ThreadFactory,可以定制新建线程名称,线程组,优先级,守护线程状态等.

如果Executors提供创立线程池办法无法满足规定,可以使用ThreadPoolExecutor类创立线程池.

27.wait()和sleep()区别

sleep指线程被调用时,占着CPU不工作,形象地阐明为“占着CPU睡觉”,此时,系统CPU某些资源被占用,其她线程无法进入,会增长时间限制。

wait指线程处在进入等待状态,形象地阐明为“等待使用CPU”,此时线程不占用任何资源,不增长时间限制

28.foreach与正常for循环效率对比

针对列表foreach效率是最低,耗时是普通for循环2倍以上。

个人理解它实现应当和iterator相似

29.JavaIO与NIO

JavaNIO和IO之间第一种最大区别是,IO是面向流,NIO是面向缓冲区。

JavaIO面向流意味着每次从流中读一种或各种字节,直至读取所有字节,它们没有被缓存在任何地方。

此外,它不能先后移动流中数据。

如果需要先后移动从流中读取数据,需要先将它缓存到一种缓冲区。

JavaNIO缓冲导向办法略有不同。

数据读取到一种它稍后解决缓冲区,需要时可在缓冲区中先后移动。

这就增长了解决过程中灵活性。

但是,还需要检查与否该缓冲区中包括所有您需要解决数据。

并且,需保证当更多数据读入缓冲区时,不要覆盖缓冲区里尚未解决数据。

30.反射作用于原理

JAVA反射(放射)机制:

Reflection,Java程序可以加载一种运营时才得知名称class,获悉其完整构造(但不涉及methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

用途:

Java反射机制重要提供了如下功能:

在运营时判断任意一种对象所属类;在运营时构造任意一种类对象;在运营时判断任意一种类所具备成员变量和办法;在运营时调用任意一种对象办法;生成动态代理。

31.泛型惯用特点,List能否转为List

泛型,即“参数化类型”。

一提到参数,最熟悉就是定义办法时有形参,然后调用此办法时传递实参。

那么参数化类型怎么理解呢?

顾名思义,就是将类型由本来详细类型参数化,类似于办法中变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入详细类型(类型实参)

在Java泛型接口中把List转换成List是可以。

32.解析XML几种方式原理与特点:

DOM、SAX

Dom解析在内存中创立一种DOM树,该构造普通需要加载整个文档然后才干做工作。

由于它是基于信息层次,因而DOM被以为是基于树或基于对象,树在内存中是持久,因而可以修改它以便应用程序能对数据和构造作出更改能随机访问文献内容,也可以修改原文献内容

SAX解析SAX解决长处非常类似于流媒体长处。

分析可以及时开始,而不是等待所有数据被解决。

SAX解析器采用了基于事件模型,它在解析XML文档时候可以触发一系列事件,当发现给定tag时候,它可以激活一种回调办法,告诉该办法制定标签已经找到。

并且,由于应用程序只是在读取数据时检查数据,因而不需要将数据存储在内存中。

这对于大型文档来说是个巨大长处线性解析,不能随机访问,也无法修改原文献

33.设计模式:

单例、工厂、适配器、责任链、观测者等等

 

34.JNI使用

JNI作为java和操作系统间一种直接接口,可以通过JNI使得java直接调用操作系统资源。

当前JNI只能通过c/C++实现,由于jni只是对操作系统资源调用一种桥接过程。

因此理论上在windows下只要是dll文献均可以被调用。

jni普通有如下某些应用场景

1.高性能,在某些状况下由于解决运算量非常大,为了获取高性能,直接使用java是不能胜任,如:

某些图形解决

2.调用某些硬件驱动或者某些软件驱动,例如调用某些外部系统接口驱动,如:

读卡器驱动,OCI驱动

3.需要使用大内存,远远超过jvm所能分派内存,如:

进程内Cache

4.调用C或者操作系统提供服务,如:

java调用搜索服务,其中搜索是由C/C++实现,但是这个普通可以设计成更加通用方式,例如soa方式

所有这些场景前提是牺牲了java代码可移植性,不同os,甚至版本都需要写不同版本native实现

35.mysql机制

InnoDB与Myisam

Innodb支持事务功能,Myisam不支持。

Myisam执行速度更快,性能更好。

InnoDB为行级锁,myisam为表级锁

MyISAM:

如果执行大量SELECT,MyISAM是更好选取

InnoDB:

如果你数据执行大量INSERT或UPDATE,出于性能方面考虑,应当使用InnoDB表

MyISAM:

selectcount(*)fromtable,MyISAM只要简朴读出保存好行数,注意是,当count(*)语句包括where条件时,两种表操作是同样

InnoDB:

InnoDB中不保存表详细行数,也就是说,执行selectcount(*)fromtable时,InnoDB要扫描一遍整个表来计算有多少行

36.Servlet生命周期、Servlet与否线程安全

a.在servlet容器启动时初始化。

在web.xml中配备1表达在容器启动时初始化。

默认没有此置

b.servlet在第一次被访问时初始化。

即创立唯一servlet实例。

(单例多线程下面会说)

c.当有祈求访问该servlet是,servlet容器就会创立针对于这个祈求servletRequest于servletResponse,然后servletservice办法被调用。

当容器把servlet生成响应成果发送给客户,容器就会销毁request和response对象

d.容器在销毁该实例前调用servletdestroy办法(释放servlet所占用资源,如关闭流和数据库连接),此外还会销毁与servlet对象关联ServletConfig对象。

e.servlet类只创立一种实例,对于可与客户端并发访问,它是线程不安全。

f.servlet解决方式是,每次访问时重新起一线程执行service办法。

因此要想保证servlet线程安全,不应当在servlet中定义实例变量。

g.固然完全可以通过加锁保证线程安全,但对于成千上万并发访问,性能下降。

JVM类别问题

1.内存模型以及分区,需要详细到每个区放什么。

程序计数器:

当前线程执行字节码行号批示器,线程私有

JAVA虚拟机栈:

Java办法执行内存模型,每个Java办法执行相应着一种栈帧进栈和出栈操作。

本地办法栈:

类似“JAVA虚拟机栈”,但是为native办法运营提供内存环境。

JAVA堆:

对象内存分派地方,内存垃圾回收重要区域,所有线程共享。

可分为新生代,老生代。

办法区:

用于存储已经被JVM加载类信息、常量、静态变量、即时编译器编译后裔码等数据。

Hotspot中“永久代”。

运营时常量池:

办法区一某些,存储常量信息,如各种字面量、符号引用等。

直接内存:

并不是JVM运营时数据区一某些,可直接访问内存,例如NIO会用到这某些。

2.堆里面分区:

Eden,survivalfromto,老年代,各自特点。

 

3.对象创立办法,对象内存分派,对象访问定位。

4.GC两种鉴定办法:

引用计数与引用链。

引用计数方式最基本形态就是让每个被管理对象与一种引用计数器关联在一起,该计数器记录着该对象当前被引用次数,每当创立一种新引用指向该对象时其计数器就加1,每当指向该对象引用失效时计数器就减1。

当该计数器值降到0就以为对象死亡。

Java内存回收机制可以形象地理解为在堆空间中引入了重力场,已经加载类静态变量和处在活动线程堆栈空间变量是这个空间牵引对象。

这里牵引对象是指按照Java语言规范,即便没有其他对象保持对它引用也不可以被回收对象,即Java内存空间中本原对象。

固然类也许被去加载,活动线程堆栈也是不断变化,牵引对象集合也是不断变化。

对于堆空间中任何一种对象,如果存在一条或者多条从某个或者某几种牵引对象到该对象引用链,则就是可达对象,可以形象地理解为从牵引对象伸出引用链将其拉住,避免掉到回收池中

5.GC三种收集办法:

标记清除、标记整顿、复制算法原理与特点,分别用在什么地方,如果让你优化收集办法,有什么思路?

标记清除算法是最基本收集算法,其她收集算法都是基于这种思想。

标记清除算法分为“标记”和“清除”两个阶段:

一方面标记出需要回收对象,标记完毕之后统一清除对象。

它重要缺陷:

①.标记和清除过程效率不高。

②.标记清除之后会产生大量不持续内存碎片。

标记整顿,标记操作和“标记-清除”算法一致,后续操作不只是直接清理对象,而是在清理无用对象完毕后让所有存活对象都向一端移动,并更新引用其对象指针。

重要缺陷:

在标记-清除基本上还需进行对象移动,成本相对较高,好处则是不会产生内存碎片。

复制算法,它将可用内存容量划分为大小相等两块,每次只使用其中一块。

当这一块用完之后,就将还存活对象复制到此外一块上面,然后在把已使用过内存空间一次理掉。

这样使得每次都是对其中一块进行内存回收,不会产生碎片等状况,只要移动堆订指针,按顺序分派内存即可,实现简朴,运营高效。

重要缺陷:

内存缩小为本来一半。

6.GC收集器有哪些?

CMS收集器与G1收集器特点。

单线程收集器,使用单线程去完毕所有gc工作,没有线程间通信,这种方式会相对高效

并行收集器,使用多线程方式,运用多CUP来提高GC效率,重要以到达一定吞吐量为目的

并发收集器,使用多线程方式,运用多CUP来提高GC效率,并发完毕大某些工作,使得gcpause短

G1具备如下特点:

并行与并发、分代收集、空间整合、可预测停顿

CMS具备了并发收集、低停顿长处、CMS收集器对CPU资源非常敏感、CMS收集器无法解决浮动垃圾、收集结束时会

展开阅读全文
相关搜索
资源标签

当前位置:首页 > IT计算机

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1