第一轮
- 静态库和动态库如何制作及使用,区别是什么
https://blog.csdn.net/qq_38526623/article/details/110928986
制作与使用:
静态库:
gcc获得.o文件 ->将.o文件打包,使用ar工具(archive)->编译和链接
动态库:
gcc得到.o文件,得到和位置无关的代码->gcc得到动态库->编译和链接
区别:
● 静态库是在程序链接阶段被复制到程序中,动态库是在程序运行时被加载到内存中被调用。
● 静态库加载速度快,可移植性高,但是比较消耗系统资源,更新部署发布比较麻烦。
● 动态库加载速度慢,移植需提供动态库。进程间资源共享,更新、部署、发布比较简单。 - 说一说HashMap的实现原理
在jdk1.7之前HashMap是基于数组和链表实现的,而且采用头插法。
而jdk1.8 之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。采用尾插法。
HashMap默认的初始化大小为 16。当HashMap中的元素个数之和大于负载因子*当前容量的时候就要进行扩充,容量变为原来的 2 倍。(这里注意不是数组中的个数,而且数组中和链/树中的所有元素个数之和!) - Serializable接口为什么需要定义serialVersionUID常量
serialVersionUID常量用于标明当前Serializable类的版本,以验证加载的类和序列化对象是否兼容。
在进行序列化时会将当前类的serialVersionUID写入到字节序列中,在反序列化时会将当前字节流中的serialVersionUID同本地对象中的serialVersionUID进行对比,如果相同则继续序列化,如果不同则失败报错。
serialVersionUID常量值默认为1L。 - 说一说zset类型的底层数据结构
zset底层的存储结构包括ziplist或skiplist,在同时满足有序集合保存的元素数量小于128个和有序集合保存的所有元素的长度小于64字节的时候使用ziplist,其他时候使用skiplist。
当ziplist作为zset的底层存储结构时候,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个元素保存元素的分值。
当skiplist作为zset的底层存储结构的时候,使用skiplist按序保存元素及分值,使用dict来保存元素和分值的映射关系。 - 给你一个大小为 n 的字符串数组 strs ,其中包含n个字符串 , 编写一个函数来查找字符串数组中的最长公共前缀,返回这个公共前缀。