1.对集合的理解
集合就是一种容器,用于保存一组元素。比较适合保存 引用类型的元素(对象)
集合在使用时,长度不用指定,而且可以实现自动扩容或截断。
集合没有指定泛型之前,默认保存的是任意类型的元素(Object类型),指定泛型之后,可以保存对应类型的元素。
集合中最常见的三种集合类型List、Set、Map。
- List体系: 有序,可重复
ArrayList: 底层是数组实现,线程不安全,效率高 查询比较高,增删效率低
LinkedList: 底层双向链表,查询慢,增删快 Vector: 底层是数组实现,线程安全,效率低
- Set体系: 无序,不可重复
LinkedHashSet与HashSet虽然都是无序的,但是LinkedHashSet是链表式的(有前后加载项),所以LinkedHashSet和元素添加的顺序有关。
TreeSet添加元素必须为同一类型,否则遍历出错 遍历输出顺序按默认(从小到大的)顺序排列 如:String、int 自然排序要用Comparable重写compareTo方法,实现内部排序。
- map体系
LinkedHashMap与LinkedHashSet原理相同,方法皆为map方法。
TreeMap与TreeSet原理相同,多了key-value的方式。
Hashtable基于线程安全,效率低,古老。
HashMap基于非线程安全,效率高。
2.前后端怎么数据对接?
3.redis的了解
redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。
redis-server会以非daemon的方式来运行,且默认服务端口为6379。
支持五种数据类型:字符串、字符串列表、字符串集合、有序字符串集合、哈希
redis提供了两种持久化的方式,分别是RDB和AOF,可以通过修改redis.conf来进行配置.。
RDB,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上;
eg:save 900 1 //至少在900秒的时间段内至少有一次改变存储同步一次
AOF,就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。默认关闭。
eg:appendonly yes //yes 开启,no 关闭
appendfsync always //每次有新命令时执行一次fsync,就将缓冲区的数据放入aof文件
everysec appendfsync everysec //每秒 fsync 一次
appendfsync no //从不fsync(交给操作系统来处理,可能很久才执行一次fsync)
如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。
Redis启动时,先解析日志文件(一堆命令),恢复数据。然后还要加载rdb文件(取并集)。
Redis事务管理
1.MULTI用来组装一个事务;
2.EXEC用来执行一个事务;
3.DISCARD用来取消一个事务;
4.WATCH用来监视一些key,一旦这些key在事务执行之前被改变,则取消事务的执行。nuil有改动
1.通用(general)2.快照(snapshotting)3.复制(replication)4.安全(security)
5.限制(limits) 6.追加模式(append only mode) 7.LUA脚本(lua scripting)
8.慢日志(slow log) 9.事件通知(event notification)
Redis缓存
redis提供了三种缓存机制,LFU,LRU,TTL
.LFU,least frequently used,即最小使用频率淘汰,每个对象使用共计24bit空间用来实施这个算法,24bit分成2个部分,前16bit用来记录上次减少时间(减少的是后面8bit计数器),后面8个bit是一个对数计数器,用来记录这个对象的访问次数。
LRU,last recently used,即最近最少使用淘汰,一般做法是,将hash表的value做成一个指针,指向一个双链表节点,节点中保存实际的value,双链表按照上次访问时间降序排列,当访问到一个对象之后,更新访问时间,并将这个节点移动到表头,若节点不存在就直接插入到表头。当内存门限达到的时候,从链表尾开始删除若干entry。redis为了减少内存使用,不使用双链表或其他结构管理对象,采用随机算法,每次从hash表中随机选择一些key,一般是5个,将这些key存入一个全局的池,池大小一般是16,池中entry按照上次访问时间降序排列,每次从池中选择尾部的entry,就是最差的对象,将这个对象淘汰。
TTL,即生存时间,按照生存时间设置一个对象的生命周期,一个对象生命周期结束之后将其销毁。
Redis提供了两种方式来做消息队列,一种是生产消费模式,另一种是发布订阅模式。
4.spring boot启动过程
5.加载静态方法和非静态方法的区别
6.sql优化,优化过程
7.Hashset
Hashmap实现原理?线程安全?扩容阈值?怎么扩容?扩容优化?抖动函数
8.多线程
线程池(参数的意义、原理、任务队列满了会发生什么、拒绝策略、阻塞队列)
9.并行和并发的区别
并发是指一个处理器同时处理多个任务。
并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。
并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。
10.java中的多态
11.重写和重载的区别
12.网络安全问题(xss和sql注入)
13.安全验证的方式
14.ThreadLocal
15.垃圾回收算法、识别对象是否存活的方法、循环引用的方法
16.springmvc原理,请求到响应的过程
17.类加载机制
18.索引种类(B+树)
19.打开网站很长时间才得到反馈的原因(客户端分析、并发之类、硬件方面、网络方面、缓存方面)
20.Java异常(运行时异常包括哪些)
21.TCP、IP报文都包含什么?什么关系?
22.TCP握手,为什么有四次
23.mysql并发控制