Android面试知识

2016-03-14,第一次开始准备面试,虽然之前面试过三家但是都是水水的,尤其是我的表现,这次面试的cvte的Android开发,所以我要好好准备下,无奈是后天,而且明天早上还有点事情,好了开始准备吧。

方法:从网上截取几个曾到那里面试过的人的记录,然后根据记录先对可能出现的问题进行回答,最后整理下个人的自我介绍,尤其是最近的毕业设计。


一、tcp,udp的区别:
tcp,udp都是OSI的传输层,不同的是:
tcp是面向字节,可靠的传输协议,而udp是面向报文的不可靠的传输协议,;
tcp面向字节的,所以应用层和TCP的交互是一次一个数据块,而tcp有缓冲块,会根据数据块大小而进行调整,比如数据块大了则分开,小了则储存等多了发送;
udp是面向报文,指应用层每次传递下来一个个的报文,udp不经过任何修改直接交付网络层,由网络层负责调整;
tcp是可靠的协议,主要是因为tcp需要三次来建立连接,四次老释放连接,并且tcp有拥塞控制和滑动窗口。常用tcp协议的有,FTP,HTTP,SMTP;
udp不需要任何连接就可以直接发送;
采用tcp和udp分别实现socket有以下差别:
Android面试知识_第1张图片
二、java的四种引用类型:
1、强引用,如通过new实例化一个对象a,引用该对象a则称为强引用;当对象a不在被引用时才有可以被JVM回收,否则当内存不足时,程序会选择报OOM而不是回收该对象;
2、软引用,创建软引用对象,目的是为了告诉JVM当内存不足时哪些对象可以被暂时回收;
3、弱引用,该对象可以被JVM随时回收,;HashMap例子HaspMap键值可以存放一个对象,当该对象为强引用,且多次被添加到HashMap的时候,就会过多的暂用内存,所这个时候可以采用WeakHashMap来解决这个问题;

4、虚引用:


三、Java常用的几种设计模式:
1、单例:永远只有一个实例化的对象,单例的类如下:
public class instance
{
    private instance myInstance;
    private instance()
    {   };
    public instance getInstance()
    {
        if(myInstance==null)
        {
            myInstance=newinstance();//实例化对象
        }
        return myInstance
    }
}//在单线程情况下,只会有一个实例


//若要保证单例安全,则要加上锁:
public class instance
{
    private instance myInstance;
    private instance()
    {   };
    public **synchronized**  instance getInstance()
    {
        if(myInstance==null)
        {
            myInstance=newinstance();//实例化对象
        }
        return myInstance
    }
}
2、工厂模式


四、二分查找代码
public boolean sort(int[]a,int result)
{
    int start=0;
    int end=a.length;
    
    while(start<=end)
    {
        int middle=(end-start)/2;
        
        if(a[middle]==result)
        {retrun true;}
        else
            if(a[middle]>result)
            {
                end=middle-1;
            }
            else
            {
                start=middle+1;
            }
    }
    return flase;
}


五、斐波那契数列:(统计手机流量的时候方法类似)
递推定义:


Fib(n)=0;当n=0;
Fib(n)=1;当n=1;
Fib(n)=Fib(n-1)+Fib(n-2),当n>1


利用该递归的时间复杂度为2的n次方;
改成循环:
int Fib(int n)
{
    int one,two,now;
    if(n==0||n==1)
    {
        return n;
    }
    else
    {
        one =0;
        two=1;
        for(int i=2;i         {
            current=one+two;
        
             one=two;
            two=current;
        }
    return current;
    }
}
六、多线程同步:(监测中对数据库的互斥操作)
线程同步,指的是线间协调合作,因为多线程的本意是提高程序并发性从而提高CPU利用率,当多个线程对同一资源进行操作,使得结果和预期结果不同,便会出现线程不安全的问题。解决的办法是:加上锁,即线程互斥,对方法或者类加上锁,使得当该资源被某个线程引用时,其他使用线只等待;或者使用通知的方式,利用PV操作和信号量,典型的是消费者生产模式;


七、抽象类和接口
抽象类:可以有抽象和非抽象的方法属性;
public stract class animal
{
    public abstrart void cry();
    public abstract void eat();
    pulblic abstract void speak();
    
}
接口:特殊抽象类,只能有常量和抽象方法组成;
public interface animal
{
    public static final type=100;
    
    public abstract void speak();
}
两者都是为指定实现某一功能而做的方法,但不关心具体的操作,比如说对数据库增删改查操作,可以用接口;
八、Java反射机制
指的是:在运行的过程中,对于任何一个类都可以获得该类的属性和方法,对于任何一个对象都可以调用其属性和方法;这种动态获取信息和调用对象的方式,就是Jva的反射机制;
九、StringBuffer和StringBuilder比较
1.  在执行速度方面的比较:StringBuilder >  StringBuffer   
2.  StringBuffer与StringBuilder,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,不像String一样创建一些对象进行操作,所以速度就快了。
3.  StringBuilder:线程非安全的
  StringBuffer:线程安全的
    当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。


你可能感兴趣的:(Android面试知识)