面试题目自答

一、Java 基础

1.JDK 和 JRE 有什么区别?
Jdk包含jre,jre是java的运行环境。
对于普通用户来讲,只需要下载jre就可以运行java程序,对于程序员来讲,则必须jdk才可以进行对程序的编写,修改,测试等操作。

2.== 和 equals 的区别是什么?
”比较的内容如果是基本数据类型,则直接比较内容是否相等。相等则返回true,不相等返回false。
如果比较的是对象,则比较两个对象的地址是否相等,相等则返回true。
equals是超类Object()中的方法,对于未重写equals方法的类型来说,比较的仍然是地址,此时与“
”的比较是一样的。对于重写了equals方法的类型,比如,String,Interger,Data来说,则是按照重写的equals方法的规则进行比较。

3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
不对
如果两个对象的hashCode()相同,equals()不一定返回true。
但是equals()返回的是true,那么两个对象的hashcode一定相同。

4.final 在 java 中有什么作用?
final可以修饰类,方法,属性
修饰类则说明该类不可继承
修饰方法则说明该方法不可被重写
修饰属性则说明该属性在初始化之后,值不可更改,也就是说该属性是一个常量。

5.java 中的 Math.round(-1.5) 等于多少?
-1
round方法的规则是在参数的基础上加0.5,然后向下取整。

6.String 属于基础的数据类型吗?
不属于
基本数据类型共8种:boolean,byte,int,char,short,long,float,double

7.java 中操作字符串都有哪些类?它们之间有什么区别?

8.String str="i"与 String str=new String(“i”)一样吗?
不一样,前者是属性,放入栈内存中,后者是对象,放入堆内存中。

9.如何将字符串反转?
String.reverse()

10.String 类的常用方法都有那些?

11.抽象类必须要有抽象方法吗?
不一定
抽象类可以有普通方法,也可以有抽象方法

12.普通类和抽象类有哪些区别?
普通类中可以只可以有普通方法,不可以有抽象方法
抽象类中可以有抽象方法,也可以有普通方法。
一个类中只要有一个抽象方法,那么该类必须由abstract修饰,既该类是一个抽象类

13.抽象类能使用 final 修饰吗?
不能
抽象类中的抽象方法必须由子类重写
如果用final修饰,那么该类无法被继承

14.接口和抽象类有什么区别?
接口只能被实现,抽象类只能由子类继承
接口只能做方法声明,抽象类中既可以做方法声明也可以做方法实现
抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。

15.java 中 IO 流分为几种?
按照数据流向:输入流、输出流
按照数据类型:字符流,字节流
ouputStream/inputStream
read/write

16.BIO、NIO、AIO 有什么区别?

17.Files的常用方法都有哪些?
createFile()
creatDirectory()
delete()
exists()
copy()
move()
size()
write()
read()
isDire()

二、容器

18.java 容器都有哪些?
Collection和Map
list和set都实现了Collection接口
List:ArrayList、linkedlist //有序不可重复列表
set:hashset,linkedset //无序不可重复
Map:hashmap,hashtable,treemap

19.Collection 和 Collections 有什么区别?
Collection是一个接口,有很多实现,比如List,set
collections是一个类,里面包含了很多对于集合进行操作的方法。

20.List、Set、Map 之间的区别是什么?
List和Set都继承了Collection接口
List存放的是有序的可重复的数据
Set存放的是无序的不可重复的数据
Map是以键值对的形式存放数据,key不可重复

21.HashMap 和 Hashtable 有什么区别?
Hashmap可以存放null,如果hashmap<key,value>中key和value的值都为null,那么它将会被存放在hash表的表头,但是hashmap是线程不安全的,如果要保证线程安全,可以使用concurrentHaspmap。
Hashtable不可以存放null,但它是线程安全的。HashTable在新版本的jdk中已经被废弃。

22.如何决定使用 HashMap 还是 TreeMap?
TreeMap和HashMap都是基于hash表实现的
HashMap里key值的实现是基于Java.Lang.Comparable,迭代的时候默认按照key值升序排列
TreeMap里key值的实现是基于hashcode(),分布是散列的,均匀的,不支持排序
所以查询的时候使用HashMap
增加、快速创建的时候使用TreeMap

23.说一下 HashMap 的实现原理?
基于hash算法实现
通过put()方法存储数据
get()方法取出数据

24.说一下 HashSet 的实现原理?
基于HashMap实现
相关操作基本都是直接调用hashmap的相关方法

25.ArrayList 和 LinkedList 的区别是什么?
ArrayList存储有序可重复的数据 查询较快
LinkedList存储无序不可重复的数据 增加、删除较快

26.如何实现数组和 List 之间的转换?
List转数组:toArray(arraylist.size())方法
数组转List:Arrays的asList(a)方法

27.ArrayList 和 Vector 的区别是什么?
ArrayList是基于数组实现的,长度不足时自动扩容,但是扩容需要数组的复制,移动,所以它适合随机查找和遍历,不适合增加删除
Vector也是基于数组实现的,但是它线程同步,实现同步的花费是比较大的,所以相对而言比较慢。

28.Array 和 ArrayList 有何区别?
Array长度固定,不会扩容,只能存储相同数据类型的数据
ArrayList长度是不固定的,可以不指定,当长度不足时会自动扩容,可以存储不同数据结构的数据

29.在 Queue 中 poll()和 remove()有什么区别?

30.哪些集合类是线程安全的?
Hashtable,Vector,Stack
java.until.concurrent下的所有集合类:比如ConcurrentHashMap。。。。

31.迭代器 Iterator 是什么?
为了取出集合中的元素,Java语言提供的一个对象,该对象中包含了许多对于集合进行操作的方法。

32.Iterator 怎么使用?有什么特点?
通过Itearator()方法获取Itearator对象。
然后可以通过hasnext()方法,判断下一个元素是否存在。
不能通过new来获取对象,它是通过内部类的形式存放在集合类的内部。

33.Iterator 和 ListIterator 有什么区别?
Itearator,仅用于对集合的遍历,只能单向移动。但是可以对所有的集合进行遍历。
ListItearaor可以双向遍历,也可以对List进行增删改查的操作,但是仅能用于List及其子类。

34.怎么确保一个集合不能被修改?
通过Collections类中的unmodifiableMap、unmodifiableList、unmodifiableSet来确保集合不被修改。

三、多线程

35.并行和并发有什么区别?
并行是指不同实体上的多个事件在同一时刻发生。
并发是指同一实体在同一时间间隔内发生多个事件。

36.线程和进程的区别?
进程是资源分配的最小单位,线程是程序执行的最小单位。
一个进程可以包含多个线程。

37.守护线程是什么?
Java分为两种线程:用户线程和守护线程
守护线程是为了服务其他线程而存在的。
如果没有守护线程的存在,那么当主线程运行结束的时候,jvm也不会停止运行。

38.创建线程有哪几种方式?
三种方式:
1:继承Thread类,不可抛异常,无返回值
2:实现Runable接口,不可抛异常,无返回值
3:callable接口,可以抛异常,可以有返回值

39.说一下 runnable 和 callable 有什么区别?
runable不可以抛出异常,无返回值
callable可以抛出异常,可以有返回值

40.线程有哪些状态?
就绪:获得cpu资源后,可以立即运行
运行:正在运行的线程
阻塞:因等待某一事件而暂时不运行的线程,即使获得了cpu资源,也不会运行,直到事件发生。

41.sleep() 和 wait() 有什么区别?
sleep来自于Thread类,wait来自于Object类
sleep没有释放锁,wait方法释放了锁
sleep只能在同步控制方法中使用,wait可以在在任何地方使用。

42.notify()和 notifyAll()有什么区别?
notify()方法执行后,只会有一个线程进入锁池中,等待锁竞争
notifyall()方法执行后,将会唤醒所有在等待池中线程,将他们移入锁池,等待锁竞争

43.线程的 run()和 start()有什么区别?
单独调用run()方法,是同步执行。(必须等线程执行完后,才能执行主线程)
通过start()方法,则是异步执行。(不必等待副线程执行完,就可以继续执行)

44.创建线程池有哪几种方式?

45.线程池都有哪些状态?

46.线程池中 submit()和 execute()方法有什么区别?

47.在 java 程序中怎么保证多线程的运行安全?

48.多线程锁的升级原理是什么?

49.什么是死锁?
死锁是两个或多个进程由于资源竞争或彼此通信而造成的一种阻塞现象。

50.怎么防止死锁?
尽可能避免四大死锁产生的必要条件:
1:互斥使用
2:不可抢占
3:请求和保持
4:循环等待

51.ThreadLocal 是什么?有哪些使用场景?

52.说一下 synchronized 底层实现原理?

53.synchronized 和 volatile 的区别是什么?

54.synchronized 和 Lock 有什么区别?

55.synchronized 和 ReentrantLock 区别是什么?

56.说一下 atomic 的原理?

六、Java Web

64.jsp 和 servlet 有什么区别?
简单来说,在mvc架构下,jsp更适合页面显示,servlet更适合逻辑控制。
servlet没有内置对象,jsp有9个内置对象,这些对象都只能同HttpServlet,HttpServletResponse,HttpServletRequest来获取,比如:page,pageContext,request,response等等
jsp本质上来说就是简单的servlet,在请求时,程序会判断是否是第一次请求该jsp,如果是第一次,则直接将编译好的servlet类返回给请求。如果不是第一次或者是第一次但已经进行了修改,则会将该jsp重新编译,然后转发给请求。

65.jsp 有哪些内置对象?作用分别是什么?
request 用户端请求,此请求会包含来自GET/POST请求的参数
response 网页传回用户端的回应
pageContext 网页的属性是在这里管理
session 与请求有关的会话期
application servlet 正在执行的内容
out 用来传送回应的输出
config servlet的构架部件
page JSP网页本身
exception 针对错误网页,未捕捉的例外

request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header,和session数据的有用的方法。
response表示HttpServletResponse对象,并提供了几个用于设置送回浏览器的响应的方法(如cookies,头信息等)
out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。
pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。
session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息
applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。
page表示从该页面产生的一个servlet实例

66.说一下 jsp 的 4 种作用域?
application 作用域 作用于整个应用程序
session作用域 作用于当前会话
request作用域 作用于当前请求(forward有效,redirect无效)
page作用域 作用于当前页面

67.session 和 cookie 有什么区别?
session存储在服务器,cookie以文本文件的格式存储在浏览器
cookie限制了存储量,4kb,所以不能存储过多的数据
session是无限量的
cookie可以较轻松的访问,但是访问session较为麻烦,所以它也更安全
设置cookie时间可以使cookie过期
使用session.destroy可以销毁会话

68.说一下 session 的工作原理?
因为http协议是无状态的,所以为了避免服务器不知道用户是谁,或者用户做了什么动作,就可以使用session来解决这个问题。
session会给每个访问者创建一个唯一的id:session_id,然后会将这个id返回给浏览器,存储在cookie中,每次请求的时候都会带上这个id,这样服务器就可以判断请求来自于谁。

69.如果客户端禁止 cookie 能实现 session 还能用吗?
不能,因为session本质上还是cookie,只是它存储在服务器,session_id也需要存储在cookie上,所以浏览器禁止cookie 的话,session也就不能用了

70.spring mvc 和 struts 的区别是什么?
底层实现:
springmvc基于servlet实现,struts基于Filter实现
拦截方式:
springmvc是方法级别的拦截,一个方法对应一个request上下文,独享request,response,而每一个方法又对应一个url,参数的传递是直接注入到方法中,所以也更为安全。
struts是类级别的拦截,每次请求都会创建一个action,一个action对应一个request,response上下文,在接受参数时,可以通过属性接收,这也说明其属性是多个方法共享的,所以只能设计为单例。
性能方面:
struts每次请求都会创建一个新的action,需要加载所有的属性值注入,而springmvc实现了零配置,由于其基于方法级别的拦截,所以可以单例模式bean注入。
因此,springmvc的开发效率和性能都高于struts。

71.如何避免 sql 注入?
校验参数的数据格式是否合法,一般可以使用正则表达式
预编译sql语句,比如java的preparedstament,参数化查询方式,避免sql语句的拼接
对进入数据库的特殊字符进行转义,或者是编码处理

72.什么是 XSS 攻击,如何避免?

73.什么是 CSRF 攻击,如何避免?

七、异常

74.throw 和 throws 的区别?
throw出现在方法体内,throws出现在方法体头部
throws表示有可能抛出异常,throw则表明只要执行了throw语句,则一定会抛出异常
两者都是异常的消极处理方式,只是可能或会抛出异常,两着都不会对异常进行处理,而是交由上层进行异常的处理。
在编程过程中,如果方法体内出现了throw语句,那么最好在方法体头部使用throws抛出异常,然后由上层来处理异常。

75.final、finally、finalize 有什么区别?
final用来修饰类(类不可被继承),方法(方法不可以被重写),属性(该属性在初始化后不可被修改,即该属性是一个常量)
finally是try{}catch{}finally{}语句中的关键词,表示该代码块一般情况下一定会执行,特殊情况:比如对应的try没有被执行,try代码块执行过程中,关闭了虚拟机,try代码块执行过程中被interrupted或killed等等。
finalize是Object中的方法,调用此方法则表明该对象即将被回收内存空间,finalize只会在对象内存被回收前调用一次,它的调用具有不确定性,只保证方法会被调用,但是不保证方法内的任务会被执行完。

76.try-catch-finally 中哪个部分可以省略?
finally

77.try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
会,由于finally的用法特殊,一定会被执行,所以catch中的return不会被执行,而是执行finally中的return。

78.常见的异常类有哪些?
throwable是所有异常类的根类,包含了error和Expection
常见的异常类:java.lang.NullPointExpection 空指针异常
java.lang.ClassNotFoundExpection 指定类不存在
java.lang.ArrayIndexOutOfBoundExpection 数组下标越界
等等

九、设计模式

88.说一下你熟悉的设计模式?

  • 工厂模式:工厂类可以根据条件生成不同的子类实例,这些子类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作(多态方法)。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。

  • 代理模式:给一个对象提供一个代理对象,并由代理对象控制原对象的引用。实际开发中,按照使用目的的不同,代理可以分为:远程代理、虚拟代理、保护代理、Cache代理、防火墙代理、同步化代理、智能引用代理。

  • 适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起使用的类能够一起工作。

  • 模板方法模式:提供一个抽象类,将部分逻辑以具体方法或构造器的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法(多态实现),从而实现不同的业务逻辑。

十、Spring/Spring MVC

90.为什么要使用 spring?
spring提供了一个容器/工厂,在我们需要对象时,不需要我们自己去实例化,spring会根据配置自动的创建bean,然后通过IOC自动注入到对象中。解耦模块,降低模块间的耦合性,在修改代码时,不需要进行过多的修改就可以达到我们想要的效果。

91.解释一下什么是 aop?
aop是spring提供的关键特性之一,它可以动态的将代码切入到类的指定方法、指定位置上。
这种编程思想就是面向切面编程。
使用aop,我们可以将一些关联多个类的行为提取出来,在需要的时候,动态的切入相应位置,减少代码量。

92.解释一下什么是 ioc?
控制反转,程序本身不再维护bean和bean之间的关系,而将这种权利转移给spring容器。
一般可以认为IOC和DI(依赖注入)是一样的,因为在applicationContext.xml中,bean和bean之间通过ref维护的时候,是相互依赖的。

93.spring 有哪些主要模块?
spring core 最基础部分,提供ioc,管理bean。
spring aop 提供了符合规范的面向切面编程的实现
spring web 提供了基础的web开发的上下文
spring web mvc 提供了web应用的Model-View-Controller的全部实现
spring Dao 提供了JDBC的抽象层
spring Context 基于bean,提供上下文信息
spring ORM 提供了常用的“对象/关系 ”的集成层,包括Hibernate,Mybatis等

94.spring 常用的注入方式有哪些?
构造方法注入
setter方法注入
基于注解的注入

95.spring 中的 bean 是线程安全的吗?
spring中bean本身是不具备线程安全的特性的。
但是具体要结合scope来看,对于原型bean来说,由于每次都会创建一个新对象,线程之间不存在bean共享的问题,所以不会有线程安全的问题。
对于单例bean来说,所有线程之间共享一个bean,所以存在资源竞争的问题。
如果这个该单例bean是一个无状态bean,那么该线程是安全的。
对于有状态的bean,其本身是线程不安全的,对于spring官方提供的bean,一般都提供了ThreadLocal来解决线程安全问题。

96.spring 支持几种 bean 的作用域?
当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。Spring支持如下5种作用域:
singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例
prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例
request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效
session:对于每次HTTP Session,使用session定义的Bean都会产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效
globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效

97.spring 自动装配 bean 有哪些方式?
spring中自动装配bean的方式由《bean》节点的autowire属性控制。
no:不进行自动装配,一般通过ref来手动设置。
byName:根据名字进行装配
byType:根据类型进行装配
constructor:类似于byType,但是仅仅适用于有构造器相同参数的bean,否则会抛出异常。
autodetect:自动使用构造器或类型装配。
如果查找到具有与构造器相同参数的bean,则自动装配。
否则按照byType,根据类型装配。

98.spring 事务实现方式有哪些?
编程式事务管理:需要手动编写代码,较少使用
声明式事务管理:
1:基于TransactionProxyFactoryBean的方式,需要为每个进行事务管理的类做相应配置
2:基于AspectJ的XML方式,不需要改动类,在XML文件中配置好即可
3:基于注解的方式,配置简单,需要在业务层类中添加注解
附注;
@Transactional注解中的属性:
propagation :事务的传播行为
isolation:事务的传播级别
readonly:只读
rollerbackfor:发生哪些异常回滚
norollerbackfor:发生哪些异常不回滚
rollbackforclassname:根据类的名字进行回滚

99.说一下 spring 的事务隔离?
ISOLOCATION_DEFAULT:默认隔离级别

ISOLOCATION_READ_UNCOMMITED :最低隔离级别,允许另一个事务查看该事物还未提交的数据,该隔离级别会产生脏读,不可重复度,幻觉读.
ISOLATION_READ_COMMITED:保证一个事务修改的数据提交后,才能被另一个事务读取。
ISOLATION_REPEATABLE_READ:该隔离级别防止了脏读,不可重复读,但是有可能出现幻觉读。
ISOLATION_SERIALIZABLE :这是代价最高但是最可靠的隔离级别,事务被处理为顺序执行。避免了脏读,重复读,幻觉读。

100.说一下 spring mvc 运行流程?
DispatcherServlet捕获用户发送的请求,交给HandlerMapping适配器映射器。
HandlerMapping根据请求找到相应的HandleAdapter(拦截器或Controller)
handlerAdapter根据代码完成一些操作,然后返回一个ModelAndView对象。
ViewResolver根据ModelAndView中设置的view来解析视图
然后再讲Model模型中的数据渲染到view视图上。

101.spring mvc 有哪些组件?
DispatcherServlet
HandlerMapping
HandlerAdapter
ViewResolver
HandlerExpectionResolver
等等

102.@RequestMapping 的作用是什么?
它是一个处理请求映射路径的注解,可以放在类或者方法上
放在类上,表示类中所有响应请求的方法都以该路径作为父路径
该注解常用属性:
1.value, method
value:指定请求的实际地址,指定的地址可以是URI Template模式。
method:指定请求的method类型,GET、POST、PUT、DELETE等。
2.consumes, produces
consumes:指定处理请求的提交内容类型(Content-Type),例如application/json,text/html。
produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回。
3.params, headers
params:指定request中必须包含某些参数值才让该方法处理。
headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。

103.@Autowired 的作用是什么?
可以对类成员变量、方法及构造函数进行标注,用于bean的自动装配,默认按照类去匹配,配合 @Qualifier 指定按照名称去装配 bean。

十一、Spring Boot/Spring Cloud

104.什么是 spring boot?
springboot是spring下的子项目,主要是简化了使用Spring的难度,简省了繁重的配置,提供了各种启动器。

105.为什么要用 spring boot?
快速整合第三方框架
打包方式完全采用注解化
简化xml的配置
内置嵌入HTTP服务器(默认为tomcat),降低了对于环境的要求
最终以java应用程序进行执行

106.spring boot 核心配置文件是什么?
application(.yml/.properties)
bootstrap(.yml/.properties)
BootStrap 由 父 ApplicationContext 加载,Bootstrap 里面的属性不能被覆盖,相较于application而言优先加载bootstrap里面的属性。bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。
application 配置文件主要用于 Spring Boot 的自动化配置。
bootstrap 配置文件有以下几个应用场景:
使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息
一些固定的不能被覆盖的情景
一些加密/解密的场景

107.spring boot 配置文件有哪几种类型?它们有什么区别?
.properties 和 .yml,它们的区别主要是书写格式不同。

1).properties(key==value)
app.user.name = javastack
2).yml(key:value)
app:
user:
name: javastack

108.spring boot 有哪些方式可以实现热部署?
主要有两种方式:

Spring Loaded
Spring-boot-devtools

109.jpa 和 hibernate 有什么区别?

110.什么是 spring cloud?

111.spring cloud 断路器的作用是什么?

112.spring cloud 的核心组件有哪些?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值