1、HashMap的时间复杂度分析
put操作的流程:
第一步:key.hashcode(),时间复杂度O(1)。
第二步:找到桶以后,判断桶里是否有元素,如果没有,直接new一个entey节点插入到数组中。时间复杂度O(1)。
第三步:如果桶里有元素,并且元素个数小于6,则调用equals方法,比较是否存在相同名字的key,不存在则new一个entry插入都链表尾部。时间复杂度O(1)+O(n)=O(n)。
第四步:如果桶里有元素,并且元素个数大于6,则调用equals方法,比较是否存在相同名字的key,不存在则new一个entry插入都链表尾部。时间复杂度O(1)+O(logn)=O(logn)。红黑树查询的时间复杂度是logn。
通过上面的分析,我们可以得出结论,HashMap新增元素的时间复杂度是不固定的,可能的值有O(1)、O(logn)、O(n)。
2、关于Java中HashTable和HashMap的区别:
1、继承: HashTable继承自Dirctionary,HashMap继承自AbstractMap,二者均实现了Map接口; 2、线程安全性: HashTable的方法是同步的,即是线程安全的。HaspMap的方法不是同步的,不是线程安全的的。在多线程并发的情况下,我们可以直接使用HashTable,如果 要使用HashMap,就需要自行对HashMap的同步处理。 3、键值: HashTable中不允许有null键和null值,HashMap中允许出现一个null键,可以存在一个或者多个键的值都为null。程序中,对于HashMap,如果使用get(参数为 键)方法时,返回结果为null,可能是该键不存在,也可能是该键对应的值为null,这就出现了结果的二义性。因此,在HashMap中,我们不能使用get()方法来查询键 对应的值,应该使用containskey()方法。 4、遍历: 这两个在遍历方式的实现不同。HashTable和HashMap两者都实现了Iterator。但是,由于历史原因,HashTable还使用了Enumeration。 5、哈希值: HashTable是直接使用对象的hashCode。HashMap是重新计算hash值。 6、扩容: HashTable和HashMap的底层实现的数组和初始大小和扩容方式。HashTable初始大小为11,并且每次扩容都为:2old+1。HashMap的默认大小为16,并且一 定是2的指数,每次扩容都为old2。
3、为什么用B+树存储索引而不是Hash索引?Hash索引它O(1)不是更快吗?
查询单条数据确实Hash索引快,但同上,B+树支持 范围查询 ,而Hash索引做不到。
而且数据库索引一般存储在磁盘中,加载进内存中如果数据量大的话 无法一次装入内存 ,B+树的设计可以允许数据 分批加载 ,同时树的高度较低,提高查找效率。
4、BST(二叉搜索树)
BST(Binary Search Tree)目的是为了提高查找的性能,其查找在平均和最坏的情况下都是logn级别,接近二分查找。
其特点是:每个节点的值大于其任意左侧子节点的值,小于其任意右节点的值
5、Mysql回表
回表就是先通过数据库索引扫描出数据所在的行,再通过行主键id取出索引中未提供的数据,即基于非主键索引的查询需要多扫描一棵索引树。
什么时候需要回表?什么时候不需要回表? 答:聚簇索引和覆盖索引不需要回表,其他情况都需要回表
6、联合索引
当我们的where查询存在多个条件查询的时候,我们需要对查询的列创建组合索引
最左匹配原则
只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用复合索引时遵循最左前缀集合,所以在建立联合索引的时候查询最频繁的条件要放在左边
7、linux常用命令
shutdown ===关机 reboot ==重启 目录切换===cd 目录查看===ls
创建目录===mkdir 删除目录===rm help==帮助 man==说明书
目录修改===mv 搜索目录===find 查看当前工作目录==pwd
新增文件==touch 删除文件===rm 复制文件==cp 修改文件===vim 文件查看===cat/more/less/tail/head
修改权限===chmod
压缩文件===tar 查找命令===grep/find/locate/whereis/which
切换用户===su/sudo
==================================0==================================
显示磁盘==df -l 文件或目录磁盘的使用===du
创建连接===ln -s(软连接,无S硬) 时间==date
查看当前运行的进程状态,一次性===ps
显示当前系统正在执行的进程的相关信息,包括进程ID、内存占用率、CPU占用率等==top
kill 显示系统内存使用情况====free
==================================0======================================
显示文件详细信息==stat who===在线登录用户 whoami===操作用户
主机名==hostname 系统信息===uname 查看网络情况====ifconfig
测试网络连通===ping 显示网络状态信息===netstart
8、java基础之ArrayList和Vector的主要区别
List接口下一共实现了三个类:ArrayList,Vector,LinkedList。 LinkedList主要保持数据的插入顺序的时候使用,采用链表结构。
ArrayList,Vector主要区别为以下几点: (1):Vector是线程安全的,源码中有很多的synchronized可以看出,而ArrayList不是。导致Vector效率无法和ArrayList相比; (2):ArrayList和Vector都采用线性连续存储空间,当存储空间不足的时候,ArrayList默认增加为原来的50%,Vector默认增加为原来的一倍; (3):Vector可以设置capacityIncrement,而ArrayList不可以,从字面理解就是capacity容量,Increment增加,容量增长的参数。
9、排序
10、拥塞控制
TCP的四种拥塞控制算法 1.慢开始
一开始注入的报文段少,cwnd慢慢增加 1-2-4-8,收到多少个确认报文,就增加多少个cwnd,若当前的拥塞窗口cwnd的值已经等于慢开始门限值,之后改用拥塞避免算法
2.拥塞避免
就是每个传输轮次,拥塞窗口cwnd只能线性加一
只要网络出现拥塞(没有按时到达)时,就把ssthresh的值置为出现拥塞时的拥塞窗口的一半(但不能小于2),以及cwnd置为1,进行慢开始。
3.快重传
连续收到3个重复的确认报文端,就认为是拥塞发生了
收到三个确认,发送方尽快进行重传,不需要等待超时重传定时器溢出
4.快恢复
降低满开始和拥塞窗口的值为一半,将CWND设置为新的ssthresh(减半后的ssthresh),然后开始执行拥塞避免算法
<