各种面试8.17

Posted fengli9998

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了各种面试8.17相关的知识,希望对你有一定的参考价值。

红黑树的应用场景:

https://blog.csdn.net/zuochao_2013/article/details/80562092

红黑树的五个性质: 
一般的,红黑树(一棵自平衡的排序二叉树),满足以下性质,即只有满足以下性质的树,我们才称之为红黑树: 
1)每个结点要么是红的,要么是黑的。 
2)根结点是黑的。 
3)每个叶结点,即空结点(NIL)是黑的。 
4)如果一个结点是红的,那么它的俩个儿子都是黑的。 
5)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。

抓住了红黑树的那5个性质,分开记忆。 
如, 
1.红黑红黑,要么是红,要么是黑; 
2.根结点是黑; 
3.每个叶结点是黑; 
4.一个红结点,它的俩个儿子必然都是黑的; 
5.每一条路径上,黑结点的数目等同。 
五条性质,合起来,来句顺口溜就是:(1)红黑 (2)黑 (3)黑 (4&5)红->黑 黑 
二、运用场景 
java中的TreeSet,TreeMap,广泛用在C++的STL中。如map和set都是用红黑树实现的

hash表处理冲突的方法:

https://blog.csdn.net/liutong123987/article/details/79225861

1.开放定址法(再散列法):

2.再哈希法

3.拉链法(HashMap的冲突处理方式)

基本思想: 将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要,在同义词链中进行。链地址法适用于经常进行插入和删除的情况。

4.建立公共溢出区:

  这种方法的基本思想是:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表

java有哪些容器:

JAVA的容器---List,Map,Set 
Collection 
├List 
│├LinkedList 
│├ArrayList 
│└Vector 
│ └Stack 
└Set 
Map 
├Hashtable 
├HashMap 
└WeakHashMap

http状态码:

https://blog.csdn.net/zhongshuaisun/article/details/77988089

? 100 - Continue 初始的请求已经接受,客户应当继续发送请求的其余部分。(HTTP 1.1新) 
? 101 - Switching Protocols 服务器将遵从客户的请求转换到另外一种协议(HTTP 1.1新) 

  • 200 - 请求成功
  • 301 - 资源(网页等)被永久转移到其它URL
  • 404 - 请求的资源(网页等)不存在
  • 500 - 内部服务器错误

如何判断链表中是否有环:

https://www.cnblogs.com/ghimtim/p/4882916.html

如果一个单链表中有环,用一个指针去遍历,永远不会结束,所以可以用两个指针,一个指针一次走一步,另一个指针一次走两步,如果存在环,则这两个指针会在环内相遇,时间复杂度为O(n)。

思维扩展:这里用到了快慢指针来判断单链表是否有环,快慢指针还能快速解决其他链表问题。

一:已知单链表的头指针,查找到倒数第K个节点

这道题的通俗的解法就是先遍历一边链表,得到链表的长度N,然后再从头开始遍历N-K个节点即可

但是现在如果要求只遍历一遍链表的话,该怎么操作呢?

这时候就可以借助快指针和慢指针了

我们定义一个快指针P和慢指针Q,先让P指针走到K个节点位置,然后Q指针从头指针开始和P一起移动,当P移动到尾部的时候,那么此时Q节点所在的位置就是倒数第K个节点。

 

二:已知单链表的头结点,查找到链表的中间节点

这道题的通俗的解法和上面的方法一样,就是先遍历一边链表,得到链表的长度N,然后再次遍历N/2个节点即可

但是现在同样的如果要求之遍历一边链表的话,该怎么操作呢?

这时候我们同样可以借助快指针和慢指针了

我们定义一个快指针P和慢指针Q,P和Q同时从头指针出发,快指针P每次移动两步,慢指针每次移动一步,当快指针P到尾部的时候,慢指针Q所在的位置就是中间节点的位置。

池的概念:

1.池,说白了就是提前创建好了东西放在池子里,你直接去池子里拿去用就行了,有现成的可用的,节省了你临时创建的时间。

2.jdbc connection,线程thread,对象,这些东西的创建和销毁都是很消耗时间的,所以我们一般都是提前创建好很多这种创建消耗高的东西,用的时候直接去用就行。

3.数据库连接池用的地方是:mybatis/hibernate这种sql语句操作时,临时创建connection是很消耗时间的,所以为了提高获取数据库数据的效率,在开机阶段都创建很多connection。且connection是tcp长连接的,这些数据库连接池中的connetcion可以存货很长时间。

可以设置connection的maxage,数据库连接池c3p0等,都有保持connection连接存货的机制,通过connecton发送空数据包保证connection存活。

 

4.线程池:线程池,主要是因为thread的创建和销毁是要消耗时间的,thread创建大概消耗0.02秒。java ee服务器在启动的时候,它已经创建好了很多的thread,用以来http request连接的时候,用这些创建好的thread去处理这些http连接。这些都是tomcat已经帮你做好的功能,Apache早就写好了类似的代码。

当处理Io操作时,我们习惯用线程池,因为io操作是阻塞的。所以就是在处理阻塞方法时,我们用多线程来提高效率。

 

5.常量池:字符创常量池,string那些具体final对象,下次用直接去常量池拿就行,很快 ,免去再次创建。string name="tom";

 

6.因为池子的特性是容纳多个数据,所以池子都是list等集合类,因为要一直保持住这些数据,所以list这些集合类,又要一直保存在内存中,所以很消耗资源的,并且得是静态的来保证常驻内存。

 




























以上是关于各种面试8.17的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发各种底层实现--面试必备!

面试之葵花宝典

Python面试必考重点之字符串与正则表达式第五关——字符串居中显示的各种方法

面试题: 各种 !=!=未看

js前端的各种面试题

面试中遇到的问题