1、框架(spring,springmvc,struts,mybatis,hibernate)
2、数据库(mysql,oracle)
3、多线程
4、设计模式
5、消息中间件(activemq,rabbitmq,kafka)
6、缓存(redis,memcached,mongodb)
//
1、StringBuffer和StringBuilder的使用场景:StringBuffer线程安全适合多线程环境中使用,但是速度比不上StringBuilder;StringBuilder线程不安全但是速度快,适合在单线程中使用。
2、IO与NIO区别:IO面向的是stream,阻塞IO:当一个线程调用read(),write()方法时,每次读一个或者多个字节,直至读取所有的字节,没有缓冲区域;NIO面向的是buffer:数据会读取到一个缓冲区域,需要判断缓冲区是否有所需的数据。,非阻塞IO:当一个线程调用read(),write()方法时,如果缓冲区没有所需的数据,不会阻塞,线程会去处理其他操作,直到有所需数据。NIO还有一个选择器selectors,它允许一个单独的线程来监视所有的通道。
3、ArrayList和LinkedList区别和底层原理:ArrayList查询快,增删慢,因为底层是通过数组实现的,get下标很快就能查找到,但是新增的时候会去判断数组的长度,如果不不够,需要扩容,长度为原数组的1.5倍 + 1,然后把原数组的元素复制到新的数组中。删除的时候后面的元素会往前移动。所以查询快,增删慢。LinkedList的查询慢,但是增删快,因为它的底层是通过链表(双向循环链表)的形式实现的,内存地址不连续,所以查询会去遍历,新增或者删除的时候,只需要改变节点的指针(前后对象的引用)就行了。
4、为什么说redis快?redis是一个基于内存的数据结构存储系统,可以存储的数据类型有String,Hash,List,Set等,为什么说它快,是因为 1、基于内存;2、采用的单线程;3、数据结构简单;4、非阻塞IO 等。
5、memcached:也是一个基于内存的缓存系统,宕机或者重启都会导致数据消失,key-value的存储方式,value只能为简单的String类型,有大小限制。没有有效的数据过期机制,只有去获取的时候才知道数据是否已过期。
6、java的四种引用方式,强引用:例 Object obj = new Object(); 就算是运行内存不足时,jvm的垃圾回收器也不会回收掉它。会报OutOfMemery异常。软引用:SoftReference soft = new SoftReference (new Object()); 当运行内存不足时,gc会回收掉它;弱引用:WeakReference weak = new WeakReference(new Object()); 不管内存充足与否,在jvm进行垃圾回收时,都会回收掉它。虚引用:PhantomReference ,它并不影响对象的生命周期,任何时候都能被回收掉。
7、四种垃圾回收器:
8、ThreadLocal:线程本地变量,使用它维护变量的时候会给每个使用该变量的线程都维护一个变量副本,线程只能访问自己的。保证了线程安全。有get(),set(),remove(),initialValue()方法。 它有一个ThreadLocalMap对象,来存储变量的。
9、synchronized和lock有什么区别:synchronized是一个java关键字,a获取锁,b就等待,如果a阻塞,b就一直等待。适用于少量同步,lock是一个类,获取锁时不需要等待,必须在finally里面释放锁,不然会造成死锁,适用于大量同步。