Java面试题整理(4-13更新)

整理一些Java面试题以供自己复习,随缘更新

ps:答案是结合网上的答案以及自己的理解整理而成,若有错误请指出,感激不尽!

一、Java基础

1.数组(array)和列表(arrayList)的区别?

​ 答:Array可以包含基本类型和对象类型,而ArrayList只能包含对象类型

​ Array的长度是固定的,而ArrayList是可以动态变化的

​ ArrayList提供了更多的方法特性,如addall(),removeall()等

在明确数据的大小的时候,使用array数组来处理会比较好,而在不确定数据大小或者需要动态修改的时候,可以使用列表来操作.

2.基本数据类型和对应的封装类型有什么区别?

​ 答:为了能将这些基本数据类型当成对象来操作,java引入了对应的包装类型

​ 例如int类型的a和Integer类型的b(假设都赋值3),他们俩是相等的,因为Java5开始引入了自动装箱和自动拆箱机制,使得他们之间可以互相转换,但是对于Integer c=new Integer(3),a和c就不相等了,因为他们没有引用同一个对象

3.如何进行字符串编码的转换?

​ 答:我们可以使用new String(str.getBytes(“目标编码格式”),“原编码格式”)来进行字符串编码的转换.

4.String和StringBuffer、StringBuilder的区别?

​ 答:String是java提供的一个final类,也就是说不能继承和修改这个类,如果我们对用String修饰的字符串进行操作,则每次操作都会生成一个新的对象.

​ StringBuffer和StringBuilder(java5提出)都可以对字符串进行修改而不会产生新的对象,这样就避免的空间的浪费现象.而StringBuffer是线程安全的,相对来说处理速度慢,StringBuilder则是线程不安全的,相对来说处理速度快.从底层来说,StringBuffer就是比StringBuilder多了一个Synchronized修饰符.

5.什么是值传递和引用传递?

​ 答:值传递是对于基本类型而言的,指在传递的时候传过去的是这个变量的一个副本,改变这个副本不会影响原变量.

​ 而引用传递是对于对象而言的,指传递该对象的一个地址副本,所以对引用的对象进行操作会同时影响原对象.

6.解释一下==和equals的区别

​ 答:对于对象来说,==比较的是两个对象的地址是否相同,而equals比较的是两个对象的内容.

​ 对于变量来说,==是比较两个对象的值是都相等,而equals比较的是两个变量是否是同一对象的引用.

7.线程的4种创建方式?

​ 答:1.继承Thread类

​ 2.实现runnable接口

​ 3.使用callable和Future创建

​ 4.使用线程池创建

8.简述单例模式以及懒汉式和饿汉式

​ 答:单例模式就是在这个类中只有一个实例存在.

​ 懒汉模式:只有在使用到的时候才会去创建,存在线程不安全的情况.

​ 饿汉模式:在实例初始化的时候就一讲创建好了,不会有线程安全问题,但是会浪费内存空间.

9.简述反射机制以及反射的用法

答:反射机制:在运行状态中,可以动态的获取类的所有属性和方法,可以动态调用对象的属性和方法.

​ 用法: 如forName 获取该类的对象

​ getName 获得类的完整路径

​ newInstance 创建类的实例

​ getField 获得某个公有的属性对象

​ getDeclaredField(String name) 获得某个属性对象(包括私有)

​ getConstructor 获得某个构造方法

10.简述重写和重载

答:重写是指子类在返回值 方法名 参数都不变的情况下对父类中的代码进行重写.
重载是指方法名相同,但参数不同的方法,对返回值没有要求.

11.抽象类和接口的区别?

​ 答:接口只能有抽象方法,而抽象类可以有抽象方法和非抽象方法.

​ 类只能继承一个抽象类,但是可以实现多个接口

​ 接口是不能被实例化的,抽象类虽然也不能被实例化但是他可以包含main函数从而被调用.

12.什么是泛型?

​ 泛型就是"参数化类型",例如我们需要定义一个指定类型的List,但是这个指定类型还不确定,这个时候我们就可以使用泛型,将类型定义成参数形式,然后在使用的过程中传入具体的类型.

13.List、Set、Map的区别以及底层原理?

​ 答:List:它的数据结构是有序可重复性的结合,这个结合的体系有索引,通过特定索引来存取元素,按存储顺序来存储,可以有重复元素

​ Set: 底层的数据结构是红黑树,一种高效的平衡检索二叉树,不能有重复元素,无顺序

​ Map:有自己的特殊数据结构,底层实现基础是数组和链表.利用Key-Value的形式来存储数据,键不能重复,重复存储会将原来的数据覆盖掉

14.ArrayList和LinkedList的区别

​ 答:ArrayList基于数组实现,默认长度是10,每次扩容1.5倍。读取操作效率高,不适合元素的插入和删除

​ LinkedList基于双向链表实现,没有初始化大小也没有扩容机制,每次新增就在头或者尾部添加。元素插入删除效率高,但是遍历效率低

15.HashMap的底层原理?

​ 答:HashMap底层的数据结构是一个"链表散列",是一个Entry数组,每一个Entry包含一个key-value键值对,在存储的过程中是通过hash算法来决定其在数组中的位置.

16.简述线程的5个状态

​ 答:新建状态:此时线程还没有运行,处于新建状态,还没有开始运行线程中的代码.

​ 就绪状态:调用了start()状态之后,线程进入了就绪状态,但此时还没有进入运行状态,等待CUP的调度.

​ 运行状态:当线程得到CPU时间片之后,进入运行状态,开始执行run方法.

​ 阻塞状态:在线程运行过程中,可能会因为各种原因陷入阻塞状态,但没有结束运行,而是暂时让出CPU.

​ 死亡状态:有两个原因,1是线程任务完成,正常结束,2是线程运行当中出现异常导致线程猝死.

17.简述线程池

​ 答:在实际编程中,线程的创建和销毁时很浪费时间的,所以我们会使用线程池的方式来创建线程.线程池顾名思义就是一个有很多线程(数量可以定义)的池子,当我们需要线程时,就到池子中拿,用完之后又放到池子里.由线程池来决定什么时候创建和销毁线程池,从而节约时间以及我们的工作量.

18.说说线程的wait()方法和sleep()方法的区别?

​ 答:主要区别在于sleep()方法没有释放锁并且没有释放资源,而wait方法释放了锁且释放了资源进入线程池等待.

19.Java中有哪些线程锁?有什么区别?

​ 答:1.公平锁和非公平锁

​ 公平锁:按照申请的顺序来获取锁

​ 非公平锁:线程不一定按照申请的顺序来获取锁

​ 2.共享锁和独享锁

​ 共享锁:一次能被多个线程访问

​ 独享锁:一次只能被一个线程访问

​ 例如ReadWriteLock 读锁是共享锁,写锁是独享锁

​ 3.乐观锁和悲观锁

​ 乐观锁:乐观的认为每次并发操作不会修改数据,所以不上锁,但是在更新的时候会判断在此期间是否有人更 新了这个数据.

​ 悲观锁:悲观的认为每次并发操作都会修改数据,所以不管是读操作还是写操作,都会加锁.

​ 4.自旋锁

​ 自旋锁是指线程在获取锁失败之后不会立即进入阻塞状态,而是采用循环的方式去尝试获取锁.

​ 5.可重入锁

​ 又叫做递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁,不会因 为之前已经获取过还没释放而陷入阻塞.

20.什么是死锁?

​ 答:两个或两个以上的线程都在等待对方执行完毕才能继续往下执行的时候就会发生死锁.简单来说就是A等着B,B等着A,结果就是两个线程无限制的等待下去.

21.&和&&的区别?

​ 答:&为位运算符,&&为逻辑运算符,区别在于&是两边都为true时,才会返回true,&&是一边为false,则结果为false。&&具有短路功能,若第一个表达式为false,则不会再计算第二个表达式。

22.说说JAVA对象的四种引用

​ 答:强引用:是最普遍的一个引用,这种引用GC绝对不会回收他,当内存不足时,java虚拟机宁愿抛出异常也不会回收这个对象来释放内存

​ 软引用:在内存空间足够的情况下,GC不会回收他,但是一旦内存不足, 他就会被GC回收。

​ 弱引用:强度比软引用弱,GC在第一次扫描到的时候会标记,第二次扫描 到就会回收。

​ 虚引用:表示对象处在一个无用的状态,在任何时候都可能被GC回收。

23.说说JAVA基本数据之间的类型转换

​ 答:自动(隐式)转换:从小类型转换到大类型,不需要强制转换符

​ 强制类型转换:从大类型转换到小类型,需要强转转换符

24.说说字节流与字符流之间的区别:

​ 答:1.读写单位不同:字节流是以字节为单位,字符流是以字符为单位

​ 2.处理对象不用:字节流可以处理所有类型的数据,字符流只能处理字符类型的数据

​ 3.处理方式不同:字节流直接操作文件本身,字符流操作时使用了缓冲区,通过缓冲区操作文件。

25.说说对象的序列化和反序列化

​ 答:序列化是将对象的状态信息转换为可以存储或传输的字节序列的过程,而反序列化就是将字节序列恢复为对象的过程。

26.什么是工厂模式?

​ 答:工厂模式是JAVA中最常用的设计模式之一。这种模式的设计属于创建型模式,在创建对象的时候不会向客户端直接暴露创建逻辑,而是通过一个共同的接口来指向新创建的对象,就比如你需要一辆汽车,你可以直接去工厂里提车而不用关心这辆车是怎么创建出来的。

27.说说JDBC的连接步骤

​ 答:1.加载驱动程序

​ 2.创建连接

​ 3.创建Statement对象

​ 4.执行sql语句

​ 5.处理结果

​ 6.关闭连接

28.什么是MyBatis?有什么优缺点?

​ 答:MyBatis是一个半ORM(对象关系映射)的框架,内部封装了JDBC.

​ 优点是使用MyBatis时我们只需要去关注sql语句本身,而不必花费精力去处理加载驱动创建连接等繁杂的过程,解除sql和代码的耦合,还可以编写动态sql,可重用性高.

​ 缺点:sql语句编写工作量大,对sql功底有很大的要求.sql语句依赖于数据库,导致数据库移植性差,不能随意更换数据库.

29.说说Spring MVC五大核心组件

​ 答:DispatcherServlet(前端处理器)

​ HandlerMapping(请求派发)

​ Controller(控制器)

​ ModelAndView(封装模型信息和视图信息)

​ ViewResolver(视图处理器)

​ 工作流程:DispatcherServlet(前端处理器)收到请求后,根据HandlerMapping的配置,调用相应的控制器来处理,控制器将处理的结果封装成ModelAndView对象,返回给DispatcherServlet,根据ViewResolver的解析,调用相应的视图对象来生成相应的页面.

30.loombook是什么?

​ loombook是一个通过注解形式来帮助我们简化一些臃肿但是必须有的代码的工具,例如get、set、toString等方法。

31.什么是Spring?

​ 答:Spring是一个轻量级开源框架,主要用来开发JAVA应用,目标是简化java企业级应用开发,并通过以POJO为基础的编程模型促进良好的编程习惯.

32.什么是IOC和DI?

​ 答:IOC是控制反转,所谓的"控制反转"就是将对象的控制权由代码转移给容器,由容器来创建和管理对象之间的依赖关系.

​ DI叫依赖注入,他的基本原则是应用组件不应该负责查找资源等工作,将这些工作都交给容器来管理.DI是对IOC更准确的描述,即组件之间的依赖关系由容器在运行期决定,也就是说,由容器动态的将依赖关系注入到组件之中.

33.介绍几个Spring中常用的注解

​ 答:1.@AutoWried 自动导入依赖的bean,默认按照类型匹配,在容器中查找匹配的Bean,当且仅当只有一个匹配的Bean时,Spring会将其注入标注的变量中.

​ 2.@Controller 用于标注控制层组件,告诉容器这是一个控制器类,配合RequstMapping可以定义URL请求和Controller之间的映射.

​ 3.@RequstMapping 用来处理请求地址映射的注解,可以用于类或方法上.

​ 4.@Service 用于标注业务层组件(暂时没有找到好的解释,先空着)

​ 5.@PathVariable 用于将请求URL中的变量映射到功能处理方法的参数上,也就是取出URL中的变量做为参数使用.

34.什么是AOP?

​ 答:AOP是Spring提供的关键特性之一,叫面向切面编程,思想是在运行时,动态的将代码切入到类的指定方法或指定位置上.使用AOP技术,可以将一些系统相关的编程工作提取出来,独立实现,然后通过切面切入系统中,比如权限管理、事务管理、日志管理等模块,就合适用AOP来实现。

35.说说Servlet的生命周期?

​ 答:Servlet被服务器实例化之后,容器运行init()方法,请求达到的时候运行service()方法,Service()方法自动派遣与请求对应的doGet()/doPost方法,当服务器决定销毁的时候调用destory()方法.

36.简述一下转发(forward)和重定向(redirect)的区别

​ 答:转发:由服务端进行的页面跳转,只发出一次请求,地址栏不会变化,数据共享.而且只能跳转到本站点资源.

​ 重定向:由客户端进行的页面跳转.发送两次请求,地址栏会变化,数据不共享,可以跳转到任意的URL.

37.说说Cookie和Session的区别

​ 答:cookie是存放在客户的浏览器上的缓存数据,别人可以分析cookie并进行cookie欺骗.单个cookie保存的数据不能超过4k.

​ Session是存放在服务端的缓存数据,别人不能轻易获取到.

​ 对安全系数要求高应该用Session,对性能要求高应该用cookie.

38.谈谈JDBC中的事务处理

​ 答:事务处理就是操作一系类数据的时候,要么同时成功,要么全都失败.举个栗子,我向你转账100元,转账的过程中执行了两个操作:从我的卡里扣除100元,给你的账户增加100元.如果在增加100元的过程失败了,那就应该把我的100元还给我,这就叫事务的回滚.如果不用事务处理,就不能保证数据的一致性.

39.简述AOP中的5个通知

​ 答:befor:前置通知,在一个方法执行之前调用

​ after:在方法执行之后执行,无论方法是否执行成功

​ returning:仅当方法执行成功之后通知

​ throwing:当方法抛出异常的时候执行

​ around:环绕通知,在方法执行之前和之后调用的通知

40.什么是切点?

​ 答:切点是一个或一组连接点,通知将在这些位置执行,可以通过表达式或匹配的方式指明切入点.

41.char 型变量中能不能存贮一个中文汉字,为什么?

​ 答:能.因为java使用的是Unicode编码,一个char类型占两个字节(16bit),而一个汉字也是占两字节,所以char类型可以存储一个中文汉字.

42.swtich 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?

​ 答:在java 5以前,switch只能是byte、short、char、int类型,java 5以后加入了枚举类型,java7以后加入了字符串类型,但到目前为止,是不能作用于long类型的.

43.Java 中会存在内存泄漏吗,请简单描述。

​ 答:理论上来说,因为java有内存回收机制(GC)是不会发生内存泄漏的,但是在实际开发中,可能会存在无用但可达的对象,这种对象不会被GC回收,因此会导致内存泄漏的发生.例如Hibernate的Session(一级缓存)中的对象属于持久态,GC是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭或者清空,就会出现内存泄漏的情况.

44.Java中通知GC回收垃圾的方法

​ 答:System.gc和RunTime.gc两种方式.

45.说几个JavaScript常用的方法

​ 答:alert(); 普通弹出框

​ document.write(); 向页面(body标签) 写入内容

​ console.log(); 向控制台输出

​ typeof();查看当前数据类型

​ length 返回字符串的长度

​ document.getElementById() ; 通过设置的ID获取 返回一个对象

46.什么是Redis?

​ 答:Redis是一个开源的 支持网络 基于内存\可选持久性的键值对存储数据库.他将数据存储在内存中,可以很高效率的来存取数据.

47.Redis如何进行数据持久化?

​ 答:由于Redis是讲数据存储在内存中,所以重启之后数据丢失,所以Redis用RDB和AOF来进行数据的持久化.

​ RDB(全量模式)持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。

​ AOF(增量模式)持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。

48.什么是Zookeeper,有什么功能?

​ 答:zookeeper 是一个分布式的,开放源码的分布式应用程序协调服务,功能有

1.集群管理:监控节点存活状态、运行请求等。

2.主节点选举:主节点挂掉了之后可以从备用的节点开始新一轮选主,主节点选举说的就是这个选举的过程,使用 zookeeper 可以协助完成这个过程。

3.命名服务:在分布式系统中,通过使用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息。

4.分布式锁:zookeeper 提供两种锁:独占锁、共享锁。独占锁即一次只能有一个线程使用资源,共享锁是读锁共享,读写互斥,即可以有多线线程同时读同一个资源,如果要使用写锁也只能有一个线程使用。zookeeper可以对分布式锁进行控制。

49.什么是缓存穿透?

​ 答:缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。

50. 什么是缓存雪崩?

​ 答:缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

51.什么是内部类和匿名内部类?

​ 答:内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限)。内部类主要有以下几类:成员内部类、局部内部类、静态内部类、匿名内部类

​ 匿名内部类:是内部类的简化写法。没有类名,只能使用一次.它的本质是一个带具体实现的父类或者父接口的匿名的子类对象。

52.JVM分为哪些区,每一个区干嘛的?

1)方法区(method):被所有的线程共享。方法区包含所有的类信息和静态变量。

2)堆(heap):被所有的线程共享,存放对象实例以及数组,Java堆是GC的主要区域。

3)栈(stack):每个线程包含一个栈区,栈中保存一些局部变量等。

4)程序计数器:是当前线程执行的字节码的行指示器。

53.MySql常用优化方式?

​ 答:SQL优化、表机构优化、索引优化、缓存参数优化.

54.Collection和Collections的区别?

​ 答:Collection是一个接口,它是Set、List等容器的父接口;Collections是个一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等。

55.说说Servlet的生命周期

​ 答:类加载、实例化(构造对象),初始化(init),服务(service),销毁(destroy)。

你可能感兴趣的:(笔记,Java,面试,java,软件框架)