Java面试
Java基础
1. JDK和JRE区别是什么?
jdk运用与开发环境和运行环境
jre运用与运行环境
2. ==和equals()的区别?
“==” 比较值是否相同
“equals()” 比较引用是否相同,只要()里面的值是一样的就是相同的
3. Java中的几种修饰方式和运用场景?
#### 访问控制符:
public:公共访问域
protected:其他包的子类,同包的其他类,该类自身 可以访问
private:只能被自身访问
非访问控制符:
static:静态修饰符,只能修饰属于类的成员变量,不属于任何一个对象,只存储在当前类的公共储存的单元
final:最终修饰符,用来定义常量,而且他的取值整个执行过程中都不会变
volatile :共享修饰符,所以执行过程中的值有可能会发生变化
transient:暂时修饰符,定义为暂时性变量
final在Java中的作用?
final修饰的是最终类,所以不能够被继承,也不能被重写,做了初始化之后也不能被修改
4. String是类型吗?常用的类型有哪些?
String 不是类型,而是一个对象
常用类型:int ,byte ,long ,char ,double ,boolean, short, float
5. java中字符串的类有那些?区别是什么?
字符串类:String,StringBuffer,StringBuilder
区别:String声明是不可变的对象,每次操作都会生成新的String对象,然后将指针指向新的对象,StringBuffer和StringBuilder可以在原有的对象上面操作
StringBuffer和StringBuiler的区别在于StringBuffer是线程安全的StringBuilder是非线程安全的,StringBuiler的性能高于StringBuffer,如果单线程推荐使用StringBuiler,多线程推荐使用StringBuffer
6. 如何将字符反转?
StringBuffer或者StringBuilder的reverse()方法
// StringBuffer reverse
StringBuffer stringBuffer = new StringBuffer();
stringBuffer. append("abcdefg");
System. out. println(stringBuffer. reverse()); // gfedcba
// StringBuilder reverse
StringBuilder stringBuilder = new StringBuilder();
stringBuilder. append("abcdefg");
System. out. println(stringBuilder. reverse()); // gfedcba
7. String的常用方法有哪些?
length():字符串长度
indexOf():返回指定字符的索引(就是字符下标)
charAt():返回指定索引处的字符
subString():截取以某个字符开始的字符串的值
equales():字符串比较
trim():去除字符串两端空白
split():分割字符串,返回一个字符串的数组
replace():字符串替换
getBytes():返回字符串的byte数组
toLowerCase():将字符串转为小写字母
toUppercase():将字符串转为大写字符
···
7. 普通类和抽象类的区别?
普通类不能包含抽象方法,抽象类可以包含
普通类可以实例化,抽象类不能
8. 接口和抽象类有什么区别?
实现:抽象类需要用extends继承, 接口是需要用implement实现接口
构造函数:抽象可以构造函数,接口不能有
实现数量:类可以实现多个接口,但是只能继承一个抽象类
访问修饰符:接口只能够用public,但是抽象类可以用所有的修饰符
9. Java中的IO流分为几种?
功能分:输入(input),输出(output)
类型分:字节流,字符流
区别:字节流按照8位以字节为单位输入输出,字符流按照16个以字符为单位输入输出
10. BIO,NIO,AIO有什么区别?
BIO:使用简单方便,并发处理能力低
NIO:IO的升级,客户端和服务端通过通道(channal)通讯,实现多路复用
AIO:NIO升级,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制
12. Files常用方法有哪些?
Files. createFile():创建文件
Files. createDirectory():创建文件夹
Files. delete():删除一个文件或目录
Files. copy():复制文件
Files. move():移动文件
Files. size():查看文件个数
Files. read():读取文件
Files. write():写入文件
Files.exists():检测文件路劲是否存在
容器
1. java的容器都有哪些?
Collection 和Map
Collextion:list集合,set集合
Map:hashMap结合,TreeMap集合,ConcurrentHashMap,HashTable
2. list集合和map集合的区别?
list:有序,允许重复
set(AbstractSet,HashSet):无序,不允许重复, TreeSet可以使用二叉树排序
map(AbstractSetMap,HhashMap):无序,Key值唯一,value允许重复, TreeMap可以使用二叉树排序
3. HashMap和HashTable区别?
存储:HashMap的key和value可以为null,HashTable不可以
线程:HashTable是线程安全,HashMap是非现成安全
推荐: HashTable是保留类不建议使用,单线程推荐使用HashMap,多线程使用ConcurrentHashMap
4. HashMap和TreeMap抉择?
简单的增删改查,或者定位这类元素推荐使用HashMap
有序遍历推荐使用TreeMap
5. HashMap和HashSet的实现原理?
HashMap:基于Hash算法实现,put(key,value)存数据,get(key)取数据,通过传入key,然后根据key.hashCode()计算出Hash值,通过hash把值保存到bucket里面
HashSet:基于HashMap的算法实现的,底层使用HashMap保存数据
6. ArrayList和linkedList区别?
数据结构:ArrayList是动态数组实现,LinkedList是双向链表结构实现
随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找
增删效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 增删操作要影响数组内的其他数据的下标
建议:在需要频繁读取集合中的元素时,更推荐使用 ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList
7. 实现数组和list之间的转换?
数组转list:使用 Arrays. asList(array) 进行转换
list转数组:使用list自带的toArray()方法
// list to array
List<String> list = new ArrayList<String>();
list. add("王磊");
list. add("的博客");
list. toArray();//list转数组
// array to list
String[] array = new String[]{"王磊","的博客"};
Arrays. asList(array);//数组转list
8. Array和ArrayList区别?
存储:Array能储存对象和数据类型,ArrayList只能存储对象
大小:Array固定大小,ArrayList大小自动扩展
方法:Array里面的方法没有ArrayList多,比如 addAll、removeAll、iteration 等方法只有 ArrayList 有
9.迭代器是什么?
Iterator 接口提供遍历任何 Collection 的接口。我们可以从一个 Collection 中使用迭代器方法来获取迭代器实例。迭代器取代了 Java 集合框架中的 Enumeration,迭代器允许调用者在迭代过程中移除元素。
10. Iterator 和 ListIterator 有什么区别?
Iterator可以遍历set和list集合,listlterator只能够遍历list
Iterator只能单向遍历,listlterator可以双向遍历
ListIterator 从 Iterator 接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置
多线程
1. 并行和并发区别?
并行:多个处理器和多核处理器同事处理多个任务
并发:多个任务在同一个CPU上,按细分的时间片轮流(交替)执行
2.进程和线程的区别?
一个程序至少有一个进程,一个进程下至少有一个线程,也可以有多个线程增加程序执行速度
3. 守护线程是什么?
运行在后台的一种特殊的进程,他独立与控制终端并且周期性的执行者一些任务
4. 创建线程的几种方式?
继承Thread重写run方法
实现Ruunable接口
实现Callable接口
5. Runnable和Callable的区别?
Runnable没有返回值,Callable可以拿到返回值,可以吧Callable说成是Runnable的一种补充
6. Sleep()和wait()的区别?
类不同:sleep()来自Thread,wait()来自于Object
释放锁:Sleep()不释放,wait()释放
用法:sleep()到时间会自己回复,wait可以用notify()或者notifyAll()直接唤醒
7. notify()和notifyAll()区别?
notify()只能唤醒一个线程,nottifyAll()唤醒所有的线程
反射
1. 反射是什么?
对于任意一个类都能知道方法,对于任何一个对象都能调用方法这种动态获取信息,和对象的方法叫做反射
2. 什么是java序列化?
保存内存对象并且可以把对象状态在读出来,在对象保存,远程调用会有经常用到
对象拷贝
1. 为什么要使用克隆?
克隆的对象可能包含一些已经修改过的属性,而 new 出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠克隆方法了
2. 如何实现对象克隆?
实现 Cloneable 接口并重写 Object 类中的 clone() 方法
实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆
3.深度克隆和浅克隆区别?
浅克隆:当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制
深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将复制
Java web
1. jsp和servlet的区别是什么?
JSP 是 servlet 技术的扩展,本质上就是 servlet 的简易方式,JSP 侧重于视图,servlet 主要用于控制逻辑
2. JSP有哪些内置对象?区别是什么?
request:封装客户端的请求,其中包含来自 get 或 post 请求的参数
response:封装服务器对客户端的响应
pageContext:通过该对象可以获取其他对象
session:封装用户会话的对象
application:封装服务器运行环境的对象
out:输出服务器响应的输出流对象
config:Web 应用的配置对象
page:JSP 页面本身(相当于 Java 程序中的 this)
exception:封装页面抛出异常的对象
3. JSP的四种作用域?
page:代表页面相关对象和属性
request:代表客户端发送请求相关对象和属性
session:代表某个用户与父亲服务器建立的会话相关的对象和属性
application:代表与整个 Web 应用程序相关的对象和属性,它实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域
4. session和cooking的区别?
存储位置:session在服务端,cooking在浏览器端
安全性:cooking安全性一般
容量:cooking有容量和个数限制
存储的多样性:session可以存储在ridis,数据库,等第三方库中,但是cooking只能存储到浏览器中
5.session的工作原理?
客户端登录完成找到服务端创建session返回给客户端,客户端存到浏览器,这样客户端每次访问都会携带sessionid,服务器拿到sessionid之后去找到对应的session就可以正常使用了
6. 客户端禁止cooking能实现session还能用吗?
可以用,session 只是依赖 cookie 存储 sessionid,如果 cookie 被禁用了,可以使用 url 中添加 sessionid 的方式保证 session 能正常使用
7. springMVC和struts的区别是什么?
拦截级别:SpringMvc是方法级别拦截,struts是类级别拦截
数据独立性:springmvc和struts方法都独立但是Springmvc不共享变量,struts会共享变量,这虽然不会影响程序运行,但是却给我们读取程序带来了一定麻烦
拦截机制:struts2 有以自己的 interceptor 机制,spring mvc 用的是独立的 aop 方式,这样导致struts2 的配置文件量比 spring mvc 大
对 ajax 的支持:spring mvc 集成了ajax,所有 ajax 使用很方便,只需要一个注解 @ResponseBody 就可以实现了;而 struts2 一般需要安装插件或者自己写代码才行
异常
1. throw和throws区别?
throw:真实抛出了一个异常
throws:是声明可能会抛出一个异常
2. finally,final,finalize 三着之间有什么区别?
final:是修饰符,如果修饰类,则不能被继承
finally:是 try{} catch{} finally{} 最后一部分,表示不论发生任何情况都会执行,finally 部分可以省略,但如果 finally 部分存在,则一定会执行 finally 里面的代码
finalize:是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法
3. try-cath-finally那个部分可以省略?
cath和finally可以,但是不能同时省略
4. 常用的异常有哪些?
NullPointerException 空指针异常
ClassNotFoundException 指定类不存在
NumberFormatException 字符串转换为数字异常
IndexOutOfBoundsException 数组下标越界异常
ClassCastException 数据类型转换异常
FileNotFoundException 文件未找到异常
NoSuchMethodException 方法不存在异常
IOException IO 异常
SocketException Socket 异常
网络
1. forward 和 redirect 的区别?
forward是转发,redirect是重定向
地址栏 url 显示:foward url 不会发生改变,redirect url 会发生改变
数据共享:forward 可以共享 request 里的数据,redirect 不能共享
效率:forward 比 redirect 效率高
2. get和post区别?
get 请求会被浏览器主动缓存,而 post 不会
get 传递参数有大小限制,而 post 没有
post 参数传输更安全,get 的参数会明文限制在 url 上,post 不会
3. 如何实现跨域?
服务器端运行跨域 设置 CORS 等于 *
在单个接口使用注解 @CrossOrigin 运行跨域
使用 jsonp 跨域
4. jsonp实现原理
jsonp:JSON with Padding,它是利用script标签的 src 连接可以访问不同源的特性,加载远程返回的“JS 函数”来执行的
spring ,spring MVC
1. 为什么要使用Spring?
spring提供了ioc技术,事务支持,面向切面编程,更方便框架集成
2. ioc和aop区别?
ioc:控制反转,控制当前内部成员的的控制权
aop:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术
3. spring主要有哪些模块?
spring core:框架的最基础部分,提供 ioc 和依赖注入特性
spring dao:Data Access Object 提供了JDBC的抽象层
spring aop:提供了面向切面的编程实现,让你可以自定义拦截器、切点等
spring Web mvc:spring 中的 mvc 封装包提供了 Web 应用的 Model-View-Controller(MVC)的实现
···
4. spring 常用的注入方式有哪些?
setter属性注入
构造方法注入
注解方式注入
5. spring 自动装配 bean 有哪些方式?
no:默认值,表示没有自动装配,应使用显式 bean 引用进行装配。
byName:它根据 bean 的名称注入对象依赖项。
byType:它根据类型注入对象依赖项。
构造函数:通过构造函数来注入依赖项,需要设置大量的参数。
autodetect:容器首先通过构造函数使用 autowire 装配,如果不能,则通过 byType 自动装配
6. SpringMvc的运行流程?
spring mvc 先将请求发送给 DispatcherServlet
DispatcherServlet 查询一个或多个 HandlerMapping,找到处理请求的 Controller
DispatcherServlet 再把请求提交到对应的 Controller
Controller 进行业务逻辑处理后,会返回一个ModelAndView
Dispathcher 查询一个或多个 ViewResolver 视图解析器,找到 ModelAndView 对象指定的视图对象。
视图对象负责渲染返回给客户端
7. spring有哪些运行组件?
前置控制器 DispatcherServlet
映射控制器 HandlerMapping
处理器 Controller
模型和视图 ModelAndView
视图解析器 ViewResolver
my batis
1. MyBatis 中 #{}和 ${}的区别是什么?
#{}
是预编译处理,${}
是字符替换
2. MyBatis有几种分页方式?
逻辑分页: 使用 MyBatis 自带的 RowBounds 进行分页,它是一次性查询很多数据,然后在数据中再进行检索
物理分页:自己手写 SQL 分页或使用分页插件 PageHelper,去数据库查询指定条数的分页数据的形式
3. MyBatis 逻辑分页和物理分页的区别是什么?
逻辑分页是一次性查询很多数据,然后再在结果中检索分页的数据。这样做弊端是需要消耗大量的内存、有内存溢出的风险、对数据库压力较大
物理分页是从数据库查询指定条数的数据,弥补了一次性全部查出的所有数据的种种缺点,比如需要大量的内存,对数据库查询压力较大等问题
4. MyBatis 和 hibernate 的区别有哪些?
灵活性:MyBatis 更加灵活,自己可以写 SQL 语句,使用起来比较方便
可移植性:MyBatis 有很多自己写的 SQL,因为每个数据库的 SQL 可以不相同,所以可移植性比较差
Zookeeper
1. Zookeeper是什么?
是一个分布式的,开放源码的分布式应用程序协调服务,是 google chubby 的开源实现,是 hadoop 和 hbase 的重要组件
2. Zookeeper有哪些功能?
集群管理:监控节点存活状态、运行请求等
主节点选举:协助节点完成选举过程
分布式锁:zookeeper可以对分布式锁进行控制
3. Zookeeper的通知机制?
客户端端会对某个 znode 建立一个 watcher 事件,当该 znode 发生变化时,这些客户端会收到 zookeeper 的通知,然后客户端可以根据 znode 变化来做出业务上的改变
MySql
1. char和carchar区别是什么?
char:固定长度,优点,效率高,缺点,占用空间,适用于存储密码MD5长度值
varchar:可变长度,有空间,空间上考虑使用
2. float和duble区别?
float:最多可以存十进制8位,占4字节
读博了:最多可以存十进制16位,占8字节
JVM
1. 说一下 JVM 的主要组成部分?
类加载器(ClassLoader)
运行时数据区(Runtime Data Area)
执行引擎(Execution Engine)
本地库接口(Native Interface)
2. 说一下堆栈的区别?
功能方面:推用来存放对象,栈用来执行程序
共享性:堆是共享的,栈是私有的
空间:推的空间远远大于栈
3. 队列和栈是什么?有什么区别?
队列和栈都是被用来预存储数据的
栈和队列运行对元素进行后进先出进行检索,但是队列有特殊情况,Deque 接口允许从两端检索元素
4. 说一下类装载的执行过程?
加载:根据查找路径找到相应的 class 文件然后导入
检查:检查加载的 class 文件的正确性
准备:给类中的静态变量分配内存空间
解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而在直接引用直接 指向内存中的地址
初始化:对静态变量和静态代码块执行初始化工作
5. 重载和重写的区别?
定义不同:重载是定义相同的方法名,参数不同;重写是子类重写父类的方法
范围不同:重载是在一个类中,重写是子类与父类之间的
多态不同:重载是编译时的多态性,重写是运行时的多态性
返回不同:重载对返回类型没有要求,而重写要求返回类型,有兼容的返回类型
参数不同:重载的参数个数、参数类型、参数顺序可以不同,而重写父子方法参数必须相同
修饰不同:重载对访问修饰没有特殊要求,重写访问修饰符的限制一定要大于被重写方法的访问修饰符
springboot,spring cloud
1. 为什么要用springboot?
配置简单,独立运行,自动装配,无代码生成xml配置器,易上手,提升开发效率
2. springboot的核心配置文件是哪几种?
(bootstrap )application.yml,application.yaml,application.properties
3. yml数据如何注入,list如何在yml定义?
@values()注入,yml里面定义用空格隔开
list定义:
name:"zhangsan"
address: # 或者["shanghai","beijing"]
-"shanghai"
-"beijing"
4. springcloud的几种核心组件?
注册中心:eureka,nacos,consoul
Feign:基于动态代理机制,根据注解和选择的机器,拼接请求 url 地址,发起请求
Ribbon:实现负载均衡,从一个服务的多台机器中选择一台
Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题
网关:gateway,zuul