一线互联网公司内部面试题库 v1.1

4,962 阅读7分钟

这些面试题都是馆主肉身带回来的,绝对保证真实性。馆主也是一线公司都踩过点的人了,一开始是因为一线公司题库都有很大相似性,后来白天面试完,晚上就把面试题和答案整理下来,慢慢的就形成了Github AndroidInterview-Q-A项目,现在也是 6K star的项目。 面试题来自于百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐内部题库,熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率,地址:http://www.jackywang.tech/AndroidInterview-Q-A/,或点击阅读原文,以下为题库节选

Java

接口的意义(百度)

规范、扩展、回调

抽象类的意义(乐视)

为其子类提供一个公共的类型封装子类中得重复内容定义抽象方法,子类虽然有不同的实现 但是定义是一致的

内部类的作用(百度,乐视)

  1. 内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立。

  2. 在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类。

  3. 创建内部类对象的时刻并不依赖于外围类对象的创建。

  4. 内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体。

  5. 内部类提供了更好的封装,除了该外围类,其他类都不能访问

父类的静态方法能否被子类重写,为什么?(猎豹)

不能

子类继承父类后,用相同的静态方法和非静态方法,这时非静态方法覆盖父类中的方法(即方法重写),父类的该静态方法被隐藏(如果对象是父类则调用该隐藏的方法),另外子类可继承父类的静态与非静态方法,至于方法重载我觉得它其中一要素就是在同一类中,不能说父类中的什么方法与子类里的什么方法是方法重载的体现

举1-2个排序算法,并使用java代码实现(美团)

http://blog.csdn.net/qy1387/article/details/7752973

java虚拟机的特性(百度、乐视)

Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。

Android

数据库的操作类型有哪些,如何导入外部数据库?

把原数据库包括在项目源码的 res/raw

android系统下数据库应该存放在 /data/data/com.*.*(package name)/ 目录下,所以我们需要做的是把已有的数据库传入那个目录下.操作方法是用FileInputStream读取原数据库,再用FileOutputStream把读取到的东西写入到那个目录.

是否使用过本地广播,和全局广播有什么差别?

因广播数据在本应用范围内传播,不用担心隐私数据泄露的问题。不用担心别的应用伪造广播,造成安全隐患。相比在系统内发送全局广播,它更高效。

是否使用过intentServer,作用是什么,AIDL解决了什么问题?(小米)

生成一个默认的且与主线程互相独立的工作者线程来执行所有传送至 onStartCommand() 方法的Intetnt。

生成一个工作队列来传送Intent对象给你的onHandleIntent()方法,同一时刻只传送一个Intent对象,这样一来,你就不必担心多线程的问题。在所有的请求(Intent)都被执行完以后会自动停止服务,所以,你不需要自己去调用stopSelf()方法来停止。

该服务提供了一个onBind()方法的默认实现,它返回null。

提供了一个onStartCommand()方法的默认实现,它将Intent先传送至工作队列,然后从工作队列中每次取出一个传送至onHandleIntent()方法,在该方法中对Intent对相应的处理。

AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。AIDL IPC机制是面向接口的,像COM或Corba一样,但是更加轻量级。它是使用代理类在客户端和实现端传递数据。

专题

腾讯

2000万个整数,找出第五十大的数字?

冒泡、选择、建堆

从网络加载一个10M的图片,说下注意事项

图片缓存、异常恢复、质量压缩

自定义View注意事项

渲染帧率、内存

项目中常用的设计模式

单例、观察者、适配器、建造者。。

JVM的理解

http://www.infoq.com/cn/articles/java-memory-model-1

阿里面试题

进程间通信方式

  1. 通过Intent在Activity、Service或BroadcastReceiver间进行进程间通信,可通过Intent传递数据

  2. AIDL方式

  3. Messenger方式

  4. 利用ContentProvider

  5. Socket方式

  6. 基于文件共享的方式

什么是协程

我们知道多个线程相对独立,有自己的上下文,切换受系统控制;而协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制。

内存泄露是怎么回事

由忘记释放分配的内存导致的

程序计数器,引到了逻辑地址(虚地址)和物理地址及其映射关系

虚拟机中的程序计数器是Java运行时数据区中的一小块内存区域,但是它的功能和通常的程序计数器是类似的,它指向虚拟机正在执行字节码指令的地址。具体点儿说,当虚拟机执行的方法不是native的时,程序计数器指向虚拟机正在执行字节码指令的地址;当虚拟机执行的方法是native的时,程序计数器中的值是未定义的。另外,程序计数器是线程私有的,也就是说,每一个线程都拥有仅属于自己的程序计数器。

数组和链表的区别

数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少或不插入和删除元素,就应该用数组。

链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。比如:上一个元素有个指针指到下一个元素,以此类推,直到最后一个元素。如果要访问链表中一个元素,需要从第一个元素开始,一直找到需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了,只要修改元素中的指针就可以了。如果应用需要经常插入和删除元素你就需要用链表数据结构了。

百度

笔试题

  1. 冒泡排序

  2. 四大组件的生命周期和简单用法

  3. 图片框架缓存实现

  4. 设计网络请求框架

问答

  1. LruCache默认缓存大小

  2. httpurlconnection 和 okhttp关系(HTTPurlconnection 底层基于OKHTTP)

  3. 开源库源码分析

  4. 从0设计一款App整体架构(可以结合微信和淘宝架构演进方面进行回答)