Java面试题
2021/5/12 12:25:34
本文主要是介绍Java面试题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1、面向过程、面向对象?
- 面向过程:性能高
- 面向对象:性能低,易维护、易复用、易扩展(低耦合,封装、继承、多态特性)
2、String、StringBuffer、StringBuilder?
- String:对象不可变,每次操作都会生成新的string对象,操作少量数据用
- StringBuffer:对象可变,有加同步锁,线程安全,多线程操作字符串
- StringBuilder:对象可变,线程不安全,单线程操作字符串,效率更高
3、&、&&?
- 作用都一样就是两边都为true结果才为true
- &&具有短路的功能,当左边为false就不再执行右边,而&是两边都会执行
4、==、equals()?
- ==比较的是内存地址,equals比较的是值
- 对于基本数据类型,只有==没有equals
- 对于string或object这些引用数据类型,equals如果没被重写和==一样比较的是内存地址,如果被重写比较的是对象是否相同
5、重写(override)、重载(overload)?
- 重写是父类与子类之间多态性的表现,在运行时起作用(对父类函数进行重新定义)
- 重载是一个类中多态性的表现,在编译时起作用(如不同参数个数或类型的同名函数)
6、arraylist、linkedlist、vector?
- arraylist:数组,查询快
- linkedlist:链表,有指针,增删改快
- vector:有加同步锁,线程安全,性能差
7、hashmap、linkedhashmap、concurrenthashmap、hashtable?
- hashmap:线程不安全时推荐使用
- linkedhashmap:保存了记录插入的顺序
- concurrenthashmap:有加分段锁,考虑线程安全推荐使用
- hashtable:全局只有一把锁,线程安全,性能差
8、hashmap线程不安全?
- 1.7:并发执行扩容操作时会发生环形链表和数据丢失的情况
- 1.8:并发执行put操作时会发生数据覆盖的情况
9、缓存穿透、缓存击穿、缓存雪崩?
- 缓存穿透:请求缓存和数据库都不存在的数据,请求校验拦截或缓存空数据
- 缓存击穿:并发请求某条缓存过期数据造成数据库压力瞬间多大,加互斥锁或设置热点数据永不过期
- 缓存雪崩:并发请求大量缓存过期数据造成数据库压力过大甚至宕机,过期时间设置随机或设置热点数据永不过期或分布式部署
10、拦截器(interceptor)、过滤器(filter)?
- 拦截器是基于java反射机制的,而过滤器是基于函数回调
- 拦截器不依赖于servlet容器,而过滤器依赖于servlet容器
- 拦截器只对action请求起作用,而过滤器几乎对所有请求起作用
- 拦截器可以访问action上下文、值栈里的对象,而过滤器不能
- 在action生命周期里,拦截器可以多次被调用,而过滤器只在容器初始化时被调用一次
- 拦截器可以获取ioc容器中的各个bean,而过滤器不行,所以在拦截器里可以注入service来调用业务逻辑
(从内到外:controller、interceptor、servlet、filter、tomcat)
11、抽象类、接口?
- 抽象类中可以有构造方法,接口中不能有
- 抽象类中可以有普通成员变量,接口中没有
- 抽象类中可以包含非抽象的普通方法,接口中方法必须都是抽象的
- 抽象类中可以包含静态方法,接口中不能
- 一个类可以实现多个接口,但只能继承一个抽象类
12、java8新特性?
- lambda表达式:最简单的lambda表达式可由逗号分隔的参数列表、->符号和语句块组成,例如:Arrays.asList( “a”, “b”, “d” ).forEach( e -> System.out.println( e ) )
- 方法引用:Class::new、Class::method
- 可以使用重复注解
- 等等…
13、多线程创建方式?
- 继承thread类
- 实现runnable接口
- 实现callable接口
- 使用线程池,用executor框架
14、线程状态?
- 新建
- 就绪
- 运行
- 阻塞
- 死亡
15、Synchronized、Lock?
- synchronized是Java关键字,lock是一个类
- synchronized异常会释放锁,lock不会(需要手动,可能会发生死锁)
- synchronized不能响应中断,lock可以
- lock可以知道是否获取到锁,synchronized不能
16、Spring作用域?
- singleton(单例)
- prototype(原型)
- request
- session
- global session
17、集群、负载均衡?
- 集群(Eureka、Zookeeper):将同一个系统部署在多台服务器上
- 负载均衡(Nginx、Ribbon):将多个请求平均分摊到每台服务器上(按照轮询、权重、最小连接数等方式)
- 负载均衡的前提是集群
18、Eureka、Zookeeper?
- C(一致性)、A(可用性)、P(分区容错性)
- Zookeeper:保证CP,分主从节点,主节点出现问题时剩余节点会重新选举,选举期间服务瘫痪
- Eureka:保证AP,节点平等,自动切换到正常的节点,查到的信息可能不是最新的
19、乐观锁、悲观锁?
- 乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。一般会使用版本号机制或CAS操作实现,适用于读多写少。
- 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改所以会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。比如说像加synchronized,只允许单个线程占用资源,造成其他线程阻塞。效率可能较低,适用于写多读少。
20、IOC、AOP?
- IOC控制反转:将类的对象的控制权交给spring容器(一个bean标签就相当于创建了一个类的对象)
- AOP面向切面:将复杂的业务分解不同的切面,然后公共功能集中解决(拦截方法,定义前置后置增强类去做增强处理)
21、FactoryBean、BeanFactory?
- FactoryBean是一个Bean,由IOC容器管理
- BeanFactory是一个Factory,就是IOC容器
22、Collection、Collections?
- Collection是集合类的上层接口
- Collections是一个集合框架的帮助类
23、throw、throws?
- throw写在方法体里面,throws放在方法头上面
- throw就是直接抛出一个异常,而throws表示这个方法可能会抛出一个异常
24、Java中final的作用?
- 可以作为修饰符来修饰变量、方法和类;
- 被final修饰的变量必须在初始化时给定初值,以后在使用时只能被引用不能被修改;
- 被final修饰的方法不能在子类中被重写;
- 被final修饰的类不能被继承。
25、事务失效场景?
- 在非public修饰的方法上使用
- 在事务方法中使用try-catch
- 没加事务的方法调用加了事务的方法
- 属性配置问题
26、bigdecimal、double、float?
- 银行里的金额为保证计算精确,使用bigdecimal而不用double或float
- 因为有效长度足够长可存储小数位数
27、Cookie、Session、Token?
- Cookie数据存放在客户浏览器上,Session数据存放在服务器上
- Cookie不安全适合存大量信息(单4K),考虑安全应使用Session存用户等重要信息
- Token传参验证登陆
28、Linux:
- 查看当前目录:pwd
- 查看当前目录所有文件(夹):ls
- 切换到指定目录:cd
- 目录创建、删除:mkdir、rmdir
- 文件创建、删除、移动:touch、rm、mv
- 文件查看:vi、vim、cat、more、less、head、tail
- 上传下载:rz、sz
- 搜索:find、locate、grep
- 解压缩:zip、gzip、unzip、gunzip、tar
- 查看、终止进城:ps、kill
29、Dubbo:分布式框架
- interface:model、service
- provider:mapper(java、xml)、serviceImpl
- consumer:controller
30、SpringCloud:微服务框架
- eureka server、eureka client(provider、consumer)
- 客户端注册(连接)到服务端并维持心跳连接,通过接口地址完成服务间的调用
- resttemplate.get(post)for entity(object、location)
- ribbon:(客户端的)负载均衡(有多个provider)consumer(按照轮询、权重、最小连接数等算法)切换调用provider
- hystrix:服务熔断:当消费者调用提供者没有响应时直接返回一个错误响应,避免故障在分布式系统间蔓延
- feign:声明式服务消费(ribbon+hystrix),类似controller调用service
- zuul:api网关,类似添加上下文路径(路由),然后可以自定义请求过滤、异常处理
31、Redis:
- string、list、set、hash、zset
- redisTemplate.opsForValue().set(get)
32、Mybatis的一级缓存和二级缓存?
- 一级缓存的作用域是SqlSession范围的。
- 当在同一个sqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次查询时会从缓存中获取数据,不再去底层数据库查询,从而提高查询效率。
需要注意的是,如果SqlSession执行了DML操作(增删改),并且提交到数据库,MyBatis则会清空SqlSession中的一级缓存,这样做的目的是为了保证缓存中存储的是最新的信息,避免出现脏读现象。 - 当一个SqlSession结束后该SqlSession中的一级缓存也就不存在了。关闭一级缓存后,再次访问,需要再次获取一级缓存,然后才能查找数据,否则会抛出异常。
- 二级缓存是mapper级别的缓存。
- 使用二级缓存时,多个SqlSession使用同一个Mapper的sql语句去操作数据库,得到的数据会存在二级缓存区域,它同样是使用HashMap进行数据存储。
相比一级缓存SqlSession,二级缓存的范围更大,多个Sqlsession可以共用二级缓存,二级缓存是跨SqlSession的。 - 二级缓存的作用域是mapper的同一个namespace,不同的sqlSession两次执行相同的namespace下的sql语句,且向sql中传递的参数也相同,即最终执行相同的sql语句,则第一次执行完毕会将数据库中查询的数据写到缓存,第二次查询会从缓存中获取数据,不再去底层数据库查询,从而提高效率。
常用命令:
- idea/terminal:jps、taskkill /f -pid 3248
- cmd(命令)
- notepad(记事本)
- mstsc(远程)
- snippingtool(截图)
- mspaint(画图)
面试常问知识点:
- 非关系型数据库 redis 常用数据结构,电商场景的用法,分布式锁的使用
- 数据库 mysql 包含基本语法、innodb 底层结构、索引的使用、sql 优化、sql注意事项、事务的使用、注意事项
- 队列 rocketMq、rabbitMq 对比一系列mq 的优劣、特点
- Java 基础,hashmap、jvm、springboot 至少了解生命周期
- 微服务,基础的几个主件,各自的优劣,适用场景
一些常问关键词:
- Spring、SpringMVC、Mybatis、SpringBoot、
- Dubbo、SpringCloud、分布式、微服务
- RocketMQ、RabbitMQ、Kafka
- SQL优化、MySQL、Oracle、Redis、MongoDB
- 内存溢出、JVM、HashMap
- Maven、Nginx、Linux
这篇关于Java面试题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-09-28微服务架构中API版本控制的实践
- 2024-09-28AI给的和自己写的Python代码,都无法改变输入框的内容,替换也不行
- 2024-09-27Sentinel配置限流资料:新手入门教程
- 2024-09-27Sentinel配置限流资料详解
- 2024-09-27Sentinel限流资料:新手入门教程
- 2024-09-26Sentinel限流资料入门详解
- 2024-09-26Springboot框架资料:初学者入门教程
- 2024-09-26Springboot框架资料详解:新手入门教程
- 2024-09-26Springboot企业级开发资料:新手入门指南
- 2024-09-26SpringBoot企业级开发资料新手指南