2017年深信服Android开发岗位笔试面试总结

2017年深信服Android开发岗位笔试面试总结

原创  2017年03月31日 20:11:04

笔试

结构体、联合体、正则表达式、后缀表达式 
堆排序、霍夫曼树、链表的冒泡排序、字符串匹配、图的搜索 
笔试题目比较多,难度也比较大,总分100分,但是应该只需要考到30分就可以通过笔试。

面试

1、Activity的生命周期 
API中给出的activity的生命周期图 
Activity的生命周期 
在android中activity拥有三个基本状态 
1)resumed:一个新的activity启动入栈后,它在屏幕最前端此时它处于可见并可和用户交互的状态。 
2) paused:当一个activity被另一个透明或者dialog状态的activity覆盖时的状态。此时它依旧与窗口管理器保持连接,系统继续维护它的状态,所以它仍然可见,但已经失去了焦点,所以不能与用户交互。 
3)stopped:当一个activity被另一个activity覆盖、失去焦点并不可见时的状态。

2、Activity的启动模式 
1. standard 
2. singleTop 
3. singleTask 
4. singleInstance 
基础总结篇之二:Activity的四种launchMode

3、Android进程间的通信方式 
Android Bander设计与实现 - 设计篇

4、Android数据持久化 
1. 文件存储 
2. SharedPreferences存储 
3. 数据库存储 
Android数据持久化存储方式

5、Android子线程修改UI 
1. 用Handler 
1)主线程中定义Handler; 
2)子线程发消息,通知Handler完成UI更新。 
2. 用Activity对象的runOnUiThread方法更新 
3. View.post(Runnable r) 
总结:UI的更新必须在主线程中完成,所以不管上述那种方法,都是将更新UI的消息发送到了主线程的消息对象,让主线程做处理。 
知识梳理:Android子线程中更新UI的3种方法

6、Android多线程的实现方式 
1. 继承Java.lang.Thread类,重载它的run()方法,用start()函数来启动线程。 
2. 实现Runnalbe接口,重载它的run()方法,用start()函数来启动线程。 
3. 既然说的是Android,我们不得不提到的是AsyncTask。 
  AsyncTask是Android框架提供的异步处理的辅助类,它可以实现耗时操作在其他线程执行,而处理结果在Main线程执行。使用他你会发现你的代码很容易被理解,因为他们都有一些具有特定职责的方法,尤其是AsyncTask,有预处理的方法onPreExecute,有后台执行任务的方法doInBackground,有更新进度的方法publishProgress,有返回结果的方法onPostExecute等等。

7、Android横竖屏切换时,Activity的生命周期 
1. 置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两 
2. Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次 
3. Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

8、Android Studio中如何使用Gradle打包多版本apk 
android studio gradle 多版本多apk打包(打包系列教程之五)

9、Android adb调试命令 
ADB调试命令大全

10、Java虚拟机运行的时class文件,那么Android虚拟机运行的时什么文件? 
dex文件。

11、快速排序的思想 
  快速排序采用的思想是分治思想。 
  快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。 
快速排序过程 
什么是快速排序

12、函数重载和函数重写有什么区别? 
1. 重写 (override): 
  父类与子类之间的多态性。子类重新定义父类中有相同名称和参数的虚函数。 
1) 被重写的函数不能是static 的。必须是 virtual 的 ( 即函数在最原始的基类中被声明为 virtual ) 。 
2) 重写函数必须有相同的类型,名称和参数列表 (即相同的函数原型) 
3) 重写函数的访问修饰符可以不同。尽管 virtual 是 private 的,派生类中重写改写为 public,protected 也是可以的 
2. 重载 (overload): 
  指函数名相同,但是它的参数表列个数或顺序,类型不同。但是不能靠返回类型来判断。 
3. 重定义(redefining): 
子类重新定义父类中有相同名称的非虚函数 ( 参数列表可以不同 ) 。 
重写与重载的区别 (override) PK (overload) 
1)方法的重写是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关 系,是水平关系。 
2)重写要求参数列表相同;重载要求参数列表不同。 
3)重写关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调用时的实参表与形参表来选择方法体的。

13、C++中new和malloc的区别

特征new/deletemalloc/free
分配内存的位置自由存储区
内存分配失败返回值完整类型指针void*
内存分配失败返回值默认抛出异常返回NULL
分配内存的大小由编译器根据类型计算得出必须显式指定字节数
处理数组有处理数组的new版本new[]需要用户计算数组的大小后进行内存分配
已分配内存的扩充无法直观地处理使用realloc简单完成
是否相互调用可以,看具体的operator new/delete实现不可调用new
分配内存时内存不足客户能够指定处理函数或重新制定分配器无法通过用户代码进行处理
函数重载允许不允许
构造函数与析构函数调用不调用

14、C语言中char类型占几个字节?Java中char类型占几个字节,可以用汉字来赋值吗? 
 C中char占1个字节,Java中char占2个字节,可以用汉字来赋值。

15、C++中什么技术可以代替宏定义? 
1. 常量定义 
2. 函数定义 
3. 类型重定义 
4. 条件编译 
5. 头文件包含 
宏在C++中的替代解决方案

16、C++静态成员函数 
 在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。 
  静态成员的定义或声明要加个关键static。静态成员可以通过双冒号来使用即<类名>::<静态成员名>。 
1. 静态成员函数中不能调用非静态成员。 
2. 非静态成员函数中可以调用静态成员。因为静态成员属于类本身,在类的对象产生之前就已经存在了,所以在非静态成员函数中是可以调用静态成员的。 
3. 静态成员变量使用前必须先初始化(如int MyClass::m_nNumber = 0;),否则会在linker时出错。

17、实现Singleton(单例)模式 
  饿汉式:在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。

Class Singleton(){
        privateSingleton(){}
        privatestatic Singleton instance = new Singleton();
        publicstatic Singeleton getInstance(){
               return instance;
        }
}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

18、C语言中strcpy和strncpy的区别 
  strcpy函数:extern char *strcpy(char*dest,char *src); 功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间,返回dest(地址中存储的为复制后的新值)。 
  strncpy函数:char *strncpy(char *dest, char *src, size_tn); 功能:将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才开始复制),返回指向dest的指针。 
  strcpy 比较简单,而使用strncpy可以适当地控制复制字符的数目,因此比strcpy 更为安全。

19、Java中String、StringBuffer与StringBuilder之间区别 
  StringBuffer、StringBuilder和String一样,也用来代表字符串。String类是不可变类,任何对String的改变都 会引发新的String对象的生成; 
  StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生新的对象。既然可变和不可变都有了,为何还有一个StringBuilder呢?相信初期的你,在进行append时,一般都会选择StringBuffer吧! 
  先说一下集合的故事,HashTable是线程安全的,很多方法都是synchronized方法,而HashMap不是线程安全的,但其在单线程程序中的性能比HashTable要高。StringBuffer和StringBuilder类的区别也是如此,他们的原理和操作基本相同,区别在于StringBufferd支持并发操作,线性安全的,适合多线程中使用。StringBuilder不支持并发操作,线性不安全的,不适合多线程中使用。新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。

20、Java中HashTable和HashMap的区别 
1. HashMap几乎可以等价于HashTable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而HashTable则不行)。 
2. HashMap是非synchronized,而HashTable是synchronized,这意味着HashTable是线程安全的,多个线程可以共享一个HashTable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。 
3. 另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而HashTable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。 
4. 由于HashTable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过HashTable。 
5. HashMap不能保证随着时间的推移Map中的元素次序是不变的。

21、Java防反编译的方法 
1. 代码混淆 
2. 加密class文件

总结

  深信服还是比较注重基础知识的考察,我几乎没有准备,很多题目都开不了口。但从这次面试中我至少明白了面试也不是不可逾越的高山,认真准备总有可能出现惊喜。 
  往者不可见,来者犹可追。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值