安卓开发(Java)面试经历

除了问项目经历,一些技术性的问题如下:

内存回收机制(Garbage Collection,GC)

1. java的内存

内容来源

  • 堆 (是gc的主要区域) 线程共享,主要是用于分配实例对象和数组
  • 栈 线程私有,它的生命周期和线程相同,又分成 虚拟机栈和本地方法栈,只有它会报 StackOverFlowError,栈深度超标
  • 方法区 线程共享 用于储存被虚拟机加载的类的信息,静态变量 常量和编译后的.class字节码
  • 程序计数器 线程私有,线程之间不相互影响,独立存取;

以上部分,线程私有是不会发生gc.并且他们是随线程生随线程灭,即程序计数器 本地方法栈和虚拟机栈

2.GC回收机制–判断是否可以gc

引用计数算法
原理:通过一个计数器对对象进行计数,对象被引用时+1,引用失效时-1;当计数为0时则说明可以被回收;
缺点:很难解决对象的相互循环引用问题
可达性分析算法
Java虚拟机所采用的算法;
原理:通过一些列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。
那么哪些对象可以被称为gc roots呢—-虚拟机栈(栈中的本地变量列表)/方法区静态属性/方法区常量引用/本地方法栈中JNI 所引用的的对象都是可以作为 gc roots的

3.GC回收机制–如何回收

标记清除算法
清除算法分成2个阶段–标记和清除; 标记阶段对所有存活的阶段进行标记,标记完成后,再扫描整个空间未标记对象,直接回收不存活的对象.
优点:大多数情况下比较高效,缺点是会造成内存碎片,碎片太多导致后面过程中对大内存的分配无足够空间时而提前猝发一次垃圾回收动作;
复制算法
将可用内存将容量划分成大小相等的2块,每次清理时将其中A内存还存活的对象复制到B内存里面,然后再把A中清理掉;
优点高效且并不产生碎片,缺点牺牲了一半的内存为代价
适用存活对象少,回收对象多
标记整理算法
该算法标记阶段和标记清除算法一样,完成标记后它不是直接清理可回收对象,而是将存活对象都向一端移动最后清理掉端边界意外的内存;
适用于存活对象多,回收对象少的情况
分代收集算法
整合了复制算法和标记整理算法,根据新生代和老年代的不同特性采取上面的不同算法
新生代 生命周期短,每次回收时都有大量垃圾对象需要回收 复制算法
老年代 每次只有少量的对象需要回收 标记整理算法

Tcp与udp

内容来源
TCP与UDP基本区别
1.基于连接与无连接
2.TCP要求系统资源较多,UDP较少;
3.UDP程序结构较简单
4.流模式(TCP)与数据报模式(UDP);
5.TCP保证数据正确性,UDP可能丢包
6.TCP保证数据顺序,UDP不保证
  
UDP应用场景:
1.面向数据报方式
2.网络数据大多为短消息
3.拥有大量Client
4.对数据安全性无特殊要求
5.网络负担非常重,但对响应速度要求高

http与https的区别

HTTP协议以明文方式发送内容,不提供任何方式的数据加密
HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)
HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

感觉这里要使用过https编程才会有更深的理解

手写二叉树的遍历

写完面试官就看了一眼….应该没什么问题

override与overload的区别

Override是重写:方法名称、参数个数,类型,顺序,返回值类型都是必须和父类方法一致的。它的关系是父子关系
Overload是重载:方法名称不变,其余的都是可以变更的。它的关系是同一个类,同一个方法名,不同的方法参数或返回值。
备注:它们都是是Java多态性的不同表现

文件系统与数据库的区别

文件系统和数据库系统之间的区别。
(1)文件系统用文件将数据长期保存在外存上,数据库系统用数据库统一存储数据;
(2)文件系统中的程序和数据有一定的联系,数据库系统中的程序和数据分离;
(3)文件系统用操作系统中的存取方法对数据进行管理,数据库系统用DBMS统一管理和控制数据;
(4)文件系统实现以文件为单位的数据共享,数据库系统实现以记录和字段为单位的数据共享。

问项目的时候即兴问的一个问题。。。还是没答上来

其实也很久没有打java代码,用的时候也没有去思考这些问题,感觉要提前做好充分准备

面试于2018/4/14日上午

猜你喜欢

转载自blog.csdn.net/hello_my_coder/article/details/79941921