在这个时间段面了挺多家公司的,也收获了很多经验,对于自己的知识盲区有所了解,可以查漏补缺。

java基础方面,经常问到的东西,凭记忆写出来,因为这些知识点都是从网上学习的,所以会有些雷同的地方,请见谅~

1. HashMap的相关知识,

  HashMap整体实现是一个链表的数组,每一个数组数据的位置起初都是一个链表的存储结构,当链表长度超过一定值时,会把链表变更为红黑树以改善查询性能。每个数组位置都有对应的一个索引值,这个值是通过放进来的entry对象的key值的hash值再进行一次hash之后得到的。默认的负载因子上限是0.75,当容器里面的对象数量超出负载时,会对HashMap进行扩容,每次扩容为上次容量的两倍。这里要注意容量值总是2的n次幂,这是为了方便扩容而特意设置的。

  再者,HashMap是非线程安全的,想要使用线程安全的类可以使用ConcurrentHashMap,其使用的锁机制是分段锁,每个锁只锁住其中的部分数据而非所有数据,这样拆分锁的粒度的做法的好处是在进行读写操作时,不同区域的数据因为持有不同的锁,所以可以并发进行,也就提升了读写性能,因此一般在有高并发的时候使用ConcurrentHashMap比使用HashTable 是更好的选择。

2. ArrayList和LinkedList的区别,

  ArrayList是动态数组,LinkedList是链表,

  轮查询,动态数组比链表快,因为数组查询是直接定位到要查询的位置,而链表需要从头往后遍历,直到查到对应的索引。这就是数组的优势(在内存中占据连续的内存空间,所以查询快)

  轮修改,各有优劣。数组索引快,但是修改慢,因为需要对数据进行批量移动操作。而链表是索引慢,但是修改快,因为只需要修改其中有关联关系的数据即可,不需要批量移动数据。

  补充知识:数组在内存中是逻辑连续的,因此查询的时候可以直接拿到对应的地址,速度非常快(这里好像还涉及到寄存器,一级缓存,二级缓存和内存的速度对比~)

3. 多线程

  多线程的实现方式有3种,thread,runnable,callable

  线程池的选择,根据业务场景,主要有两种,一种是io密集型,一种是cpu密集型。如果是io密集型业务,代表着io的压力比较大,应该把并发的压力分担一些到cpu上面,就应该选择多核并行的线程池。

4. 简述下http请求到达tomcat之后,tomcat怎么处理的

 

5. zookeeper宕机之后dubbo节点会做出什么反应

  首先,如果宕机的zookeeper数量不到一半,那么zookeeper集群还可以选举出一个leader出来继续工作,但是如果zookeeper超过一半宕机了,无法选举出一个leader出来,所有的zookeeper都是处于looking状态,那么集群就无法发现新的服务,当然现有服务是没问题的。dubbo的每个节点都会根据自己的本地缓存数据去读取对应的服务提供者的地址,然后直接去调用需要的服务

6. 为什么要使用dubbo分布式,dubbo内部实现原理

7. zookeeper的选举算法

8. spring的理解

  两大特色:ioc和aop。作用主要是对象之间松耦合。通过使用ioc,也就是依赖注入,spring相当于对象的容器,帮助我们管理对象,需要使用的时候直接从spring拿出对象来使用,不需要自己在对象内部创建去强耦合的创建另外一个对象,待续。

9. springMVC的工作原理

10. mybatis怎么防止sql注入攻击,#和$的区别

11. 数据库事务的几个特性

12. aop和ioc的实现原理

13. 垃圾回收算法

14. linux下查找日志的命令

15. 数据库视图的作用

16. 怎么解决高并发下的数据不一致问题

17. 数据库存储过程写过哪些

18. 简述数据库的左外连接

19. 写一个工厂设计模式的例子

20. 写一个单例设计模式的例子

  单例模式要点有3个:构造方法私有化,提供一个公共的静态的获取实例方法,有一个静态实例。 一般分两种,饿汉式和饱汉式。饿汉式在单线程和多线程环境都不会有多个实例的问题出现,因为在类加载的时候唯一一次的实例化对象的操作,无论是否调用的类方法,始终存在唯一的一个该类实例。对于饱汉式,是属于懒加载或者说延迟加载模式,在多线程环境中可以会有多个实例被创建的危险,比较常用的解决方法是,内部静态类或者双重检查单例模式,详细的参考:http://www.cnblogs.com/zhangxz135/p/8982640.html

21. 简述下java有哪些代理,区别

22. 接口和抽象类的区别

23. 多态是怎么体现的

24. jdk8有哪些新特性

25. 数据库优化技巧

26. 数据库的备份和读写分离

27. java的封装特性,解释一下

28. servlet的工作原理

  servlet的相关类有servletConfig, servletRequest, servletResponse, servletContext. servletConfig包含有servlet工作需要的一些配置信息,而servletContext则相当于提供了servlet的工作场景,另外两个顾名思义就是请求和响应的实体,是数据传输的载体,当请求通过tomcat进入容器的时候,根据请求的url映射去调用对应的子容器,在到达servlet的service方法之前,还有可能要经过比如说,fileter链以及触发一些listener的操作。(参考《深入分析Java Web技术内幕--许令波》,个人的总结,感觉自己还没有理解透彻,有错漏请指正)

  其实在请求到达servlet之前,在tomcat中要经过好几层容器。首先是顶层的Engine,然后是Host,接着到达servlet的实际意义上的容器Context,然后里面就是一个个的Wrapper(Wrapper其实就是经过包装的servlet)。具体的tomcat体系架构参考:https://juejin.im/post/5a82a1d05188257a5a4cb418

29.