- 当你在百度搜索框输入一个关键字到搜索结果出来,百度的后端都做了什么?
- 堆上的内存和栈上的内存有什么区别。用java举例,哪些情况下会分配到栈上,哪些情况下会分配到堆上?
- 进程和线程
- 浏览器输入一个url到目标网站显示出来,操作系统和网络层分别做了什么?
- 数组与链表的区别及其使用场景。
简答题:
-
当你在百度搜索框输入一个关键字到搜索结果出来,百度的后端都做了什么?
搜索引擎工作原理:当我们在输入框中输入关键词,点击搜索或查询时,然后得到结果。深究其背后的故事,搜索引擎做了很多事情。
在搜索引擎网站,比如百度,在其后台有一个非常庞大的数据库,里面存储了海量的关键词,而每个关键词又对应着很多网址,这些网址是百度程序从茫茫的互联网上一点一点下载收集而来的,这些程序称之为“搜索引擎蜘蛛”或“网络爬虫”。这些勤劳的“蜘蛛”每天在互联网上爬行,从一个链接到另一个链接,下载其中的内容,进行分析提炼,找到其中的关键词,如果“蜘蛛”认为关键词在数据库中没有而对用户是有用的便存入数据库。反之,如果“蜘蛛”认为是垃圾信息或重复信息,就舍弃不要,继续爬行,寻找最新的、有用的信息保存起来提供用户搜索。当用户搜索时,就能检索出与关键字相关的网址显示给访客。
一个关键词对用多个网址,因此就出现了排序的问题,相应的当与关键词最吻合的网址就会排在前面了。在“蜘蛛”抓取网页内容,提炼关键词的这个过程中,就存在一个问题:“蜘蛛”能否看懂。如果网站内容是flash和js,那么它是看不懂的,会犯迷糊,即使关键字再贴切也没用。相应的,如果网站内容是它的语言,那么它便能看懂,它的语言即SEO。 -
堆上的内存和栈上的内存有什么区别。用java举例,哪些情况下会分配到栈上,哪些情况下会分配到堆上?
栈(stack):有编译器自动分配和释放,存放函数的参数、局部变量、临时变量、函数返回地址等;
堆(heap):一般有程序员分配和释放,如果没有手动释放,在程序结束时可能由操作系统自动释放(针对java而言)。
堆(Heap)里存的是所有Java对象(引用类型的变量),而栈(Stack)里存的一般是Java的基本类型,如:boolea,char ,byte,short,int,long,float,double。 -
进程和线程
-
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。
-
线程是进程的一个实体,是cpu调度和分配的基本单位,只拥有一点在运行中必不可少的资源(计数器,寄存器,栈),但它可以与同属一个进程的其他线程共享进程所拥有的全部资源。
-
区别:
1.一个线程必定属于也只能属于一个进程,而一个进程可以拥有多个线程,并且至少拥有一个线程
2.属于一个进程的所有线程共享该线程的所有资源
3.线程被称为轻量级进程,线程间切换代价小,进程间切换代价大
4.进程是程序的一次执行,线程可以理解为程序中的一个程序片段的执行
5.每个进程都有独立的内存空间,而线程共享其所属进程的内存空间
总之,一个程序至少有一个进程,一个进程至少有一个线程。
-
浏览器输入一个url到目标网站显示出来,操作系统和网络层分别做了什么?
总体来说分为以下几个过程:
DNS 解析:将域名解析成 IP 地址
TCP 连接:TCP 三次握手
发送 HTTP 请求
服务器处理请求并返回 HTTP 报文
浏览器解析渲染页面
断开连接:TCP 四次挥手 -
数组与链表的区别及其使用场景。
编程题
- 给定两个字符串,检查这两个字符串是否仅包含相同的字母。
public class Main {
public static void main(String[] args) {
System.out.println(isRepeated("bulter", "urlk"));
}
public static boolean isRepeated(String s1, String s2){
HashMap map = new HashMap<Character, Integer>();
for(int i = 0; i < s1.length(); i++){
char c = s1.charAt(i);
if(!map.containsKey(c)){
map.put(c, i);
}
}
for (int i = 0; i < s2.length(); i++) {
if (!map.containsKey(s2.charAt(i)))
return false;
}
return true;
}
}
- 判断一个日期是一年中的第几天。