目录
- 1、java基础
- 2、数据库
- 2.1、mysql索引优化
- 2.2、创建索引的依据?
- 2.3、mysql执行计划,explain各项参数代表什么意思?
- 2.4、什么时候不会用到索引?
- 2.5、mysql存储引擎
- 2.6、数据库隔离级别
- 2.7、为什么要使用索引
- 3、java多线程
- 3.1、java并发包java.util.concurrent及其子包都包括什么?
- 3.2、synconsized和volatile关键字区别?
- 3.3、实现线程池的方式?
- 3.4、公平锁与非公平锁
- 3.5、为什么不适用Excutors来创建线程池
- 3.6、ReentraneLock & AQS
- 4、jvm、java内存模型
- 5、java框架(spring boot,sprint cloud)
- 6、中间件
- 7、算法与数据结构
- 8、网络
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、三次握手,四次挥手
来源:CSDN
作者:pink baby
链接:https://blog.csdn.net/weixin_40027906/article/details/103597246