java面试总结要点.docx
《java面试总结要点.docx》由会员分享,可在线阅读,更多相关《java面试总结要点.docx(92页珍藏版)》请在冰豆网上搜索。
java面试总结要点
java面试宝典
任职要求:
java
精通java,熟悉socket和多线程开发,熟练掌握JSP、Servlet JDBC等相关技术,熟悉常用的数据模式
熟悉JVM性能调优(对JVM有一定的了解)
熟悉面向对象的系统分析、设计与编程思想了解设计模式、重构以及敏捷开发的基础知识
有敏捷开发和测试自动化经验者优先
框架
熟练使用主流来源框架,如Spring、struts2、mybatis、hibeenate,熟悉ssh、ssm框架集成
(使用过一种RPC协议、缓存技术)
能够熟练使用主流框架技术,包含:
SpringBoot、SpringMVC
能够熟练使用主流框架技术,包含:
Spring、Axon(CQRS)
熟练使用Springmvc+FreeMarker进行开发
数据库
熟悉关系型数据库,有redis等开源的NOSQL相关知识
能够熟练使用主流存储技术,包含:
MySQL、MongoDB、Couchbase、Cassandra、Redis、FastDFS
熟练掌握MySql、Oracle等数据库,sql语言,索引、过程、触发器的使用,掌握pl/sql编程
熟悉mysql使用,有一定的sql优化,维护经验;熟练掌握SQL、存储过程、触发器、视图的编写
熟悉至少一种NoSQL数据库,如MongoDB、Memcached、Redis、HBase等
至少掌握Oracle、DB2、SqlServer三种数据库中的两种
了解Oracle,Sybase,DB2等数据库系统之一
熟练使用MsSql、MySql、Oracle中的一种数据库
掌握postgreSQL数据库的使用和开发,有相关数据库经验也可
熟练掌握常用sql,使用过sybase,sqlserver、mysql等主流数据中一种或几种
熟悉数据库建模,熟练使用Oracle、DB2、mysql数据库并进行调优熟悉设计模式和UML
数据库高并发
有数据库优化和设计经验(对软件系统的高性能、高并发、高可用等有了解和实践经验)
(熟悉Linux/Nginx/haproxy负载均衡、反向代理等配置)
熟悉多线程及高性能的设计与编码及性能调优
Jquery
熟练使用HTML/XML、HTML5、CSS3、jquery、javascript、AJAX、easyui、bootstrap等前端web应用程序开发技术
(掌握Ajax技术,熟悉jquery或Prototype应用)
(了解前端dhtml技术,有一定js编程经验)
熟练使用js框架(extjs mootools)
熟悉KendoUI开发者优先考虑。
服务器
熟练使用Aapache、tomcat、nginx等常见应用服务器,具有相关的部署和配置经验
(熟悉tomcat/Jetty/Jboss等主流服务器)
熟悉Tomcat、JBoss的配置和管理
(熟悉Tomcat等应用服务器,同时对在高并发处理情况下的负载调优有相关经验者优先考虑,具有分布式系统开发等方面经验者优先)
了解Tomcat,Jboss,Weblogic,Websphere等应用服务器中的两种以上
精通Tomcat、Apache、Nginx等多种开源服务器,熟练掌握至少2种应用服务器,如WebLogic、Tomcat、Resin、JBoss、WebSphere等;
至少熟练使用weblogic、websphere、resin、tomcat、Jboss五种中间件的三种
熟练掌握和使用apache、varnish、nginx、jetty、tomcat等应用服务
熟悉Java开发,对Weblogic、WebSphereAppServer及WebSpherePortalServer中的至少一种以上
精通WebSphere、WebLogic、JBoss、Tomcat其中一到两种应用服务器,并具备服务器调优能力
工具
熟练掌握svn、git 、Ecplise、Maven等工具
熟练使用nodejs
能够熟练使用Eclipse、PowerDesigner、SVN或CVS等工具
熟练使用(My)Eclipse、NetBeans等开发工具并能够使PowerDesinger、RationalRose进行设计工作
分布式工具
三年以上互联网产品开发经验,有海量数据存储、大用户量项目经验,有dubbo、thrift、zookeeper等分布式工具使用经验
建模工具
熟悉UML建模工具,能进行分析和设计
消息队列
熟练掌握和应用acticemq、kafka、rocketmq等消息队列
Linux
基本Linux的使用(熟练在Linux下的开发与运行环境,有长期Linux使用经验者优先考虑)
熟悉OS原理,能使用linux/unix常用基本命令
结构算法
了解常用的数据结构和算法
架构
熟悉Dubbo,Zookeeper分布式架构,mysql集群,Lucene,solr全文检索
了解分布式架构、缓存、异步、消息系统等思想
大数据
熟悉hadoop生态系统,具备Hadoop/Storm等分布式计算平台的开发、运维经验者优先
了解Hadoop、Hive、HBase、Storm等相关技术基础,并能围绕展开开发工作
检索(电商)
了解Lucene全文检索机制,能参与到全文检索的开发
阿里云
有阿里云使用经验
能够熟练使用阿里云服务,包含:
MQS、SLS、ODPS、OAS等。
熟悉工作流、Auto、MQ
熟悉IM,websocket,XMPP,MQTT等即时通讯方面技术优先考虑
能够熟练使用主流队列技术,包含:
ActiveMQ、RabbitMQ、kafka、Disruptor
能够熟练使用主流RPC技术,包含:
Thrift、Dubbo
能够熟练使用主流通信技术,包含:
Mina、Netty、Protobuf
资深java工程师
精通C++或java;能够在Linux系统上进行开发部署工作
精通TCP/UDP等常见协议,并具有丰富的网络服务器开发经验
熟悉代理服务器、负载均衡常用网络组件
熟悉常见的服务器开发模式,并精通其中的一种或多种
熟悉缓存/消息队列等常用中间件技术,并且熟悉常用的开源框架
能够带领团队设计、开发10w行以上代码的核心服务器
熟悉长期运行、高并发的C++或java服务器的开发、部署、测试、排错等工作
熟悉至少一种网络协议栈,能够快速理解和开发新的协议栈
中等规模软件项目的规划和管理能力
自我评价:
有较好的沟通交流能力与抗压能力
学习能力强,拥有优秀的逻辑思维能力
性格开朗、善于沟通、有良好的学习能力、有良好的团队协作能力、较强的抗压能力、有良好的编码规范意识、勇于接受挑战、善于自我激励
职业规划
项目流程
*************JavaOOP******************
☆1.谈谈你对oop的理解,oop有哪些特性?
各有什么特点?
Java的三大特征[中科软科技有限公司]
oop:
面向对象编程,oop有继承,多态,封装,抽象
继承:
子类可以拥有父类的属性以及方法,也可以拥有自己的属性以及方法。
多态:
父类的方法,子类有不同的实现方式
封装:
将现实生活中具体的事封装成一个类。
抽象:
使用private修饰属性和方法,对外提供公有的get和set方法
2、什么是方法重载和方法重写,有什么异同?
方法重载:
同一类中,同名不同参!
方法名相同,参数列表不相同(个数顺序),和访问修饰符返回值类型异常无关
方法重写:
子类重写父类,同名同参数!
方法名相同,参数列表相同,访问修饰符大于等于父类返回值和父类相关(基本数据类型等于)
异常是父类的子类或子集
3、抽象类和接口有什么异同?
(面试)
抽象类接口
抽象方法0-多个是
属性是静态不一定是
用途给类继承给类实现
构造方法产生子类对象初始化父类属性无
从语法角度上,接口是一种特殊的抽象类,但从设计角度理解而言是错误的
抽象类是父类的共同特征,是"中间产品",子类才是"最终产品"...是子类是"isa"的关系,既在概念上本质是一样的
接口表示一种约束和一种能力,是"hasacando"的关系.接口定义"做什么",实现类负责"怎么做",体现是功能和实现相分离的原则
4、异常有哪几种类型,怎么自定义异常?
RuntimeExceptionErrorCheckedException
继承Exception或子类
定义有参构造方法
在有异常的地方,throw异常
5、什么是多态?
使用多态的两个前提条件?
有哪两种表现形式和应用场合?
同一事物,有不同的表现形态...父类的方法,子类有不同的实现方式
前提:
继承重写
表现形式:
重载重写
应用场合:
方法形参方法返回类型
6、什么是内部类?
内部类有哪几种?
有什么优缺点?
类中定义类
成员内部类方法内部类静态嵌套类匿名内部类
优点:
a.减少参数传递
b.封装(隐藏内部实现方法和细节)
c.减少类文件
缺点:
a.增加语法的难度
b.使结构复杂化
7、什么是构造方法,有什么作用,如何调用本类和父类的构造方法?
和类同名,无返回类型
初始化父类属性
this(参数)
super(参数)
☆8、final、finally、finalize有什么异同?
[上海优觉]
final最终的修饰属性表示常量修改方法表示不能被重写修饰类不能被子类继承
finally异常中总会执行,除了System.exit(0)
finalize是Object类的一个方法,在垃圾收集器调用垃圾回收的此方法,会覆盖该方法提供的回收对象的其他资源
9、类和类之间有哪几种关系?
面向对象设计原则有哪些?
类和类之间的关系:
继承、实现、依赖、关联、聚合、组合
设计原则:
1.依赖倒置原则(面向接口编程)
2.迪米特法则(尽量减少类和类之间的依赖)
3.接口隔离原则(一个接口只一个规定)
4.聚合/组合原则(尽量使用聚合组合关系)
5.里氏替换原则(慎用继承)
6.开闭原则(对扩展开放对修改关闭)
7.单一职能原则(一个类只做一件事情)
10、String和StringBuffer、StringBuilder的区别?
[中软上海优觉]
同:
都是final类
异:
①String类是不可变字符串,可以像基本数据类型一样直接赋值(直接存放常量池),
StringBuffer、StringBuilder是可变字符串,只能通过new产生对象
②StringBuilder是线程不安全的,用在字符串缓冲区被单个线程使用的时候,建议优先采用该类,因为在大多数实现中,它比
StringBuffer要快。
11、如何区分运行时异常与检查异常,他们使用时有何区别?
[中软]
RuntimeException及其所有子类都属于运行时异常,在程序中可以不用处理,直接由jvm处理,
检查异常必须在程序中处理。
12、static,abstract可以修饰什么,有什么作用?
abstract可以和final共同修饰吗?
①static修饰变量、方法,在类加载的时候就会初始化,所有实例共享,可以用类名.属性、类名.方法名;
abstract修饰方法表示该方法没有具体实现,必须由其子类实现,修饰类表示该类为抽象类不能被实例化。
②他们不能共同修饰,因为abstract是代表抽象必须被实现,final代表终极的不能重写和继承。
13、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
值传递,因为他传递的是对象的地址值,在Java中只有值传递,没有引用传递。
14、java中有几种类型的流?
JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
java类型的流:
按功能分:
输入、输出流;
按内容分:
字节、字符流;
按形式分:
实体、装饰流
ReaderWriterOutputStreamInputStream
面试:
现场编码,用递归算法查找文件[上海普元]
publicstaticvoidshow(Filef){
if(f.isDirectory()){
File[]fs=f.listFiles();
for(Fileff:
fs){
//递归调用
show(ff);
}
}
Stringtype=f.isDirectory()?
"目录":
"文件";
System.out.println(type+":
\t"+f.getName());
}
15、java的IO里面使用了哪些经典设计模式,举例说明?
适配器模式InputStreamReader
装饰模式FilterInputStream
16、什么是java序列化,如何实现java序列化?
序列化就是将内存中的对象保存到硬盘或传输到网络中
先将需要序列化的类实现Serializable接口,然后通过ObjectOutputStream或XmlEncoder类的writeObject()方法实现t
XML
17、DOM解析和SAX解析各有什么特点?
(你在项目中用到了xml技术的哪些方面?
如何实现的?
)
DOM解析构建整个文档驻留内存的树。
如果文档很大,就会要求有极大的内存。
SAX是一个解析速度快并且占用内存少的xml解析器,是基于事件驱动来解析的,可以随时停止解析,不能载入整个文档到内存,不能写入xml
JDOM
DOM4J
xml的视图1>.通过Java代码实现自定义view添加到显示布局中
2>.通过在布局文件中添加标签
文档定义形式1>.dtd
2>.schema
数据存储(在做数据交换平台,将不同的数据的数据组成xml文件,然后将xml文件压缩打包加密,通过网络传送给接受这,接受解密与解压缩后同xml文件中还原相关的信息进行处理)
xml的作用
配置文件(将配置参数存储在xml中)
18、对反射的理解?
[中软德邦物流]
你怎么看待反射[上海福岚商贸有限公司]
A可以使用反射动态的创建类型的实例,将类型绑定到现有对象、或从现有对象获取类型
B应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便在实现某个任务时可以用到反射
19、如何理解代理模式,静态代理和动态代理及装饰模式有什么区别?
代理模式是为被代理的类扩充新的功能,具有控制被代理类的访问等性质
静态代理每增加一个被代理类型必须新建一个代理类,会造成类爆炸;
通过动态代理解决这种问题,动态代理通过Proxy['pr?
ks?
]类动态的产生代理对象从而可以代理任意类。
代理模式具有控制被代理类的访问等性质,而装饰模式仅仅是单纯的扩充被装饰的类,为所装饰的对象增强功能。
所以区别仅仅在是否对被代理/被装饰的类进行了控制而已。
集合问题:
Java集合类图
Java集合框架图
①ListSetMap是否继承Collection[笔试题]
List和set是,Map不是
②List、Map、Set三个接口,存取元素时,各有什么特点
List 有序,不唯一
Set 无序,唯一
Map 保存key-value值,value可多值。
③说出ArrayList,Vector,LinkedList的存储性能和特性?
[重点]
❶ArrayList和Vector都是使用数组方式存储数据,它们都允许直接按序号查询元素,但是插入元素要涉及数组元素移动等内存操作,
所以查询数据快而插入删除慢['vekt?
]Vector
❷Vector由于使用了synchronized方法,通常性能上较ArrayList差,
❸LinkedList使用双向链表实现存储,按序号查询数据需要前向或后向遍历,但是插入数据时只要记录前后项,所以插入删除较快。
☆④Collection和Collections的区别?
(笔试面试)
Collection是集合类的顶级接口,子接口有Set和List.
Collections是针对集合类的一个帮助类,它提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作
⑤Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
Java中是否有内存泄漏?
A.Set里的元素是不能重复的,用equals和hashCode方法来区分重复与否。
添加元素时先判断hashCode然后再判断equals。
B.垃圾回收机制只能回收没有引用的对象,在set集合添加了元素后又将计算hash值的属性修改了将导致内存泄漏。
单例对象在JVM的整个生命周期中存在,如果单例对象持有外部对象的引用,那么外部对象将不能被jvm回收,所以不正确使用单例也能引起内存泄露。
Set:
a)HashSet
hashCod每一个对象都有自己的hashCode值.和值有关
如果不重写hashCode方法,不同对象hashCode值不同
b)LinkedHashSet
内存无序,输出和添加顺序一致,不能放重复值
c)TreeSet
排序,不能放重复值
必须实现排序规则(自然排序,客户排序)
1>自然排序
集合.add(对象),对象实现排序规则
对象实现java.lang.Comparable接口
2>.客户排序
集合要添加的对象没有源代码,用第三方类实现
java.util.Comparator接口
List:
ArrayList动态数组(增删效率低,查找高,异步)
LinkedList链表(增删效率高,查找低)
Vector动态数组(线程同步,线程安全)
☆☆⑥HashTable和HashMap的区别?
都属于Map接口的类,实现了将惟一键映射到特定的值上。
HashMap类没有分类或者排序。
它允许一个null键和多个null值。
Hashtable类似于HashMap,但是不允许null键和null值。
它也比HashMap慢,因为它是同步的
HashMap和treeMap的区别?
(文思海辉)
HashMap:
底层是哈希表数据结构。
线程不同步;Map中插入、删除和定位元素,效率高
TreeMap:
底层是二叉树数据结构,线程不同步,可用于给Map集合中的键进行排序;查询效率高
⑦Iterator的作用(电话面试)
作用:
遍历集合
方法:
.hasNext()next()remove()
⑧集合排序
Collection.sort()
多线程问题:
①线程和进程的区别与联系:
[久雅科技有限公司]
线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。
不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间
每个线程都拥有单独的栈内存用来存储本地数据
②sleep()、yield()和wait()有什么区别?
1.wait()方法是Object的方法,sleep()是Thread的方法
2.wait()方法必须写在synchronized里面
3.wait()方法在等待的时候会释放对象锁,sleep()睡过去也抱着对象锁不放!
(重要)
4.yield()让当前正在执行的线程暂停,该方法不会阻塞线程,而是将线程转入可运行状态
③java中如何编写一个线程类,并启动他?
继承Java.lang.Thread类,并重写run()方法,调用该对象的start()方法启动线程
实现Java.lang.Runnable接口,并实现run()方法,将该对象实例作为Thread构造的参数再调用start()方法,使用了代理模式。
④如何实现线程之间的通信?
Java提供了3个方法解决线程之间的通信问题
wait():
表示线程一直等待,并释放对象锁,直到其它线程通知再找回对象锁
notify():
(唤醒一个同一个对象上处于等待状态的线程)
唤醒在此对象监视器上等待的单个线程。
['n?
?
t?
fa?
notifyAll():
唤醒同一个对象上所有调用wait()方法的线程,优先级别高的线程优先运行
唤醒在此对象监视器上等待的所有线程。
[
⑤多线程的状态[电话面试]
新建状态(就绪)->可执行状态(运行)->阻塞(可能)->死亡状态
⑥什么是线程安全,如何实现线程安全?
线程安全就是说多线程访问同一代码,不会产生不确定的结果。
编写线程安全的代码是低依靠线程同步
⑦☆启动一个线程是用run()还是用start()?
①什么时候使用Thread,什么时候使用Runable
②启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。
这并不意味着线程就会立即运行。
run()方法可以产生必须退出的标志来停止一个线程。
⑧如何避免死锁
1、在程序中尽量使用开放调用(方法本身没有加锁,对方法操作的内容进行加锁)
2、注意锁的顺序:
尽量减少潜在锁之间的交互数量,遵守并文档化该锁顺序协议
3、尝试定时的锁,来替代使用内部锁机制
26、同步和异步有何异同,在什么情况下分别使用他们?
同步就是当一个线程运行时其他线程不能访问该线程中锁定的对象,为保障数据完整而使用的方法,
而异步可以多个线程同时使用一个对象如果数据将在线程间共享。
例如正在写的数据可能被另一个
线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,
就应该使用异步编程,在采用异步往往更有效率。
☆27、java的网络编程有哪两种,他们之间有什么区别?
**简述Socket
TCP协议:
传输控制协议,提供可靠无差错的数据传输,资源消耗较大,性能和效率较低
UDP协议:
用户数据报协议,不可靠的数据传输,资源消耗小,性能和效率较高
28、描述一下JVM加载class文件的原理机制?
JVM中类的加载是由ClassLoader和它的子类来实现的,JavaClassLoader是一个重要的Java运行时系统组件。
它负责在运行时查找和装入类文件的类。
29、描述下类实例化的详细过程(顺序)?
1.父类静态成员和静态代码块,按在代码中出现的顺序依次执行
2.子类静态成员和静态代码块,按在代码中出现的顺序依次执行
3.父类实例成员
4.父类构造方法
5.子类实例成员
6.子类构造方法
其中1.2是在类加载的时候执行
30、请描述Object中有哪些方法及其作用?
clone()创建并返回此对象的一个副本。
equals(Objectobj)指示其他某个对象是否与此对象“相等”
finalize()当垃圾回收器确定不存在对该对象的更多引