校招的日子结束了,结果也算圆满。忙碌了一阵子,现在终于可以安安静静的做做项目看看书写写论文了。下面对这段时间面试遇到的问题并结合网上各位的大神秒下的面试题做个总结,本文会持续更新,希望能在面试中助各位一臂之力!
BitmapFactory.Options options = newBitmapFactory.Options();
options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一
Bitmap bitmap =BitmapFactory.decodeStream(cr.openInputStream(uri), null, options); preview.setImageBitmap(bitmap);
static class MyHandler extends Handler
{
WeakReference mActivityReference;
MyHandler(Activity activity)
{
mActivityReference= new WeakReference(activity);
}
@Override
public void handleMessage(Message msg)
{
final Activity activity = mActivityReference.get();
if (activity != null)
{
mImageView.setImageBitmap(mBitmap);
}
}
}
ArrayList和LinkedList在性能上各 有优缺点,都有各自所适用的地方,总的说来可以描述如下:
1. 对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对 ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是 统一的,分配一个内部Entry对象。
2. 在ArrayList的 中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
3. LinkedList不 支持高效的随机元素访问。
4. ArrayList的空 间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间
可以这样说:当操作是在一列 数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一列数据的前面或中 间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。
public class Hashtable extends Dictionary implements Map
public class HashMap extends AbstractMap implements Map
ail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。
将方法声明为final那有两个原因,第一就是说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。第二就是允许编译器将所有对此方法的调用转化为inline调用的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以你要慎用final进行方法定义。
private Looper()
{
mQueue = new MessageQueue();
mRun = true;
mThread = Thread.currentThread();
}
final MessageQueue mQueue;
final Looper mLooper;
final Callback mCallback; //用于回调
Handler对象在发送消息的时候,将MSG的target变量设为自己。这样在Looper对象循环取出msg的时候就可以调用对应handler的dispatchMessage()。此函数分发消息的优先级如下:
1. Message在创建的时候调用Obtain设置了Callback。
2. Handler在创建的时候传入了Callback。
3. 交给Handler子类的HandleMessage处理(通常的做法)。
standard和singleTop模式。
这两种比较简单。创建Activity放入当前的任务栈中,若当前是singleInstace,则放入设置的任务栈中。其中如果Activity在栈顶,则调用onNewIntent。
singletask:栈内复用模式。不是在当前任务栈中查找是否存在,实际过程如下:
1. 查找该Activity所需的任务栈是否存在(由taskAffinity控制,或者默认为包名)。
2. 在任务栈当中查找该Activity是否存在。
这里面存在任务栈的切换,也就是当开启的singtask类型的Activity不属于当前任务栈时,则会切换到其任务栈。
singleInstance:单实例模式。
包含了singleTask的所有特性,另外加上:设置为该模式的Activity,只能单独存在于一个任务栈中。当有两个singleInstace的Activity设置成同样的任务栈时,会出现两个同名的任务栈,分别用来存放同名的Activity。
注:在任何跳转的时候,首先调用本Activity的onPause,然后跳转。如果被跳转的activity由于启动方式而没创建新的实例,则会先调用onNewIntent,然后按照正常的生命周期调用。
如
1:A→B,A:onPause;B:onCreate,onStart,onResume。
2:A(singleTop)→A,A:onPause;A:onSaveInstanceState;A:onResume。
推荐郭霖大神的博客:
http://blog.csdn.net/guolin_blog/article/details/16330267
推荐以下博客:
http://blog.csdn.net/qinjuning/article/details/6936783
推荐以下博客:
http://wiki.jikexueyuan.com/project/deep-android-v2/activity.html
Activity之间的协作当一个activity A启动了另外一个activity B,它们的生命周期是有交叉的;
首先A的onPause()被调用;
之后B的onCrate(), onStart()及onResume() 方法会被调用(此时B拥有用户焦点);
最后,如果A在屏幕上不可见,onStop()方法被调用;
因此,我们在两个activities中传递数据,或者共享资源时(如数据库连接),需要在前一个activity的onPause()方法而不是onStop()方法中进行;
http://www.cloudchou.com/android/post-788.html
以上是我遇到和搜集到的各类题目以及相应的解答,接下来一段时间也会持续更新,大家遇到什么经典或者不会的问题也可以给我留言,在此统一分享给大家。祝大家能够找到自己心仪的工作,前途一片光明!