mysql的三大引擎是啥?
三大引擎区别redis的hash算法用的是啥?
redis使用一致性hash算法--murmurHash3算法和google的cityhash算法。
redis为什么比较快
1,redis使用是内存存储,不需要读取硬盘
2,redis使用的是单线程,避免线程切换对于效率的影响
3,简单的key-value数据存储方式,简单的数据类型(5种)
4,多路I/O复用模型
static关键字是什么意思,是否可以override一个static方法
1,static是修饰一个静态属性或者方法的,是这个类的所有实例共有的
2,不可以override一个static方法,子类不可以继承父类的private和static方法,自然也无法override
static方法可以使用一个非static变量么
不可以,static方法会在类加载的时候就初始化,这时候并不能初始化非static变量
java的数据类型有哪些?什么是自动拆箱装箱
1,java支持8中基本数据类型:byte、short、int、long、float、double、boolean、char
2,拆箱装箱是基本数据类型和对应包装类型的自动转换
接口和抽象类有什么区别
1,一个类可以实现多个接口,但是只能继承一个抽象类
2,接口中的方法都是抽象的,抽象类可以同时包含抽象的方法和非抽象的方法
3,实现接口的类,必须实现这个接口所有的方法,继承抽象类的类可以不全部实现,但是这样的话,这个类也必须是抽象类了
进程和线程的区别
A,进程是执行中的程序,线程是进程内部的一个执行序列,进行是CPU最小执行单元
B,一个进程包含多个线程
1,地址空间和其他资源:进程内的资源是相互独立的,其他进程不可见
2,通信:进程通过IPC通信,线程之间通过全局变量进行通信
3,调度和切换:线程之间的切换比进程之间的切换快的多
创建线程有几种烦方法?
1,继承Thread类
2,实现Runnable接口
3,显示Callable接口
4,通过线程池框架创建线程
线程有哪几种状态?各状态间如何转换?
A,新建、可运行状态、运行状态、死亡、阻塞状态、等待队列、锁池
1,新建 start() 变为 可运行状态
2,可运行状态 获取到CPU时间片 变为 运行状态
3,运行状态 CPU时间片用完 或 Thread.yield() 变为 可运行状态
4,运行状态 等待用户输入 或 Thread.sleep() 或 t2.join() 变为 阻塞状态
5,运行状态 wait() 变成 等待队列
6,运行状态 synchronized 变成 锁池
7,运行状态 run()方法结束 或 main()方法结束 或 异常退出 变成 死亡
8,阻塞状态 用户完成输入 或 sleep()时间结束 或 t2线程结束 变成 可运行状态
9,等待队列 notify() 或 notifyAll() 变成 锁池
10,锁池 拿到锁 变成 可运行状态
什么是死锁?死锁的必要条件是什么?
A,死锁是多个线程竞争获取同一资源而造成的相互等待的现象
B,死锁有4个必要条件
1,互斥条件:一个线程获取了某个资源之后,其他线程无法获取这个资源,只能等待
2,不剥夺条件:一个线程获取了某个资源之后,只能由这个线程自己放弃该资源,其他资源无法剥夺这个资源,只能等待
3,请求保持条件:一个线程获取了某个资源之后,其他线程等待该线程放弃这个资源,并且其他线程已经获取的资源不释放
4,循环等待条件:循环链中的线程获取到的资源同时被下一个线程请求
如何保证不死锁
多线程获取多资源的时候,统一的按照一样的顺序获取和释放
快速失败 fail-fast 和 安全失败 fail-safe 的区别是什么?
1,fail-fast 是指在迭代过程中,对集合对象结构进行了修改(增加、删除集合对象),则直接报错 Concurrent Modification Exception。
fail-fast原理:遍历过程中修改modCount+1,开始每次遍历的时候,查看当前modCount是不是之前的值,如果改变过就直接报错
2,fail-safe 不同,他不是直接对集合进行遍历的,而且是该集合复制一份,在这个复制集合上进行遍历,这样就不会出现Concurrent Modification Exception,但是缺点也很明显,这种方式对修改后的内容是不可见的。
HashMap的工作原理
1,hashMap是以键值对(key-value)的形式存储数据的
2,数据结果是数组+链表的方式
3,算出key的hash值,将value放置对应的数组位置,count++
4,如果key已经存在,将新的value替换原来的value
5,如何key不同,但是算出的key的hash值相同,将value放置对应的数组位置,count++,原来的值成为该位置的下一链表节点(hashMap中就是使用这种链表方式解决hash碰撞的)
HashMap 扩容机制
1,必须满足2个条件才能扩容:a)集合中的数量>=阈值 b)发生了hash碰撞
2,判断是否已经到了扩容最大值,如果是最大值了就不扩容了
3,扩容大小是当前大小的2倍
4,将原来的集合内容放置到新数组中
5,修改扩容后的阈值
ArrayList 扩容机制
1,arrayList有3种构造函数
a)无参数的构造 ArrayList():默认大小是10,超过需要扩容
b)参数Collection构造ArrayList(Collection<? extends E> c):默认大小是Collection的大小,超过需要扩容
c)参数initialCapacity构造ArrayList(int initialCapacity),默认大小initialCapacity,超过需要扩容
2,扩容后大小为当前大小的1.5倍
HashMap 和 HashTable 有什么区别?
1,hashMap支持key为null,凡是hashTable不支持
2,hashMap是线程不安全的,常用于单线程操作,hashTable是线程不安全,常用于多线程操作
3,hashMap因为是线程不安全的所以效率高一些,hashTable因为是线程安全的所以效率低一些
HashMap 和 ConcurrentHashMap 有什么区别?
1,ConcurrentHashMap 是对整个桶数组进行分隔分段加锁,HashTable 的关键字锁粒度更细,并发性能好,HashMap 压根儿没有锁
2,HashMap 支持键值为null,ConcurrentHashMap 都不允许为null
网友评论