很多同学都想得到滴滴出行的实习或者校招机会。那从过来人的角度谈谈,要通过滴滴出行的实习、校招面试,都有哪些经验和注意事项呢?今天就跟大家分享一下。
总体情况:视频面试
【二面】
总体情况:全程问项目,问一些 Android 基本知识
1、针对项目中的 realm 数据库提问 realm 数据库有哪些优点,是怎么存的,怎么解决并发
优点:(1)跨平台:Realm可同时兼顾iOS和Android两个平台,使用时不用考虑内部数据的架构不同。(2)简单易用:相比Core Data 和 SQLite 晦涩难懂的代码与知识要简单的多,可以减少开发成本
通常情况下,Realm 数据库是存储在硬盘中的,但是您能够通过设置inMemoryIdentifier而不是设置RLMRealmConfiguration中的 fileURL属性,以创建一个完全在内存中运行的数据库。
2、realm 数据库和 sqlite 、MySQL 这种常用的数据库有什么区别
Realm相比于SQLite而言,更易于安装并且运行的更快。不仅如此,数据库文件还可以在iOS和Android上通用。如果你正在设计一款面向很多用户,有很多记录的程序,那么你从设计的一开始就需要特别注意它的可扩展性。Realm在这方面非常出色,并且能够让你快速的操作大量数据。
3、这些数据库的存储形式是什么
4、realm 是如何做到高效的
5、问数据库有关的知识
数据库是数据管理的有效技术,是由一批数据构成的有序集合,这些数据被存放在结构化的数据表里。. 数据表之间相互关联,反映客观事物间的本质联系。. 数据库能有效地帮助一个组织或企业科学地管理各类信息资源。. 数据是数据库中存储的基本对象,是按一定顺序排列组合的物理符号。. 数据有多种表现形式,可以是数字、文字、图像,甚至是音频或视频,它们都可以经过数字化后存入计算机。. 数据库是数据的集合,具有统一的结构形式并存放于统一的存储介质内,是多种应用数据的集成,并可被各个应用程序所共享。.
6、TCP 中的流量控制和拥塞控制方案
拥塞控制:拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况;常用的方法就是:( 1 )慢开始、拥塞避免( 2 )快重传、快恢复。
流量控制:流量控制是作用于接收者的,它是控制发送者的发送速度从而使接收者来得及接收,防止分组丢失的。
7、数据结构中队列和栈的区别
(1)操作的名称不同。
队列的插入称为入队,队列的删除称为出队。栈的插入称为进栈,栈的删除称为出栈。
(2)操作的限定不同。
队列是在队尾入队,队头出队,即两边都可操作。而栈的进栈和出栈都是在栈顶进行的,无法对栈底直接进行操作。
(3)操作的规则不同。
队列是先进先出(FIFO),即队列的修改是依先进先出的原则进行的。新来的成员总是加入队尾(不能从中间插入),每次离开的成员总是队列头上(不允许中途离队)。而栈为后进先出(LIFO),即每次删除(出栈)的总是当前栈中最新的元素,即最后插入(进栈)的元素,而最先插入的被放在栈的底部,要到最后才能删除。
(4)遍历数据速度不同。
队列是基于地址指针进行遍历,而且可以从头部或者尾部进行遍历,但不能同时遍历,无需开辟空间,因为在遍历的过程中不影响数据结构,所以遍历速度要快。栈是只能从顶部取数据,也就是说最先进入栈底的,需要遍历整个栈才能取出来,而且在遍历数据的同时需要为数据开辟临时空间,保持数据在遍历前的一致性。
8、两个栈实现队列
队列的特点是先入先出,出入元素是在不同的两端(队头和队尾): 入队: 出队: 既然我们拥有两个栈,那么我们可以让其中一个栈作为队列的入口,负责插入新元素;另一个栈作为队列的出口,负责移除老元素。 队列的主要操作无非有两个:入队和出队。
9、两个链表判断有相同节点
既然连个链表一旦相交,相交节点一定有相同的内存地址,而不同的节点内存地址一定是不同的,那么不妨利用内存地址建立哈希表,如此通过判断两个链表中是否存在内存地址相同的节点判断两个链表是否相交。
10、扑克牌随机洗牌
11、电梯调度
提示:面向对象编程,用命令模式,需要优先级判断
12、Java GC
【三面】
1、Java 基础
java语言的三种技术架构
J2EE:企业版
是为开发企业环境下的应用程序提供的一套解决方案。
该技术体系中包含的技术如 Servlet、Jsp等,主要针对于Web应用程序开发。
J2SE:标准版
是为开发普通桌面和商务应用程序提供的解决方案。
该技术体系是其他两者的基础,可以完成一些桌面应用程序的开发。
比如Java版的扫雷。
J2ME:小型版
是为开发电子消费产品和嵌入式设备提供的解决方案。
该技术体系主要应用于小型电子消费类产品,如手机中的应用程序等。
java的跨平台性:通过Java语言编写的应用程序在不同的系统平台上都可以运行。
跨平台的原因:只要在需要运行java应用程序的操作系统上,先安装一个Java虚拟机(JVM Java Virtual Machine)即可。由JVM来负责Java程序在该系统中的运行。
2、自动拆箱装箱过程
简单一点说,装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。 它会首先判断i的大小:如果i小于-128或者大于等于128,就创建一个Integer对象,否则执行SMALL_VALUES [i + 128]。 它里面定义了一个value变量,创建一个Integer对象,就会给这个变量初始化。 第二个传入的是一个String变量,它会先把它转换成一个int值,然后进行初始化。 它是一个静态的Integer数组对象,也就是说最终valueOf返回的都是一个Integer对象。 所以我们这里可以总结一点:装箱的过程会创建对应的对象,这个会消耗内存,所以装箱的过程会增加内存的消耗,影响性能。 这个很简单,直接返回value值即可。
3、源码是怎么实现的
4、integer a = 120;integer b = 120; a == b?
5、数据缓存在哪
默认情况下,这些缓存文件都存储在: Windows: UsersusernameAppDataRoamingadobecommon MacOS: /Users/username/Library/Application Support/Adobe/Common
6、string a = "hello";string b = "hello";a == b ? 为什么
7、字符串缓存在哪,字符串常量存在哪,类共享吗
存在于Java堆中。
8、进程通信
进程通信是指在进程间传输数据(交换信息)。 进程通信根据交换信息量的多少和效率的高低,分为低级通信(只能传递状态和整数值)和高级通信(提高信号通信的效率,传递大量数据,减轻程序编制的复杂度)。其中高级进程通信分为三种方式:共享内存模式、消息传递模式、共享文件模式
9、Android 进程通信方式
使用Bundle的方式、使用文件共享的方式、使用Messenger的方式、使用AIDL的方式、使用ContentProvider的方式、使用广播接收者(Broadcast)的方式、使用Socket的方式
10、bundle 传递的时候有什么要求,序列化怎么实现,两种的区 别是什么
当Bundle传递的是对象或对象数组时,必须实现 Serializable 或Parcelable 接口。
11、intent 传递机制是什么怎么传递的
Intent,又称为意图,是一种运行时绑定机制,它能在程序运行的过程中链接两个不同的组件(Activity、Service、BroadcastReceiver)。通过Intent,程序可以向Android表达某种请求或意愿,Android会根据意愿的内容选择适当的组件来请求。
在这些组件之间的通讯中,主要是由Intent协助完成的。Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
通过Intent请求Activity,必须在AndroidManifest.xml文件中对被请求的Activity新增标签配置,否则会导致错误。
12、message 传递又是怎么传递的
13、蓝牙,低功耗 ble 是怎么实现的,与普通的蓝牙哪些不同
蓝牙协议是通信协议的一种,一般而言,我们把某个协议的实现代码称为协议栈(protocol stack),BLE协议栈就是实现低功耗蓝牙协议的代码,理解和掌握BLE协议是实现BLE协议栈的前提。
经典蓝牙:当建立连接后,就可以直接使用BluetoothSocket的getOutputStream()方法获取输出流写入需要发送的数据。读取发送回来的数据,则是调用BluetoothSocket的getInputStream()方法获取输入流读取。这点和Java中的Socket通信几乎是一模一样。
低功耗蓝牙:想要实现主设备对从设备的数据发送,则需要直接读取获取到的从设备的Characteristic,而Characteristic又是Service下面的一层,所以操作顺序是:
14、与服务端通信是怎么做到的
目前服务端给客户端推送,普遍做法是客户端与服务端维持一个长连接,客户端定时向服务端发送心跳以维持这个长连接。
15、代码实现一个死锁的情况,怎么实现并发
16、synchronized 用处
synchronized 和其他的线程安全技术一样, synchronized 关键字的作用也是为了保障数据的原子性、可见性和有序性,只是相比于其他技术, synchronized 资历更老,历史更久,而且也更基础,基本上我们在学习线程相关内容的时候,就会学习这个关键字。
17、synchronized 和原子更新区别
18、AutomicInteger 的原理
AtomicIntger 是对 int 类型的一个封装,提供原子性的访问和更新操作,其原子性操作的实现是基于 CAS(compare-and-swap)技术。 所谓 CAS,表征的是一些列操作的集合,获取当前数值,进行一些运算,利用 CAS 指令试图进行更新。
19、volatile 怎么保障可见性
volatile 如何保证可见性 先看一段伪代码:这里 main 中定义一个 stop 变量,赋值为 true,线程 1 根据 stop 循环计数,线程 2 睡一会设置 stop 为 false ,线程 3 多睡一会,打印出 stop 变量。 你会发现打印出了 false 但是 while 循环还是没有停止。
20、android.os.Handler post Runnable 能否让 Runnable 在非主线程中运行?如果能,如何做到?如果不能,为什 么?
21、输出当前代码运行在哪个类的哪个方法的哪一行
22、exception 判断错误的地方
23、热修复了解多少
热修复:让应用能够在无需重新安装的情况实现更新,帮助应用快速建立动态修复能力。. 其实就是打补丁包,像我们玩王者荣耀老是需要更新个几十M的文件,其实很多就是补丁包。. 也就是应用上线后出现bug,不用再发布新的版本,而是使用补丁包修复,在用户无感知的情况下修复bug.
24、Unit test
25、Android 源码中用到的设计模式,集体讲讲
26、git 使用
GIT,全称是分布式版本控制系统,git通常在编程中会用到,并且git支持分布式部署,可以有效、高速的处理从很小到非常大的项目版本管理。分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库。
27、Java 虚拟机和 Android 虚拟机的区别
1.JVM虚拟机是以java 字节码 加载,而Android虚拟机是基于dex加载的。
想要更多滴滴出行实习、校招的机会,请点击这里