对象序列化
-
什么是序列化
序列化就是把对象转化为字节序列的过程,实质上就是一个byte[]数组。 -
为什么需要序列化 网络传输用,包括文本、图片、音频和视频等,在网络上都是以字节序列的形式传输。
-
怎么序列化
实现serializable接口或者Externalizable,区别是前者是自动序列化,后者是手动序列化。- 什么是serialVersionUID常数
唯一标识可序列化类的版本。 - transient
修饰无需序列化的属性(只可以修饰属性不可以修饰方法和类)
- 什么是serialVersionUID常数
反射机制
代理
- 反向代理
- Nginx(反向代理服务器)
- 代理模式
- 静态代理和动态代理
- 负载均衡
JAVA基础
-
java对象在内存的结构
-
装箱和拆箱
深入剖析Java中的装箱和拆箱
需要注意,Integer装箱的时候,在value处于[-128,127]时,会直接取IntegerCache缓存的数据。 -
Integer的取值范围
-
java中负数的表示方式
-
byte的取值范围为什么是-128~127
-
ArrayList相关
- 初始容量:10,在new的时候只是创建一个空数组,在第一次插入时,才分配空间。
- 扩容容量:当前容量 1.5 倍,如果扩容1.5倍不够,那么扩容到预计容量。
- 先扩容,再插入
- 适用于查询多的场景,插入头部时,性能没有linkedlist好,如果每次都插入尾部或者中后部,其实插入性能也尚可。
- failFast机制:用modCount记录修改的次数,在迭代器里使用,起到了乐观锁的作用,如果不匹配的话,抛出异常。
-
LinkedList相关
- 保留了head和tail节点
- 插入和删除比较方便
- 但是整体内容空间大于数组,因为保存了pre和next节点
- 同样支持failFast机制
- 无需考虑扩容
- 支持Deque,支持队列,队列的方法,offer、peek、poll等
-
ArrayList和LinkedList的异同
- ArrayList:底层是Object数组实现的:由于数组的地址是连续的,数组支持O(1)随机访问;数组在初始化时需要指定容量;数组不支持动态扩容,像ArrayList、Vector和Stack使用的时候看似不用考虑容量问题(因为可以一直往里面存放数据);但是它们的底层实际做了扩容;数组扩容代价比较大,需要开辟一个新数组将数据拷贝进去,数组扩容效率低;适合读数据较多的场合
- LinkedList:底层使用一个Node数据结构,有前后两个指针,双向链表实现的。相对数组,链表插入效率较高,只需要更改前后两个指针即可;另外链表不存在扩容问题,因为链表不要求存储空间连续,每次插入数据都只是改变last指针;另外,链表所需要的内存比数组要多,因为他要维护前后两个指针;它适合删除,插入较多的场景。另外,LinkedList还实现了Deque接口。
-
hashMap原理
-
初始容量:16,如果传入的不足16,取最近的2的幂
-
hash和rehash
-
多线程下死锁问题
-
和hashtable的区别
-
和concurrentHashMap的区别
-
DOS攻击
-
解决hash冲突的方法
- 开放定址
- 再hash
- 拉链
- 建立公共溢出区
-
-
concurrentHashMap从1.7到1.8的演进
从ConcurrentHashMap的演进看Java多线程核心技术 -
B/B+树
平衡二叉树、B树、B+树、B*树 理解其中一种你就都明白了
B树和B+树的插入、删除图文详解
为什么Mongodb索引用B树,而Mysql用B+树