Java 2019 面试整理
一、Java基础部分
1、Java各个数据类型最大值、最小值、长度大小以及字节大小?
2、Java基础数据类型有哪些?
基础类型有 8 种:byte、boolean、char、short、int、float、long、double。
String 不属于基础数据类型。
3、Java中操作字符窜的类有哪些?它们的区别是什么?
操作字符串的类有:String、StringBuilder、StringBuffer。
String 和 StringBuffer、StringBuilder 的区别: String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。
StringBuffer 和 StringBuilder 最大的区别:StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用StringBuffer。
4、数组(主要是用于笔试部分面试,现场面试还未遇到问数组)
一维数组可以写成:int[ ]x 或者int x[ ];
二维数组可以写成:int[ ] y [ ] 或者int y[ ][ ] 或者int [ ][ ]y;
声明数组int[ ]x,y[ ];下列不能编译通过的是:(int[ ]x,y[ ]可以写成“int [ ]x”和“int [ ]y[ ]”)
1、x[0]=y; // 不能编译通过,因为y表示为一个“一维数组”,而x[0]为一个整形的变量值,类型不匹配
2、y[0]=x; // 能编译通过,因为x和y[0]都表示为一个一维数组
3、y[0][0]=x; // 不能编译通过,y[0][0]表示为值,x表示为一维数组
4、x[0][0]=y; // 不能编译通过,表示错误
5、y[0][0]=x[0]; // 能编译通过,因为双方都表示为值
5、了解集合吗?你常用的Java集合有哪些?
Collection和Map,是集合框架的根接口。
- Collection
- List
- ArrayList
- LinkedList
- Vector
- Stack
- Set
- HashSet
- LinkedHashSet
- TreeSet
- List
- Map
- HashMap
- LinkedHashMap
- TreeMap
- ConcurrentHashMap
- Hashtable
- HashMap
6、List、Set、Map 之间的区别是什么?
7、HashMap 和 Hashtable 有什么区别?
- 存储:HashMap 运行 key 和 value 为 null,而 Hashtable 不允许。
- 线程安全:Hashtable 是线程安全的,而 HashMap 是非线程安全的。
- 推荐使用:在 Hashtable 的类注释可以看到,Hashtable 是保留类不建议使用,推荐在单线程环境下使用 HashMap 替代,如果需要多线程使用则用 ConcurrentHashMap 替代。
8、说一下 HashMap 的实现原理?
HashMap 基于 Hash 算法实现的,我们通过 put(key,value)存储,get(key)来获取。当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。
在1.7中,数据结构则是采用的位桶和链表(数组)相结合的形式完成了,即拉链法;在1.8中采用的是位桶和链表(数组),其底层采用红黑树。
9、HashMap 默认大小是多少,在什么情况下扩容?
默认大小16,当大于 这个数 「加权因子(0.75)* 16」时,会扩容原来的两倍。
10、为什么不推荐使用HashTable,单线程使用HashMap,多线程使用ConcurrentHashMap?
HashTable是不推荐使用,HashMap速度优于HashTable,但是非线程安全,如果要使用线程安全,可以使用ConcurrentHashMap。
11、有用过迭代器吗?ArrayList 和 Vector 的区别是什么?
- 线程安全:Vector 使用了 Synchronized 来实现线程同步,是线程安全的,而 ArrayList 是非线程安全的。
- 性能:ArrayList 在性能方面要优于 Vector。
- 扩容:ArrayList 和 Vector 都会根据实际的需要动态的调整容量,只不过在 Vector 扩容每次会增加 1 倍,而 ArrayList 只会增加 50%。
12、数据类型在堆栈中是如何存放的?
局部变量存放在栈中,引用类型(例如数组,对象)放在堆中。
13、Math类问答?
① 两个常量:PI 和 E;
② Math.round() 函数用法
- 参数的小数点后第一位<5,运算结果为参数整数部分。
- 参数的小数点后第一位>5,运算结果为参数整数部分绝对值+1,符号(即正负)不变。
- 参数的小数点后第一位=5,正数运算结果为整数部分+1,负数运算结果为整数部分。
总结:大于五全部加,等于五正数加,小于五全不加。
14、
二、Java进阶部分
1、Spring mvc有用过吗?有哪些组件?原理能聊聊吗?
肯定回答有用过。
组件:
前置控制器 DispatcherServlet;
映射控制器 HandlerMapping;
处理器 Controller;
模型和视图 ModelAndView;
视图解析器 ViewResolver。
原理:
Spring mvc 先将请求发送给 DispatcherServlet。
DispatcherServlet 查询一个或多个 HandlerMapping,找到处理请求的 Controller。
DispatcherServlet 再把请求提交到对应的 Controller。
Controller 进行业务逻辑处理后,会返回一个ModelAndView。
Dispathcher 查询一个或多个 ViewResolver 视图解析器,找到 ModelAndView 对象指定的视图对象。
视图对象负责渲染返回给客户端。
2、Spring用过哪些注解?
@Controller 声明一个控制器入口;
@RequestMapping 将一个http请求映射到相对应的类或方法上;
@Autowired 对类、成员变量和构造函数进行标注,完成自动装配,消除使用getter和setter的方法使用;
@RequestParam 针对控制器的请求参数的封装;
@FormBean 针对控制器的请求参数表单的封装;
@Valid 验证注解是否符合要求;
@Service 注入服务类,自动注入到spring容器中,不用在xml中配置;
引申其他注解:
3、Spring Boot 的核心配置文件是哪些?
bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加载的,比 applicaton 优先加载,且 boostrap 里面的属性不能被覆盖;
application (. yml 或者 . properties):用于 spring boot 项目的自动化配置。
4、Spring 读取.properties配置文件的方式有哪些?读取或者加载.xml配置文件的方式有哪些?
.properties
①Java读取.properties文件方式;
②Spring注解方式,其中有以下方式:
@Component + @Value ;
@Component + @ConfigurationProperties
@Component + @PropertySource + @Value
.xml
① ClassPathXmlApplicationContext
② FileSystemResource
.yml
.yml 格式不支持 @PropertySource 注解导入。
5、Spring Cloud核心组件有哪些?
Eureka:服务注册于发现。
Feign:基于动态代理机制,根据注解和选择的机器,拼接请求 url 地址,发起请求。
Ribbon:实现负载均衡,从一个服务的多台机器中选择一台。
Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。
Zuul:网关管理,由 Zuul 网关转发请求给对应的服务。
6、
7、BIO、NIO、AIO的区别是哪些?
BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
NIO:Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
三、Java高阶部分
四、数据库部分 - MySQL
1、MySQL 的ACID是哪些?
Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)、Durability(持久性)
2、MySQL隔离性数据隔离级别有哪些?默认是哪一个?你们公司一般使用哪一个?
读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
默认隔离级别:可重复读(repeatable read)。
公司一般使用:读提交(read committed)
引申:Oracle 和MS SQL Server默认隔离级别:读提交(read committed)。
3、有没有用过索引?索引是怎么实现的?怎么知道索引是否被命中?
这个回答肯定:有用过;
不同的数据引擎实现有所不同,但目前主流的数据库引擎的索引都是 B+ 树实现的,B+ 树的搜索效率,可以到达二分法的性能,找到数据区域之后就找到了完整的数据结构了,所有索引的性能也是更好的。
使用 explain 查看 SQL 是如何执行查询语句的,从而分析你的索引是否满足需求。
4、MySQL的数据引擎了解吗?
InnoDB 引擎:mysql 5.1 后默认的数据库引擎,提供了对数据库 acid 事务的支持,并且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据容量的数据库系统。
MyIASM 引擎:不提供事务的支持,也不支持行级锁和外键。因此当执行插入和更新语句时,即执行写操作的时候需要锁定这个表,所以会导致效率会降低。
5、刚刚说到了锁,MySQL的乐观锁和悲观锁可以解释吗?
MyISAM 只支持表锁,InnoDB 支持表锁和行锁,默认为行锁。
乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。
悲观锁:每次去拿数据的时候都认为别人会修改,每次拿数据时,先判断是否有锁,有锁被阻止;反之每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。
其中,数据库的乐观锁需要自己实现,在表里面添加一个 version 字段,每次修改成功值加 1,这样每次修改的时候先对比一下,自己拥有的 version 和数据库现在的 version 是否一致,如果不一致就不修改,这样就实现了乐观锁。
6、MySQL数据查询比较慢,怎么查找问题?性能优化都用过哪些手段?
查找问题方法:
①使用 show processlist 命令查看当前所有连接信息;
②使用 explain 命令查询 SQL 语句执行计划;
③开启慢查询日志,查看慢查询的 SQL。
性能优化方法:
①为查询字段创建索引;
②避免使用select *查询;
③垂直分割表;
④为数据存储选择正确的数据引擎。
7、SQL中行转列,列转行能聊聊吗?
行转列:
UNION ALL 和 UNION;
列转行:
①使用case...when....then 进行行转列;
②使用IF() 进行行转列;
③利用SUM(IF()) 生成列 + WITH ROLLUP 生成汇总行,并利用 IFNULL将汇总行标题显示为Total;
④利用SUM(IF()) 生成列 + UNION 生成汇总行,并利用 IFNULL将汇总行标题显示为 Total;
⑤利用SUM(IF()) 生成列,直接生成结果不再利用子查询;
⑥动态,适用于列不确定情况;
⑦合并字段显示:利用group_concat();
8、SQL中分页脚本?
① limit m, n
② between and
③ 当数据记录ID不连续时,可以先找出id,然后再使用in方法;
④ 如果数据量大,数据量级别到达百万时,此时可以首先优化索引,在根据ID去执行二次查询数据;
五、数据库部分 - Redis
1、Redis支持的数据类型有哪些?
Redis 支持的数据类型:string(字符串)、list(列表)、hash(字典)、set(集合)、zset(有序集合)。
2、什么是缓存穿透?怎么解决缓存穿透?
缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
解决方案:最简单粗暴的方法如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们就把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
六、Linux 相关
1、了解Linux的命令吗?创建文件、创建文件夹的命令有哪些?
创建文件命令:touch 创建文件夹命令:mkdir 删除文件命令:rm
2、查询端口被占用的命令?怎么找到端口在哪一个任务中使用?如何关闭端口中的任务?
netstat -aon | findstr "端口号"
tasklist | findstr "PID编号"
taskkill /PID编号 停用的PID /F
3、查看日志信息的使用哪些命令?
tail -f "查看的行数"
cat
ps -ef | grep "日志内容"
4、查看磁盘情况?
df -h
5、文件读写权限设置的命令?
chmod
您的资助是我最大的动力!
金额随意,欢迎来赏!
欢迎大家关注我的个人博客 Lycos | 小站 !由于最近没时间处理,原域名http://www.liuyuchuan.com暂时停止使用