以下的知识适合各位刚要找工作的小白菜们,大神请呵呵走过。
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有以下差别:
二、java的四种引用类型:
1、强引用,如通过new实例化一个对象a,引用该对象a则称为强引用;当对象a不在被引用时才有可以被JVM回收,否则当内存不足时,程序会选择报OOM而不是回收该对象;
2、软引用,创建软引用对象,目的是为了告诉JVM当内存不足时哪些对象可以被暂时回收;
3、弱引用,该对象可以被JVM随时回收,;HashMap例子HaspMap键值可以存放一个对象,当该对象为强引用,且多次被添加到HashMap的时候,就会过多的暂用内存,所这个时候可以采用WeakHashMap来解决这个问题;
4、虚引用:
三、Java常用的几种设计模式:
1、单例:永远只有一个实例化的对象,单例的类如下:请记得加上static,并且深刻理解static的生命周期,面试容易被叼
public class instance
{
private static instance myInstance;
private instance()
{ };
public static 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<n;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的,就是速度的原因。
十、Acitivity的四种启动模式
前提概念:android的Task类似activity的任务栈
1、standard,默认:每次启动一个activity都会为该activity创建一个新的实例,并且放入当前Task中,不会重新创建Task。比如从A到A,会创建出两个A的实力放在栈内;
2、singleTop,比如从A到A,若A已经在栈顶,则不重新创建A,否则重新创建实例A,并且放到栈顶;
3、singleTask:比如从A到B,当B不在时候直接创建B放入栈顶,否则,当B存在但不在栈顶,则将B后的activity都弹出栈顶;当B存在且在栈顶,则与singTop相同;
4、singleInstance:利用这种模式加载,activity总是会会与Task栈顶,且该activy中包含该activity;