java高级面试题总结

青春壹個敷衍的年華 提交于 2019-12-24 05:10:44

1、java基础

1.1、hashmap原理?扩容

HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,找到bucket位置来储存键值对对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。
当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。
https://blog.csdn.net/kun_998/article/details/89480637

1.2、arraylist原理?扩容

https://blog.csdn.net/aizhuyanwei/article/details/78493495
https://blog.csdn.net/weixin_36378917/article/details/81812210

1.3、jdk1.8新特性?

https://blog.csdn.net/qq_29411737/article/details/80835658

1.4、completablefuture

https://www.jianshu.com/p/6bac52527ca4

2、数据库

2.1、mysql索引优化

https://www.cnblogs.com/qlqwjy/p/8592043.html

2.2、创建索引的依据?

1、表的主键、外键必须有索引;

2、数据量超过300的表应该有索引;

3、经常与其他表进行连接的表,在连接字段上应该建立索引;

4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;

5、索引应该建在选择性高的字段上;

6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;

7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:

   A、正确选择复合索引中的主列字段,一般是选择性较好的字段;
   B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?
   如果是,则可以建立复合索引;否则考虑单字段索引;
   C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
   D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
   E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;

8、频繁进行数据操作的表,不要建立太多的索引;

9、删除无用的索引,避免对执行计划造成负面影响;

2.3、mysql执行计划,explain各项参数代表什么意思?

id:选择标识符
select_type:表示查询的类型。
table:输出结果集的表
partitions:匹配的分区
type:表示表的连接类型
possible_keys:表示查询时,可能使用的索引
key:表示实际使用的索引
key_len:索引字段的长度
ref:列与索引的比较
rows:扫描出的行数(估算的行数)
filtered:按表条件过滤的行百分比
Extra:执行情况的描述和说明

注意:type标识mysql的访问类型,常见的有ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)

ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行

index: Full Index Scan,index与ALL区别为index类型只遍历索引树

range:只检索给定范围的行,使用一个索引来选择行

ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

eq_ref: 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件

const、system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system

NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。

2.4、什么时候不会用到索引?

索引列上不能使用表达式或函数
用or分割开的条件,如果or左右两个条件中有一个列没有索引,则不会使用索引。
复合索引,如果索引列不是复合索引的第一部分,则不使用索引(即不符合最左前缀)
如果like是以‘%’开始的,则该列上的索引不会被使用。
如果MySQL估计使用索引比全表扫描更慢,则不适用索引,
如果列为字符串,则where条件中必须将字符常量值加引号,否则即使该列上存在索引,也不会被使用

2.5、mysql存储引擎

https://www.cnblogs.com/xiaohaillong/p/6079551.html

如何修改大表的表结构(增加一列)
在主服务器上建立新表,表结构为修改后的表结构,将旧表数据同步到新表。
在旧表中建立触发器,使旧表更新的数据同步到新表中。
数据同步完成后,在旧表中建立排它锁,重命名新表为旧表,删除旧表。
可使用工具实现上面的操作:pt-online-schema-change

2.6、数据库隔离级别

A、读未提交

B、读已提交

C、可重复读

D、串行化

Mysql默认隔离级别,可重复读

Mysql查看当前隔离级别:show variables like ‘%iso%’

2.7、为什么要使用索引

索引大大减少存储引擎需要扫描的数据量

索引可以帮助我们进项排序避免使用临时表

索引可以把随机io变为顺序io

3、java多线程

3.1、java并发包java.util.concurrent及其子包都包括什么?

提供了比synchronized更加高级的各种同步结构,包括CountDownLatch、CyclicBarrier、Semaphore等,可以实现更加丰富的多线程操作。比如利用Semaphore作为资源控制器,限制同时进行工作的线程数量。
各种线程安全的容器,比如最常见的ConcurrentHashMap、有序的ConcurrentSkipListMap,或者通过类似快照机制,实现线程安全的动态数组CopyOnWriteArrayList等。
各种并发队列实现,如各种BlockingQueue实现,比较典型的ArrayBlockingQueue、SynchorousQueue或针对特定场景的PriorityBlockingQueue等。
强大的Executor框架,可以创建各种不同类型的线程池,调度任务运行等。绝大部分情况下,不再需要自己从头实现线程池和任务调度器。

https://www.jianshu.com/p/850e3282a80a

3.2、synconsized和volatile关键字区别?

volatile本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中读取,synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住.
volatile仅能使用在变量级别,synchronized则可以使用在变量,方法.
volatile仅能实现变量的修改可见性,但不具备原子特性,而synchronized则可以保证变量的修改可见性和原子性.
volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞.
volatile标记的变量不会被编译器优化,而synchronized标记的变量可以被编译器优化.

3.3、实现线程池的方式?

阿里的 Java开发手册,上面有线程池的一个建议:
线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,
这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
参考

3.4、公平锁与非公平锁

https://www.jianshu.com/p/eaea337c5e5b

3.5、为什么不适用Excutors来创建线程池

https://blog.csdn.net/weixin_41888813/article/details/90769126

3.6、ReentraneLock & AQS

ReentranceLock可重如锁
https://www.cnblogs.com/binbang/p/6425248.html
https://www.jianshu.com/p/da9d051dcc3d

4、jvm、java内存模型

4.1、jvm内存模型?

https://www.nowcoder.com/discuss/151138?type=1

4.2、jvm调优具体调的那些参数?

Xms 初始堆大小,也可称最小堆大小
-Xmx 最大堆大小
-Xmn 堆中新生代的大小
-Xss 每个线程的堆栈大小
-XX:PermSize 设置持久代(perm gen)初始值
-XX:MaxPermSize 设置持久代最大值

5、java框架(spring boot,sprint cloud)

5.1、mybatis一级缓存,二级缓存

5.2、mybatis $ # 区别?

5.3、sprint cloud 的常用组件?

6、中间件

6.1、redis存储的数据类型

6.2、redis实现分布式锁原理,使用redis实现分布式锁有什么问题?

https://www.cnblogs.com/gxyandwmm/p/9588383.html

6.3、zookeeper实现分布式锁原理

6.4、zookeeper如何实现公平锁

7、算法与数据结构

7.1、给定数1,1,2,3,5,8,13,21,34.设计程序求出第30个数?

7.2、快排算法(手写)

7.3、链表反转

7.4、删除链表最后第n个值

7.5、二分查找

7.6、树,红黑树,b+树

8、网络

8.1、tcp,udp,http区别

8.2、三次握手,四次挥手

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!