小米的面试过程及面试题

                                    小米的面试过程及面试题

1.自我介绍

这个不用说了,自己介绍一下自己。


2.数据库MySql和SQLServer以及Oracle的区别?

他是看了我写了一篇这样的博客才问的,可惜我都忘了自己写了啥!吃亏了,博客太久了,都忘记看了。

----1.Oracle:最贵,功能最多,安装最不方便,Oracle环境里的其他相关组件最多,支持平台数量一般,使用中等方便,开发中等方便,运维中等方便,不开源,速度最慢,最安全。

----2.Microsoft SQL Server 2014:中等贵,功能最少,安装中等方便,Microsoft SQL Server 2014环境里的其他相关组件最少,支持平台最少,使用最方便,开发最方便,运维最方便,不开源,速度中等,一般安全。

----3.Mysql:免费,功能中等,安装最方便,Mysql环境里的其他相关组件数量中等,支持平台最多,使用最不方便,开发最不方便,运维最不方便,有开源版本,速度最快,最不安全。

二、

Oracle传统,跨平台,稳定,适合OLTP,最接近数据库设计范式,一致性处理是最好的,也是最复杂的。适合金融,电信等企业。要想用好并发挥其性能,对管理员的能力要求较高。另维护成本较高。SqlServer目前只能在Windows系列执行,限制其发展,所以在高可用,灾备,并发也受win的限制。优点是,操作简单,人员要求低,学习曲线低,据说纽交所使用中。MySql适合开发者,简单。不过随着Oracle的入主,功能越来越完善,又因为其宣布要开源,阿里开发了改进大数据库,性能和应用场景不断拓宽,未来前进可人。

Mysql 屌丝创业青年
Sqlserver 富二代 
Oracle 创一代+高富帅 ;

MySQL:瑞典MYSQLAB推出,关系型数据库,开源免费,适用于WEB网站、日志管理、数据仓库和嵌入式系统等小型系统。 SQLServer:微软Microsoft推出,关系型数据库,可视化、安全性与稳定性较好,适用于企业级海量数据存储查询。
Oracle:美国甲骨文公司推出,关系型数据库,跨平台,安全稳定,结构复杂,对管理员要求高,常用于金融、电信领域。 

3.数据库的左连接和右连接

1)左连接:只要左边表中有记录,数据就能检索出来,而右边有的记录必要在左边表中有的记录才能被检索出来

2)右连接:右连接是只要右边表中有记录,数据就能检索出来

4.数据库的视图,为什么要用视图?

视图其实就是select查询语句 通过关联查询或者其他查询组建起来的,他是多个表的查询结果集,使用视图可以提高一个程序的SQL效率,比平常使用select 更加便捷,我们可以直接select * from 视图VIEW 来获取,数据库也更容易维护更新

5.什么是事务?

事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

6.数据库如何获取表里最大值?

假如想要取得最大ID的name值(这里只是借ID为例 不用ordery by)

解决办法:select max(id) from db_name;

7.那获取第二大的呢?

 先递减排序获取前两条,再递增排序获取第一条

select * from (select recID from book order by recID DESC limit 0,2) as b order by b.recID ASC limit 0,1;

还有一种解法:
先获取它的最大值,再获取小于最大值的数,然后取最大值。因为这里用到了max函数,会造成对全表扫描,速度略慢些。
 

select max(recID) as SecondID  from book where recID<(select max(recID) from book);

8.短距离通信

因为我是物联网专业的,所以他问了一下物联网方面的知识。我给他介绍了短距离通信。

9.如何实现多线程服务器?

https://blog.csdn.net/fengsigaoju/article/details/56019956

如何实现多线程缓冲池?

通过队列来实现

https://blog.csdn.net/z55887/article/details/79060070

10.java的数组、List、map的区别?

数组是固定长度的,list不固定,map是基于key-values进行映射的。访问元素数组可以通过下标访问,list需要遍历,map可以通过Key值获取map的values。

11.链表反转

 1.链表内反转

节点的下一个元素插到节点之前。依次进行,

例如:

链表的第二个插到第一个之前,第三个插到第二个之前
https://blog.csdn.net/xiao__jia__jia/article/details/82788117

2.用栈实现

遍历链表,把每一个节点放到栈里面,遍历完,然后再出栈

public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}

import java.util.Stack;
public class ListNode {
    int val;
    ListNode next = null;
    ListNode(int val) {
        this.val = val;
    }
}//链表原结构

public class Solution {
    public ListNode do_reverse(Stack<ListNode> data)
    {
        ListNode ans=data.pop();
        if(data.empty())
        {
            ans.next=null;
            return ans;
        }
        ans.next=do_reverse(data);
        return ans;
    }//递归反转链表核心代码

    public ListNode ReverseList(ListNode head) 
    {
        if(head==null)
            return null;
        Stack<ListNode> data=new Stack<ListNode>();//下方循环将原链表所有节点压栈,方便反转
        while(true)//循环压栈
        {
            if(head.next==null)
            {
                data.push(head);
                break;
            }
            data.push(head);
            head=head.next;
        }
        return do_reverse(data);//调用核心反转函数

    }//采用栈结构,调用核心反转函数代码
}


 

12.实现线程的方式

1.继承Thread类。

2.实现Runnable,然后重写run方法。

两种方式的区别。

1.一个类只能继承一个父类,如果已经继承了Thread,就无法继承其他的了,所以一般用runnable.

2.使用Runnable可以避免点继承的局限,一个类可以继承多个接口。

猜你喜欢

转载自blog.csdn.net/xiao__jia__jia/article/details/82808594