1:线程生命周期
java中线程生命周期主要分为五种状态,分别是,新建状态,就绪状态,运行状态,阻塞状态,死亡状态。
当创建线程对象后,线程常用于新建状态,处于新建状态的线程调用satrt()(运行后状态切换为就绪状态)。就绪状态的线程,去竞争CPU资源,竞争成功之后切换为运行状态。处于运行状态的线程调用sellp或wait方法后,切换为阻塞状态,等到一定时间后或调用notify(),noitfAll()方法切换为就绪状态。
如果线程对象调用stop()切换为死亡状态。
2:SpringMVC常用注解
@Controller 类上注解,表示当前类是控制器。
@RestController 具备@Controller和@ResponnBody注解的功能。
@RequestMapping 放在类上表示类中所有控制方法映射路径都已配置文件开头。
如果放在方法上,表示当前控制单元的映射路径。
@ResponseBody注解:把方法返回值转换为json字符串,并放入到相应流中。
@CrossOrigin 允许跨域的注解
@RequestParam 可以设置请求参数名,默认值,是否必须包含的参数。
@RequestBody 把请求体中的json数据转换为对象。
3:Spring Ioc DI的解释回答
IOC 和 DI是同一间事情的两个名称。他们都强调的是一个过程。这个过程包含让SpringIoc容器实例化 Bean到Bean的属性注入值的整个过程。
Spring IoC是整个Spring框架的核心,Spring 框架 AOP等其他核心功能都是在Ioc基础上实现的。
4:HashMap(这里只有JKD1.8之后的)
hashMap底层是由 数组+链表+红黑树完成的,HashMap的存储形式是按照<K,V>键值对的形式存储,HashMap在做添加的时候,是通过HashCode计算Key的值来确定好自己要存储的位置而HashCode的计算方式是散列表,也就是说,有可能会出现两个Key不相等,但是被HashCoed计算出的值相等,存储位置相等,就会出现Hash冲突,比如可以通过数组下面用链表的方式存储,相等的Key存储到相同的地址会以链表的形式存储,但是存储的多了就会影响访问的速度。所以使用到了红黑树。
红黑树存储的底层原理是如果数组大于64或链表大于8时。就会转换为红黑树,以便提高访问的效率,当链表小于6时,他就会从红黑树变换为链表,也是为了加快访问效率。既解决了冲突,也能加快访问效率
也有其他办法来解决Hash冲突,比如在哈希,同时构造多个不同的Hash函数,等发生Hash冲突时使用第二个 ,第三个,等其他的哈希函数计算地址,知道不发射管冲突为止,虽然不容易发生聚集,但是增加了计算时间,也可以进行开放链址法,按照一定的 次序,从Hash表中寻找一个空闲的单元,然后把繁盛冲突的元素存入到该单元避免冲突等等。
如果存储数量多时进行扩容哦个,他会根据负载因子计算出需要存储存储的大小,HashMap中的负载因子,默认为0.75。当负载情况大于负载因子的时候,就会i进行扩容操作每次扩容操作,每次扩容量是上一次的两倍
也存在存储上线的二的三十一次幂。超过这个阈值也就不在音进行扩容操作
5:容器
容器:用来装数据的东西,它可以装指定好的任何类型
知道的集合
集合分为两大类。
集合分为collection跟Map,collection分为List,Set List又分为 ArrayLisy LinkList,Vector
Map分为HashMap,HashTable
ArrayLaist底层是由可变长数组来创建的。可变长数组实际的数组为扩容(1:创建新对象,2:将原有的元素拷贝到新数组中,默认扩容大小为(1.5倍)
具有随机访问能力,遍历效率高,中间插入删除效率低
LinkList底层双向非循环链表实现的,创建节点:将节点放入链表中,节点(上个节点地址 元素值 下个节点地址) 由这三个节点完成的
当第一次添加时,他会判断是否又上一个节点,如果没有,那么它的上一个地址就为Null,
当创建第二个节点对象时,判断出有上一个节点,那他就会为上一个节点赋值上一个节点的元素值,上一个节点的下一个节点地址就会赋值为下一个节点地址的元素值,
添加第三个节点时,它的上一个节点就是第二个节点的属性值,第二个节点的属性值就是下一个节点的上一个地址,如果没有在添加第三个,那么就会出现第三个的下一个节点为Null
中间插入删除的效率高,随机访问的效率低遍历效率高