当前位置: 首页 > Java培训 > JAVA面试题 > java面试题全集 中
java面试题全集 中 时间:2018-01-04     来源:java经典题库

Java面试题已经是在面试过程中不能够缺少的一个环节,也是双方互相了解的一个最为直接有效的一种方式,说白了面试就是公司对于面试者的技术储备,工作经验,等等各方面的一种考察,也是面试者对于公司各方面的进行一个简单的了解。

java面试题全集  中

虽然面试仅有短短的半个小时或一个小时,但是面试的好坏也决定着去留,因此在这里为了让大家能够在面试过程中能够有更多的选择机会,而不是让企业来选择我们,为大家整理了在面试过程中最为常见的部分面试题,供大家参考学习。

1 手写单例模式(饿汉和饱汉模式)和工厂模式?

(1)单例饿汉模式://饿汉式单例类.在类初始化时,已经自行实例化

2 public class Singleton1 {

3 //私有的默认构造子

4 private Singleton1() {}

5 //已经自行实例化

6 private static final Singleton1 single = new Singleton1();

7 //静态工厂方法

8 public static Singleton1 getInstance() {

9 return single;

10 }

11 }

(2)懒汉模式://懒汉式单例类.在第一次调用的时候实例化

2 public class Singleton2 {

3 //私有的默认构造子

4 private Singleton2() {}

5 //注意,这里没有final

6 private static Singleton2 single=null;

7 //静态工厂方法

8 public synchronized static Singleton2 getInstance() {

9 if (single == null) {

10 single = new Singleton2();

11 }

12 return single;

13 }

14 }

(3)工厂模式:

interface IFactory{

public IProduct createProduct();}

Class Factory implements IFactory{

public IProduct createProduct(){return new Product();}}

Public class client{

Public Static void main (String [] args){IFactory factory=new Factory();

IProduct product=factory.createProduct();

product.ProductMethod();}}

2. 手写创建list,定义list,泛型?

(1)List list=new ArrayList();

(2)List list=new ArrayList();

(3)Student s=new Student();

(4)List.add(s);

3. 安全:hassmap和hasstable的区别?那个不安全?为什么?怎么便利hashmap?线程方面:线程有几种状态?谈谈多线程的安全问题;问到线程和同步?写一个生产者和消费者模式; 考虑高并发的问题。

(1):区别:一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现;

(2)二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的

(3)三.值:只有HashMap可以让你将空值作为一个表的条目的key或value

(4)为什么?最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。

Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异

(5)遍历hashmap:两种方式,Map map=new HashMap();

Iterator iter=map.entrySet().iterator();s

Iterator iter=map.keySet().iterator();

(6)线程通常有五种状态,创建,就绪,运行,阻塞,和死亡;

第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态手写字符串反转和冒泡排序;

第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。

第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。

第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。

第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪

(7)多线程的安全问题:总结来说,多个线程在执行同一段代码的时候,每次的执行结果和单线程执行的结果都是一样的,不存在执行结果的二义性,就可以称作是线程安全的。线程安全问题多是由全局变量和静态变量引起的,当多个线程对共享数据只执行读操作,不执行写操作时,一般是线程安全的;当多个线程都执行写操作时,需要考虑线程同步来解决线程安全问题。

(8)线程和同步:说明Java线程的两个特性,可见性和有序性。多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变量来实现.

java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),

将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,

从而保证了该变量的唯一性和准确性

(9)生产者和消费者模式:存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。

(10)模式:1.wait()和notify();2.await()和signal(),即线程锁的方式;3.阻塞队列的方式;

(11)高并发:手段无非是切割(纵向,横向)和负载均衡。纵向分隔主要是按业务(功能)来分,也就是所谓面向服务架构,横向分隔方式比较多,主要依赖于所处理的对象属性负载均衡则可以是镜像(部署)分布(同样的功能部署几份)和计算分布(一个问题分几个子问题在不同的机器上运行,然后合并结果)。当然,这些手段是可以综合利用的,最终可以做成多流水线分布式计算模式;

4. list、map和set什时候用?彼此间的区别和联系?

(1)list列表是顺序存放对象的,可以有相同的对象,通过索引存取;一般在能直接使用数组的时候,就有使用列表

(2)set集合:集合是无序存放对象的,其中不能有重复的对象(唯一的,回忆高中时候数学中学习的集合特性),集合没有索引,只能遍历次存取;一般用于存放无序的(指顺序不重要)不能重复的对象

(3)Map映射:映射,存放的是键与值的映射,其中键是唯一的(不能有重复对象),而值可以有重复的对象,存的时候,需要指定键和对应的值,取的时候可以根据键名取到值,也可以遍历;一般在用于存放具有对应关系的键值对的时候用;

(4)三者的区别和联系:三者都是接口,List与Set具有相似性,它们都是单列元素的集合,list,set是继承自collection,而map不是,list里可以有重复元素,有先后顺手,Set里面不允许有重复的元素,而且无序,Map 保存key-value值,value可多值。

5. 说一下多态的表现形式?

(1)重载,重写,重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同

(2)重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法

6. 数据的加密模式?加密模式的顺序?

(1)对称式和非对称式,顺序:传输加密,数据存储加密,数据完整型的鉴别,密钥管理;

7. 问到hasshmap底层数据结构,arraylist-linklist区别和为什么有这样的区别;数组的比较方法;基本类型和引用数据类型的区别;问接口和抽象类的区别;

(1)HashMap是线程序不安全的,不是同步的

HashMap可以让你将空值作为一个表的条目的key或value

Hashmap实际上是一个数组和链表的结合体,在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,hashmap也不例外。Hashmap实际上是一个数组和链表的结合体.

(2)区别:ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构,对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针,.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据,若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批 量随机的插入删除数据,LinkedList的速度大大优于ArrayList. 因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。 这一点我做了实验。在分别有200000条“记录”的ArrayList和LinkedList的首位插入20000条数据,LinkedList耗时约 是ArrayList的20分之1。

8. 如何配置安装jdk?如何判断其配置成功?

(1)首先安装JDK要看你电脑的位数,选择32位或64位的jdk版本,建议使用1.6版本以上,1.7版本一下;

(2)从Oracle官网下载JDK安装包。

(3)安装包下载完成后,双击安装包进行安装,安装路径可以使用默认路径。

(4)安装完成后,还需要进行环境变量的配置,在系统环境变量的用户变量里面添加一个变量名为 JAVA_HOME环境变量,然后在变量值处填写上JDK安装目录的bin文件夹的路径,如:C:\ProgramFiles\Java \jdk1.7.0_79,然后再添加一个变量名为Path的变量,变量值填写为%JAVA_HOME%\bin;即可。

(5)可以写一个简单的java程序来测试JDK是否已安装成功:public class Test{public static void main(String args[]){System.out.println("This is a test program.");}}将上面的这段程序保存为文件名为Test.java的文件。(注意Test是程序的公共类,必须和文件名一致,包括大小写)然后打开命令提示符窗口,cd到你的Test.java所在目录,然后键入下面的命令:javac Test.java (回车)java Test 此时如果看到打印出来This is a test program.的话说明安装成功了,如果没有打印出这句话,你需要仔细检查一下你的配置情况。

9. java常见的数据类型是什么和对应的包装类是什么?java的隐式类型?assert什么时候使用?

(1)int, double, float, long, short, boolean, byte, char

(2)Integer.Double,Float,Long,Short,Boolean,Byte,Characher.

(3)java的隐式类型是int,byte,short,char都可以隐含转换为int ,

(4)一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的;

10. object类型中有哪些方法?

(1)equals()、hashCode()、wait()、toString(),finalize(),notify(),notifyAll(),wait(),

11. final、finallly和finalize的区别?

(1)final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

内部类要访问局部变量,局部变量必须定义成final类型,例如,一段代码……

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法

12. LinkedList和ArrayList的区别?继承的接口?

(1)ArrayList是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢

LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

LinkedList也是线程不安全的,LinkedList提供了一些方法,使得LinkedList可以被当作堆栈和队列来使用

(2)list接口;ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问; Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,接口中没有定义的方法 get,remove,insertList,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。LinkedList没有同步方法。如果 多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建 List时构造一个同步的List:

13. int和string是如何转化的?

(1)int i = Integer.parseInt([String]);i = Integer.parseInt([String],[int radix]);或者int i = Integer.valueOf(my_str).intValue();int转StringString s = String.valueOf(i);String s = Integer.toString(i);String s = "" + i;

15. 谈谈你对面向对象编程的理解?

(1)Java语言是纯粹的面向对象的程序设计语言,这主要表现为Java完全支持面向对象的三种基本特征:继承、封装和多态。Java语言完全以对象为中心,Java程序的最小程序单位是类,整个Java程序由一个一个的类组成;Java完全支持使用对象、类、继承、封装、消息等基本概念来进行程序设计,允许从现实世界中客观存在的事物(即对象)出发来构造软件系统,在系统构造中 尽可能运用人类的自然思维方式。实际上,这些优势是所有面向对象编程语言的共同特征。而面向对象的方式实际上由OOA(面向对象分析)、OOD(面向对象设计)和OOP(面向对象编程)三个部分有机组成,其中,OOA和OOD的结构需要使用一种方式来描述并记录,目前业界统一采用UML(统一建模语言)来 描述并记录OOA和OOD的结果。目前UML的最新版是2.0它一共包括13种类型的图形,使用这13种图形中的某些就可以很好地描述并记录软件分析、设计的结果

16. 重写和重载的区别?

(1)重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同);

(2)重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现;只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常;子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法;

17. sleep&wait区别和联系?

(1)这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类;sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。

(2)最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的 运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。 sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断;

18. string、stringbuffer和stringbuilder的区别?哪个更安全?为什么?hashmap为什么查询的比较快?

(1)JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。另外,String实现了equals方法;而StringBuffer没有实现equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为false。

(2)StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改;通过某些方法调用可以改变该序列的长度和内容,可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致;

(3)StringBuilder一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。(如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。但将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer。);

(4)HashMap是Hashtable的轻量级实现(非同步非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下,效率要高于Hashtable。

19. hashmap的数组是hashcode定位的,有很多key得到的hashcode是相同的,这时候如何定位?

(1)Java采用了哈希表的原理。哈希算法也称为散列算法,就是集合首先会调用该对象的hashcode方法;是将数据依特定算法直接指定到一个地址上。关于哈希算法,这里就不详细介绍。可以这样简单理解,hashCode方法实际上返回的就是对象存储位置的映像;hashcode相同但是对象并不同,所有存储位置也不同;对于List集合、数组而言,他就是一个累赘,不重要;但是对于HashMap、HashSet、HashTable而言,它变得异常重要。

20. string是否是基本数据类型?int和string是如何转化的?

(1)基本数据类型包括byte、int、char、long、float、double、boolean和short;java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类;

(2)int i = Integer.parseInt([String]);i = Integer.parseInt([String],[int radix]);或者int i = Integer.valueOf(my_str).intValue();int转StringString s = String.valueOf(i);String s = Integer.toString(i);String s = "" + i;

21. 谈谈对MVC的理解以及它的工作流程;

(1)MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务;

jsp+Servlet+JavaBean 就是一种基础的基于mvc的开发模式;在MVC结构中,模型(Model)代表应用程序的数据(data)和用于控制访问和修改这些数据的业务规则(business rule)。通常模型被用来作为对现实世界中一个处理过程的软件近似,当定义一个模型时,可以采用一般的简单的建模技术。

当模型发生改变时,它会通知视(View),并且为视提供查询模型相关状态的能力。同时,它也为控制器(Controller)提供访问封装在模型内部的应用程序功能的能力。

一个视(View)用来组织模型的内容。它从模型那里获得数据并指定这些数据如何表现。当模型变化时,视负责维持数据表现的一致性。视同时将用户要求告知控制器(Controller)。

控制器(Controller)定义了应用程序的行为;它负责对来自视的用户要求进行解释,并把这些要求映射成相应的行为,这些行为由模型负责实现。在独立运行的GUI客户端,用户要求可能是一些鼠标单击或是菜单选择操作。在一个Web应用程序中,它们的表现形式可能是一些来自客户端的GET或POST的HTTP请求。模型所实现的行为包括处理业务和修改模型的状态。根据用户要求和模型行为的结果,控制器选择一个视作为对用户请求的应答。通常一组相关功能集对应一个控制器。

工作流程:一个请求发送到action(作用:MVC中的C),action控制它发送到哪个biz处理,如果用到数据库,那么biz在连接dao,然后返回要的数据,最后action在返回响应的页面(比如jsp),因为是面向对象,所以实体domain在中间传递数据。

22. post和get以及get和load的区别?使用get应注意什么?

(1)Get 方法通过 URL 请求来传递用户的数据,将表单内各字段名称与其内容,以成对的字符串连接,以URL字串本身传递数据参数,在服务器端可以从'QUERY_STRING'这个变量中直接读取,效率较高,但缺乏安全性,也无法来处理复杂的数据(只能是字符串,比如在servlet/jsp中就无法处理发挥java的比如vector之类的功能,输的数据量非常小,一般限制在 2 KB 左右);

Post 方法通过 HTTP post 机制,将表单内各字段名称与其内容放置在 HTML 表头(header)内一起传送给服务器端交由 action 属性能所指的程序处理,该程序会通过标准输入(stdin)方式,将表单的数据读出并加以处理post方式:就传输方式讲参数会被打包在数据报中传输,从CONTENT_LENGTH这个环境变量中读取,便于传送较大一些的数据,同时因为不暴露数据在浏览器的地址栏中,安全性相对较高,但这样的处理效率会受到影响。接收的最大数据有限制,IIS 4 中为 80 KB 字节,IIS 5 中为 100 KB 字节

(1)建议:除非你肯定你提交的数据可以一次性提交,否则请尽量用 Post 方法;Get 方式提交数据,会带来安全问题;通过 Get 方式提交数据时,用户名和密码将出现在 URL 上;所以表单提交建议使用 Post 方法;Post 方法提交的表单页面常见的问题是,该页面如果刷新的时候,会弹出一个对话框;

(2)Get与load的区别:总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null;

23. java的九大内置对象和四大作用域;

(1)request 用户端请求,一次请求.此请求会包含来自GET/POST请求的参数

response 网页传回用户端的回应

pageContext 网页的属性是在这里管理

session 与请求有关的会话期

application servlet 正在执行的内容

out 用来传送回应的输出

config servlet的构架部件

page JSP网页本身

exception 针对错误网页,未捕捉的例外

四大作用域:page对象表示当前一个JSP页面,可以理解为一个对象本身,是代表与一个页面相关的对象和属性;一个页面由一个编译好的 Java servlet 类表示,

request是代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件(由于 forward 指令和 include 动作的关系);用户端请求

session是代表与用于某个 Web 客户机的一个用户体验相关的对象和属性。一个 Web 会话可以也经常会跨越多个客户机请求 与请求有关的会话期

application是代表与整个 Web 应用程序相关的对象和属性。这实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域 正在执行的内容

四 Ajax

1. js里面的button方法,提交的时候,如何将数据传递到数据库?

(1)单击button的时候,先执行客户端的javascript代码,将JavaScript里面的值赋值到form表单里,然后通过表单提交的方式将数据提交到后台,交给java方法处理,然后调用业务层和数据库交互;

2. Ajax与jquery区别?ajax和servelet生命周期?

(1)区别:Ajax是一门技术,它提供了异步更新的机制,使用客户端与服务器间交换数据而非整个页面文档,实现页面的局部更新。jQuery是一个框架,它对JS(JS是一门前端语言。)进行了封装,使其更方便使用。jQuery使得JS与Ajax的使用更方便

jsp负责客户端显示

servlet负责控制,转向等

(2)生命周期:Servlet 生命周期:Servlet 加载--->实例化--->服务--->销毁;

init():在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。

service():它是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法 就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在 HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。

destroy(): 仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。一个 Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。

Ajax:ajax负责客户端与服务器直接联系,而不用jsp提交表单。一般ajax与servlet联系,也可直接与javabean联系

前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司

Android培训

版权所有 ,京ICP备16055225号-5,京公海网安备11010802025203号