Android面试题总结

  • socket通信怎么优化

  1. socket优化可以从两个方面入手,一个是减少传输的数据量、一个是对接收的数据的处理
  2. 对于传输的数据可以使用FastJson之类的方式,减少传输的数据量。对流的传输可以使用okio框架,比io更小。使用GZIPInputStream或者GZIPOutPutStream处理
  3. 接收数据后可以使用Buffer技术,用StringBuilder或者StringBuffer来取代String。
  4. 将socket放在单独的线程中,也可以使用NIO
  • 网络分层,Tcp/ip三次握手;http与https区别

  1. 网络分为七层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层;网络层对应ip、ipx,传输层对应Tcp、Udp,会话层对应rpc,表示层是一些加密的操作,应用层对应http、stmp、ftp等。
  2. 我们通过TCP协议在两台电脑建立网络连接之前要先发数据包进行沟通,沟通后再建立连接,然后才是信息的传输。
  3. 我们通过TCP协议在两台电脑建立网络连接之前要先发数据包进行沟通,沟通后再建立连接,然后才是信息的传输。tcp中有个专门进行数据完整性校验的叫tcp校验。
  4. http与https区别:http是超文本传输协议,https是在http外面封装了一层ssl,这样的话传递的数据是通过加密处理的,只有有相应的密钥才能解析数据。https比http更加耗性能
  • Android虚拟机内存分配机制

  1. 虚拟机的内存分为heap(堆)、stack(栈)、常量去方法区。
  2. Dalvik负责进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行
  3. 一般使用的对象(引用类型)都是存放在heap中,stack中存放引用对象的地址。常量方法去存放基本数据类型及一些常量。垃圾回收主要是对堆空间的数据进行回收。
  • java垃圾回收的处理

  1. 由于内存资源的有限,java使用垃圾回收进行处理,即是说回收掉不用的对象。当一个对象没有其他对象引用时候,该对象就会被回收掉。
  2. 怎么判断一个对象是否被引用?引用几次?java采用计数器来实现对象的引用统计,当计数器为0或者负数时候,表示该对象没有其他对象引用,可以被回收。但是这种引用计数的方式对一些循环引用不起作用,这时候就需要新的方式GC Roots:可达性。
  • java中HashMap是怎么实现的

  1. java中HashMap实现是数组加上链表的方式
  2. 在 Java 编程语言中,最基本的结构就是两种,一个是数组,另外一个是指针(引用)
  3. HashMap创建了一个Entity对象数组,每个Entity里面存放了下一个Entity的引用。当我们put数据的时候会更具key的hashcode值对比判断,如果hashcode一样再判断value是否equals。因此HashMap中不能存放基本数据类型,只有引用类型才有hashcode和equals方法。事实上java中所有的集合类都不能存放基本数据类型,如果非要存的话需要使用包装类进行包装。
  • 造成OOM的原因

  1. 在Android中每个Dalvik虚拟机对应一个进程对应一个应用程序,每个应用分配的内存空间默认16M,当然不同手机或者配置是不一样的,我的小米5x是128M的。由于内存的有限性,如果内存中对象过多超过了内存的大小而得不到释放会造成内存溢出。
  2. 循环引用造成溢出:循环引用会造成垃圾对象得不到释放,一直处于内存中。对于循环引用,平时Android开发使用还不少,一般会使用SoftReference、WeakReference及虚引用来打破引用的循环。
  3. 加载大图片:图片是非常耗费内存的,尤其是那种高清的大图。在Android中可以使用BitmapFactory对图片进行压缩。或者使用BitmapFactoryDecoder加载图片的某个区域。
  4. 列表的造成内存溢出:在Android中列表是经常用到的,如果不复用每次创建的列表item,则每条数据均new一个新的item,数据多了后会造成卡顿和内存溢出。这种情况下使用viewholder复用,或者使用RecycleView代替。
  5. 内部类的使用,或者单例模式中传递的Context的生命周期小于单例的生命周期,会造成Activity或者使用的Context无法释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值