Please enable Javascript to view the contents

【中科创达】Java方向

 ·  ☕ 9 分钟

一面

2021-03-10

今天是我的第一次面试,面试的时候好紧张,当时说话语无伦次,好多问题感觉都非常基础了,但就是脑子里想的毫无逻辑,用语言也表达不清楚。这次表现的不太好,不过也挺有纪念意义的,本文总结了这次面试的问题,希望下次会有一个更好的面试结果。

一开始先是自我介绍环节

额、嗯、然后、等词太多,方言味太重,自我介绍内容太少

自我介绍模板:

向面试官问好。

我叫xxxx,来自xxxx,是 xxxxx 大学 xxxxx 学院 xxxxx 专业的一名21级应届生,衷心感谢您能给这次我面试的机会。

在四年的大学生活中,学了…….课程,参加过…….比赛,获得过…….证书,目前熟悉的编程语言是 Java 和 Python,希望通过这次面试能学到一些相关的专业知识。

业余爱好,跑步(成就)、看书(看过哪些书)、听书(谁的什么书)

然后就到了面试官提问环节

  1. 面向对象的三大特征

    答成了抽象、封装继承、多态

    1. 继承

      继承就是让一个类型对象获得另一个类型对象的属性的方法,并且支持多级继承

    2. 封装

      封装就是把客观事物封装起来变成抽象的类,这个类可以把自己的属性和方法提供给可信的类或对象操作使用,并对不可行的类进行信息隐藏

    3. 多态

      多态就是指一个类实例对象的相同方法在不同情形下被调用所展现的不同形式

  2. 抽象类和接口区别

    回答不全,不熟练

    使用时的共同点

    1. 抽象类或接口必须定义子类
    2. 子类必须覆写抽象类或接口的全部抽象方法
    3. 通过子类的向上转型实现抽象类或接口的对象实例化
  3. 抽象类能不能用final修饰

    不能,抽象类是被用于继承的,final修饰代表不可修改、不可继承的。

  4. 重载和重写区别

    “那个那个…..”说话不流畅

    重载规则:必须具有不同的参数列表; 可以有不同的返回类型;可以有不同的访问修饰符;可以抛出不同的异常。

    重写规则:参数列表必须完全与被重写的方法相同,否则不能称其为重写;返回类型必须一直与被重写的方法相同,否则不能称其为重写;访问修饰符的限制一定要大于等于被重写方法的访问修饰符;重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常,譬如父类方法声明了一个检查异常 IOException,在重写这个方法时就不能抛出 Exception,只能抛出 IOException 的子类异常,可以抛出非检查异常。


    重载与重写是 Java 多态性的不同表现

    • 重写是父类与子类之间多态性的表现,在运行时起作用(动态多态性,譬如实现动态绑定)
  • 而重载是一个类中多态性的表现,在编译时起作用(静态多态性,譬如实现静态绑定)。
  1. StringBuffer、StringBuilder、String的区别

    String 字符串常量
    StringBuffer 字符串变量(线程安全)
    StringBuilder 字符串变量(非线程安全)

    String提供了数值不可变的字符串,StringBuffer 、StringBuilder中的字符串可以进行修改

  2. HashMap的底层实现

    不全

    1. 底层是哈希表

    2. 数组+单向链表

    3. 源码

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      
      public class HashMap<K,V>{
          //数组
          transient Node<K,V>[] table;
          //链表
          static class Node<K,V> implements Map.Entry<K,V> {
              final int hash;
              final K key;
              V value;
              Node<K,V> next;
          }
      }
      
    4. 同一个链表的hash值相等

    5. 放在HashMap中的元素需要重写equals和hashCode方法

    6. map.put(k,v)

      1. 封装node对象
      2. 调用hashCode()方法获取哈希值
      3. 通过哈希函数转化成数组下标
      4. 下标处没有元素,直接将Node添加到这个位置
      5. 有元素,在链表每个节点进行euquals()比较,如果全为false,在末尾添加,如果有True,更新Value
    7. map.get(k)

      1. 调用hashCode()方法获取哈希值
      2. 通过哈希函数转化成数组下标
      3. 下标处没有元素,返回None
      4. 下标有链表,对链表元素的Key比较equals,有true返回value,全为false,代表没有元素,返回null
    8. 扩容是原来长度的2倍

    9. 允许key值为null

  3. 链表上元素个数超过8个会怎么样

    不全

    推荐文章HashMap底层实现原理解析

    当hash表的单一链表长度超过 8 个的时候,链表结构就会转为红黑树结构。其访问性能近似于折半查找,时间复杂度 O(logn),增加查询效率。

  4. 什么情况下红黑树又会变回链表

    不会

    TreeNodes(红黑树)占用空间是普通Nodes(链表)的两倍,为了时间和空间的权衡。

    节点的分布频率会遵循泊松分布,链表长度达到8个元素的概率为0.00000006,几乎是不可能事件

    为什么转化为红黑树的阈值8和转化为链表的阈值6不一样?是为了避免频繁来回转化。

  5. 红黑树原理

    不会

    1. 每个节点要么是红色,要么是黑色,但根节点永远是黑色的
    2. 每个红色节点的两个子节点一定都是黑色
    3. 红色节点不能连续(也即是,红色节点的孩子和父亲都不能是红色)
    4. 从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点
    5. 所有的叶节点都是是黑色的(注意这里说叶子节点其实是上图中的 NIL 节点)
  6. 线程和进程的区别

线程是进程划分成的更小的运行单位,一个进程在其执行过程中可以产生多个线程。多个线程共享进程的堆和方法区,每个线程有独立的程序计数器、栈。

  1. 线程的实现方式

    参考文章Java实现多线程的四种方式

    1. 继承Thread类的方式
    2. 实现Runnable接口的方式
    3. 实现Callable接口
    4. 使用线程池
  2. start 和 run方法 的区别

    “那个那个……”太多

    • start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码
    • run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码
  3. thread调用start和runable调用run的区别

    不会

    Thread的start():

    启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行

    Runnable的run():

    线程的线程体方法。所有线程类都必须实现的run()方法

  4. sleep 和 wait 的区别

    回答的应该不对

    • wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁
    • sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedException异常;
  5. ArrayList 中存储的student 对象,把它取出来后,对其中的变量进行修改后,集合里原本存储的对象会改变吗,有什么方法防止这种改变吗

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    class Student{
        private int id;
        public Student(int id) {
            this.id = id;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
    }
        
    public class Test {
        public static void main(String[] args) {
            ArrayList<Student> students=new ArrayList<>();
            students.add(new Student(1));
            students.add(new Student(2));
            students.add(new Student(3));
            Student student=students.get(0);
            student.setId(50);
            for(Student stu:students){
                System.out.println(stu.getId());
            }
        }
    }
    
  6. TCP 和 UDP 的区别

    不全,面试官有提示

  7. TCP连接需要三次握手,为什么必须进行三次握手

    回答错了,回答成了三次握手的过程

    TCP 为什么需要三次握手?

    1. 防止重复连接
    2. 同步初始化序列化
  8. HTTPS加密,对称和非对称加密

    没有了解

    推荐文章:彻底搞懂HTTPS的加密机制

    因为http是通过明文传输的,明文数据中间需要经过中间代理服务器、路由器、WiFi热点、通信服务运营商等多个物理节点,如果信息在中间过程中被劫持,传输的内容就完全暴露了,而且它还可以篡改传输的信息且不被双方察觉,这种方式称为中间人攻击。

    对称加密,有一个密钥,它可以对一段内容加密,加密后只有用它才能解密看到原来的内容

    非对称加密,有一个公钥,有一个私钥,用公钥加密的内容必须用私钥才能解开,同样,私钥加密的内容只有公钥能解开。

    非对称加密+对称加密

    既然非对称加密耗时,非对称加密+对称加密结合可以吗?而且得尽量减少非对称加密的次数。当然是可以的,而且非对称加密、解密各只需用一次即可。
    请看一下这个过程:

    1. 某网站拥有用于非对称加密的公钥A、私钥A’。
    2. 浏览器像网站服务器请求,服务器把公钥A明文给传输浏览器。
    3. 浏览器随机生成一个用于对称加密的密钥X,用公钥A加密后传给服务器。
    4. 服务器拿到后用私钥A’解密得到密钥X。
    5. 这样双方就都拥有密钥X了,且别人无法知道它。之后双方所有数据都用密钥X加密解密。
  9. 代码控制主要用的是git

  10. 问面试官问题

    方言太重

二面

2021-03-10

感觉凉凉,全程一点自信都没有,好多问题都没有准备,在知乎的这篇回答《面试的时候,如何自我介绍?》中提到的问题几乎都犯了。

  1. 自我介绍

    方言太重,没有感情,直接读的自我介绍

  2. 为什么想来南京工作

    如果老家在远方,自己有意向在这个城市工作,并且在未来一段时间准备安家落户,可以大大方方的告诉面试官,自己将会在这里长久的工作下去。这样的话,对于自己留在这个城市里面还是很有帮助的。

  3. 对自己的未来的职业规划是怎么样的

    对方不希望招到一个来混日子的人,而是有职业抱负的人,有抱负的人才有干劲;要表明你的工作态度就可以了。当然也可以说自己希望能够通过职业5年有啥梦想,毕竟没有工作经验,说一下梦想例如给爸妈买房子什么的还是满好的。

  4. 你知道我们公司是做什么的吗

    不知道,感觉自己的进不去,直接表达出自己的不自信。

    面试官说:从面试官的角度来看,听人说自己进不去,还真不知道接下来会问什么

    面试前应该提前了解公司的具体信息,具体是做什么的。

    中科创达软件股份有限公司是全球领先的智能平台技术提供商。自2008年成立以来,公司致力于提供卓越的智能终端操作系统平台技术及解决方案,助力并加速智能手机、智能物联网、智能汽车等领域的产品化与技术创新。作为一家技术驱动型企业,中科创达不但坚持自我创新,也注重扶持创新。一方面与高通、英特尔、微软等分别运营了多个联合实验室,为元器件适配和终端测试提供先进的资源和技术支持;同时与ARM、高通分别成立合资公司——安创空间加速器、重庆创通联达,为智能硬件企业及创新创业者提供产业平台,推动智能硬件技术发展;并与临空投、天使基金、北极光共同成立产业投资基金,整合资源助力创新。目前,中科创达拥有一支对操作系统技术有深入理解的国际化专业团队。公司总部位于北京,分子公司及研发中心分布于全球19个地区。包括深圳、上海、南京、成都、重庆、武汉、西安、沈阳、大连、台北、香港、美国硅谷、圣地亚哥、日本东京、韩国首尔、芬兰赫尔辛基、印度海得拉巴、马来西亚槟城、保加利亚索菲亚。可以为全球客户提供便捷、高效的技术服务和本地支持。公司链接及简介:http://www.thundersoft.com/

  5. 你对未来的职业规划会做哪种语言呢

    面试哪种语言,就说哪种语言

  6. 你了解过安卓语言吗

    知道多少就说多少

  7. 不知道你是否对基于Java对安卓开发感兴趣

    感兴趣

  8. 在校期间参加过的社团

    应该说与专业相关的社团

  9. 学习过程中遇到过什么困难

    先看自己能不能解决,然后请教他人

  10. 基本上在校期间都是自己去做的是吧

    表现出自闭,不自信

  11. 比如你进入到我们公司了,领导交给了你10个bug,你只能完成5个,你会怎么解决这个问题

    无能为力,直接放弃,不自信

  12. 提问面试官问题

分享
您的鼓励是我最大的动力
alipay QR Code
wechat QR Code

Vigilr
作者
Vigilr
大四学生