2HoER:2016秋招笔试面试问题收集

——>009 json与xml区别?

参考文献:

XML和JSON区别
iOS开发—XML/JSON数据解析


——>008 处理OJ(online judge)标准输入输出(Java)

参考文献:

OJ平台Java处理标准输入输出


——>007 HashMap与HashTable区别

参考文献:

  1. Java的HashMap和HashTable
  2. Java之美从菜鸟到高手演变之HashMap与HashTable

——>006 时间复杂度为 O(nlogn) 几种排序算法

快排,堆排,归并,时间复杂度为 O(nlogn) 补充:冒泡,直插,选择,时间复杂度为 O(n^2)

具体算法实现参考我的Github


——>005 JVM内存模型与垃圾回收(GC)

参考文献

  1. 理解Java垃圾回收机制
  2. Android之内存管理及优化-干货
  3. 深入理解JVM(1) : Java内存区域划分
  4. 深入Java虚拟机(1):Java内存区域与内存溢出

——>004 AsyncTask使用场景,设计缺陷,解决方案

设计缺陷:主要存在于两个方面

  • 第一,AsyncTask执行周期问题,当在Activity或者Fragment中调用task.execute()方法后,AsyncTask会持有当前context的引用,一旦Activity销毁或者重建(比如,横屏竖屏切换时Activity重建这一场景),就会造成当前AsyncTask后台正在执行的耗时任务出现异常,最常见的就是执行网络请求的请求结果丢失,如果希望吧请求结果更新到主线程UI中,那么onPostExecute()会抛出空指针异常,轻则界面出现卡顿,重则导致内存泄漏直接CRASH。与此同时,如果想要取消正在执行的任务,onCancel()方法也会失去作用。

  • 第二,AsyncTask串行与并行问题,在Android 1.6之前第一版的AsyncTask任务是串行调度的。由于串行执行任务,AsyncTask在很多场景,比如需要高并发网络访问的情况下(比如,异步加载图片瀑布流,需要高并发网络请求同时加载多张图片)不能很好的处理异步任务。第二个版本的AsyncTask从Android 1.6到Android 2.3,Android团队决定让AsyncTask并行调度,但是又出现了很多问题,比如多线程并发访问网络,网络带宽是固定的,如果并发量过大则会导致线程间的带宽的竞争加剧,这样的结果就是只有一小部分线程得以执行而其他大部分线程都会被阻塞。从Android 3.0到现在是AsyncTask的第三个版本,Android团队又把AsyncTask改成了串行调度。当然这一次并没有完全废弃掉AsyncTask并行操作,如果你面对的是高并发的需求,完全可以通过设置executeOnExecutor(executor)来实现AsyncTask并行操作。

解决方案:

  • 取长补短,借力优秀的第三方开源框架! 比如事件总线EventBus,新秀网红RxJava等优秀的开源框架就可以很好的解决AsyncTask的缺陷。

参考文献:

  1. Android开发者:你真的会用AsyncTask吗?
  2. AsyncTask 使用和缺陷
  3. Observable取代AsyncTask和AsyncTaskLoader

——>003 Android推送服务,各方案比较

自己实现推送的三种思路

(1)短连接;(2)SMS短信拦截;(3)长连接

合理选用第三方推送服务

第三方推送(极光推送等),BAT厂商推送(友盟推送(阿里),信鸽推送(腾讯),百度推送(百度)),手机ROM厂商推送(小米推送,华为推送)

参考文献

  1. Android推送技术研究
  2. Android开发之极光推送的集成

——>002 层序遍历二叉树,用队列实现

public BinaryTreeNode levelTravel(BinaryTreeNode head) {
    if (head == null) return;
    
    Queue<BinaryTreeNode> queue = new Queue<>();
    queue.add(head);

    while (!queue.isEmpty()) {
        BinaryTreeNode node = queue.poll();
        System.out.print(node.value);
        
        if (node.left != null) queue.add(node.left);
        if (node.right != null) queue.add(node.right);
    }
    
    return head;
}

——>001 反转二叉树(递归/非递归实现)

//二叉树模型
public class BinaryTreeNode {
    int value;
    BinaryTreeNode left;
    BinaryTreeNode right;
}

//递归实现
public void invert(BinaryTreeNode head) {
    if (head == null) return;
    
    if (head.left != null) {
        invert(head.left); //递归左子树
    }
    if (head.right != null) {
        invert(head.right); //递归右子树
    }
    
    //交换左右节点位置
    BinaryTreeNode node = head.left;
    head.left = head.right;
    head.right = node;
}

//非递归实现,用Stack实现
public BinaryTreeNode invert(BinaryTreeNode head) {
    if (head == null) return;
    
    Stack<BinaryTreeNode> stack = new Stack<>();
    stack.push(head);
    
    while (!stack.isEmpty()) {
        BinaryTreeNode current = stack.pop();
        //交换node节点左右子节点
        BinaryTreeNode temp = current.left;
        current.left = current.right;
        current.right = temp;
        
        if (current.left != null) stack.push(current.left);
        if (current.right != null) stack.push(current.right);
    }
    
    return head;
}
posted @ 2016-09-18 22:22  布鲁克林一棵树  阅读(284)  评论(0编辑  收藏  举报