Android笔试题(金山WPS)

1、简答题java

一、char型变量中能不能存储一个中文汉字,为何?编程

C语言中char是一个字节的大小,而汉字占2个字节,因此不能存储。数组

Java中char类型占2个字节,并且java默认采用Unicode编码,一个Unicode吗是16位,因此一个Unicode码占两个字节,Java中不管汉字仍是英文字母都是用unicode编码来表示的。因此,在Java中char类型变量能够存储一个中文汉字。缓存

二、 假设对一棵二叉树进行先序遍历,输出结果为:A B D C E G F H J。请写画出一棵符合上述结果的二叉树。多线程

三、使用java工具函数 java.util.Arrays.binarySearch(int[] array, int value),在有序数组{1,4,6,8,10}中搜素整数5,请问返回值是多少,并说明binarySearch返回该值的意义。//-3编辑器

并非内心想的没有找到就返回-1,而是使用二分查找法再不知足状况的条件下返回-(low + 1)ide

    private static int binarySearch0(int[] a, int fromIndex, int toIndex,
                                     int key) {
        int low = fromIndex;
        int high = toIndex - 1;函数

        while (low <= high) {
            int mid = (low + high) >>> 1;
            int midVal = a[mid];工具

            if (midVal < key)
                low = mid + 1;
            else if (midVal > key)
                high = mid - 1;
            else
                return mid; // key found
        }
        return -(low + 1);  // key not found.
    }编码

 

四、用Java实现一个多线程死锁的简单例子。

public class TestDeadLock {
   
    public void run() {
        MyThread mt = new MyThread();
        new Thread(mt, "张三").start();
        new Thread(mt, "李四").start();
    }
     
    class MyThread implements Runnable {
        private Object o1 = new Object();
        private Object o2 = new Object();
        private boolean flag = true;
        @Override
        public void run() {
            if (flag) {
                flag = false;
                synchronized (o1) {
                    System.out.println(Thread.currentThread().getName() + " have o1");
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (o2) {
                        System.out.println(Thread.currentThread().getName() + " have o2");
                    }
                }
            } else {
                flag = true;
                synchronized (o2) {
                    System.out.println(Thread.currentThread().getName() + " have o2");
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (o1) {
                        System.out.println(Thread.currentThread().getName() + " have o1");
                    }
                }
            }
        }
    }
     
    public static void main(String[] args) {
        new TestDeadLock().run();
    }
}

 

五、写出下列程序的输出结果

public class TryTest {
    public static void hello(){
        System.out.print("hello");
        throw new RuntimeException();
    }
    
    public static void main(String[] args) {
        try{
            ((TryTest)null).hello();
            System.out.print("ok");
        } catch (NullPointerException e){
            System.out.print("nullPointer");
        }catch (Exception e) {
            System.out.print("exception");
        }finally{
            System.out.print("finally");               //helloexceptionfinally
        }
    }

}

 

二 编程题

一、假设有一个int类型数组,其中只有一个元素出现奇数次,其余元素都出现偶数次。例如:{1,3,2,3,1},其中1,3均出现偶数次,2出现了奇数次,结果是2.如今须要写一个函数,把出现奇数次的元素找出来。

二、假设须要设计一个Rect对象缓存池,缓存池有上限。当须要用Rect时,就从缓存池里面取;当用完以后,就归还给缓存池。如今请实现这个缓存池。要求:

a 提供obtain方法获取对象,recycle方法回收对象;

b 不使用集合类,好比ArrayList,LinkedList等;

c 尽可能把多线程访问问题考虑进去。

三 设计题

实现一个Android端的文本编辑器,能够保存和读取纯文本文件,同时有简单的编辑功能,即光标定位、删除、插入、复制、粘贴等功能,要求:

一、自定义view实现,不能使用Android的EditView,EditText。

二、编辑文本的同时要求有撤销,还原功能。

三、请描述划分为哪些主要模块。

四、光标的定位及撤消还原功能实现逻辑是怎样的。