华为面试总结

前言

生涯的第一次面试就献给了华为,足以可见华为在我心中的分量。刚结束实训就看到了陆陆续续的大公司的实习生招聘讯息,于是抱着试一试的心态便投了几家公司。

面试

在通过了简历筛选和在线笔试后,我接到了华为公司的面试通知。我很好奇为什么华为的短信通知都是在晚上而且是同一时间点,大约七点半左右。

面试当天,早上翘掉最后一节课后我便出发前往远在郫县的华为公司总部。在经历了两次转车大约两个半小时的车程后,我终于到达了面试的目的地。正式面试前是一系列的接待手续,从整个流程来看华为公司可谓是名不虚传,高大上的建筑、一流的服务、专业的办公手续等给我都留下了不错的印象。

在等待了大概半小时后,我被面试官叫进了一间屋子,里面摆了很多小桌,每张小桌都坐着一位考官和面试者。我的考官是一位看着十分“程序员”的程序员,穿着笔挺的西装、带着小眼睛、留着小胡子,典型的IT男风貌。第一次面试,对于很多东西都没有经验的我显得特别的紧张,下意识摸了摸自己的脸,烫的不行。

考官一开始便问起了我的项目经历,我一开始很紧张,支支吾吾地把我简历上写的两个项目经历做了一个简单的介绍。然后,技术面试正式开始了。由于我简历上填的是JAVA方向,所以考官便从JAVA的基础考起。

第一个问题是问的我线程的创建方式有几种,分别是什么?我回答了我平时写程序常用的两种,第三种我就不知道了,随后考官告诉我是实现Callable接口,我承认自己的确在这方面有所不足,现整理如下。

  • 继承Thread类,重写run方法。启动方法:创建子类对象+对象调用start方法。
  • 实现Runnable接口,重写run方法。启动方法:使用静态代理,先创建真是角色,再用真是角色创建代理角色,最后代理角色调用start方法。好处:避免单继承的局限性,便于共享资源。
  • 实现Callable接口,重写call方法。优点:可以返回值,抛出异常。缺点:实现繁琐。

第二个问题,多线程之间的通信方式有哪些。当听到这个问题时,我是懵的,因为操作系统的时候我就没学好线程通信方面的东西,所以我不知道该如何回答他。现整理如下。

  • 同步,这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信。
  • while轮询方式
  • wait/notify机制
  • 管道通信

第三个问题,解释JVM的栈和堆,对于这题我还是很顺利地做出了满意的回答。整理如下。

  • 堆区:
    1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
    2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
  • 栈区:
    1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
    2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
    3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
  • 方法区:
    1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
    2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

第四个问题,JVM参数设置的意义。之前知道配置文件是要配这些参数的,但是参数的值是多少,为什么是这个值我就不知道了。现整理如下。

  • xms:初始化JVM堆内存分配大小,默认是物理内存的1/64。
  • xmx:最大堆内存分配大小,默认是物理内存的1/4。
  • 默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制。
    空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx 相等以避免在每次GC 后调整堆的大小。

第五个问题,socket分类及数据传输的流类型。socket套接字编程之前我是有所接触的,但是很多东西在当时并不能想起来,所以我并不能回答出这个问题。现整理如下。
- socket主要操作模式有两种,一种是面向连接的,一种是无连接的。前者是在数据传输前建立连接,能够确保数据的可靠性和安全性,但是连接建立需要额外的开销,因此会降低响应速率。后者的操作是使用的数据报协议,无连接的操作是快速、高效的,但是数据安全性不佳。
- 程序中的数据主要通过流来传输,大致分为字节流和字符流。其中InputStream,OutputStream分别适用于在字节流中输入和输出数据,Reader,Writter分别适用于在字符流中输入和输出数据。

第六个问题,异常分类及区别。首先异常的分类我能回答,但是考官让我区分两个进程通过socket进行通信,如果不能建立连接,那么这个异常属于什么?听到这个问题,我思考了一会然后给出了运行时异常的答案。现整理如下。

  • 异常分为运行时异常和非运行时异常。运行时异常,属于不检查异常,程序中可以捕获处理,也可以不处理,通常是由程序的逻辑引起。常见的运行时异常有,空指针、数组越界、类转换异常、数据存储异常和缓冲区溢出异常。
  • 非运行时异常又称为需检查异常, 从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

感想

还是挺感激能有这次面试机会的,它让我经历了一次完整的面试,体验了整个面试的流程。虽然最后的结果让我很失望,但是它提醒了我在基础知识方面的薄弱和不重视,也找到了自己与其他面试者的差距。

未来的面试机会还有很多,希望我能够从中汲取经验、再接再厉,最终拿到一个满意的offer。

你可能感兴趣的:(学习)