面试题集锦

基本知识

1.静态方法可以重写吗


父类的普通方法可以被继承和重写,不多作解释,如果子类继承父类,而且子类没有重写父类的方法,但是子类会有从父类继承过来的方法。

静态的方法可以被继承,但是不能重写。如果父类中有一个静态的方法,子类也有一个与其方法名,参数类型,参数个数都一样的方法,并且也有static关键字修饰,那么该子类的方法会把原来继承过来的父类的方法隐藏,而不是重写。通俗的讲就是父类的方法和子类的方法是两个没有关系的方法,具体调用哪一个方法是看是哪个对象的引用;这种父子类方法也不在存在多态的性质。《Java编程思想》中这样提到“只有普通的方法调用可以是多态的”。
>
何为静态?静态方法是类在加载时就被加载到内存中的方法,在整个运行过程中保持不变,因而不能重写。但非静态方法是在对象实例化时才单独申请内存空间,为每一个实例分配独立的运行内存,因而可以重写。

2.ArrayList和Vector的主要区别是什么?

1、Vector是多线程安全的,而ArrayList不是,这个可以从源码中看出,Vector类中的方法很多有synchronized进行修饰,这样就导致了Vector在效率上无法与ArrayList相比;

2、两个都是采用的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式是不同的,很多网友说Vector增加原来空间的一倍,ArrayList增加原来空间的50%,其实也差不多是这个意思,不过还有一点点问题可以从源码中看出,一会儿从源码中分析。

3、Vector可以设置增长因子,而ArrayList不可以,最开始看这个的时候,我没理解什么是增量因子,不过通过对比一下两个源码理解了这个,先看看两个类的构造方法:

3.RemoteView在哪些功能中使用

桌面小部件则是通过AppWidgetProvider来实现的,AppWidget本质是一个广播.

通知栏和桌面小部件的开发过程中都会用到RemoteView,它们在更新界面时无法像在Activity里面那样直接更新View,这是因为两者的界面都运行在其他线程中,确切的说是系统的SystemServer进程.为了跨进程更新界面,RemoteViews提供一系列set方法,并且这些方法只是View全部方法的子集,另外RemoteVIew支持的View类型也是有限的。

4.SurfaceView和View的区别是什么?

surfaceView是在一个新起的单独线程中可以重新绘制画面,而View必须在UI的主线程中更新画面。那么在UI的主线程中更新画面 可能会引发问题,比如你更新画面的时间过长,那么你的主UI线程会被你正在画的函数阻塞。那么将无法响应按键,触屏等消息。当使用surfaceView 由于是在新的线程中更新画面所以不会阻塞你的UI主线程。但这也带来了另外一个问题,就是事件同步。比如你触屏了一下,你需要surfaceView中 thread处理,一般就需要有一个event queue的设计来保存touch event,这会稍稍复杂一点,因为涉及到线程同步。

5.讲一下android中进程的优先级?

在Android中进程按优先级可以分为五类,优先级从高到低排列:
- 前台进程 该进程包含正在与用户进行交互的界面组件,比如一个Activity
- 可视进程 该进程中的组件虽然没有和用户交互,但是仍然可以被看到
- 服务进程 该进程包含在执行后台操作的服务组件,比如播放音乐的进程
- 后台进程 该进程包含的组件没有与用户交互,用户也看不到
- 空进程 没有任何界面组件、服务组件,或触发器组件**
Android系统是进程托管的,也就是说进程都是由系统来管理,系统会按照特定的算来来回收这些进程。在回收中秉承几个原则
1. 尽量延长进程的生命周期,不到必须的情况下不会回收,因为系统回收进程会影响用户体验
2. 按优先级从低到高进行回收
3. 同等优先级的进程越近使用越晚回收。
进程过一段时间后是会被回收的,但要遵循上面的这些原则,播放音乐的这个进程的优先级还是比较高的,所以被莫名其妙地回收的可能性不大,在播放音乐时平白无故地停止这样的情况很少对吧?service和application的生命周期有关,只要进程被回收,那么它所占用的所有资源将被回收。

6.静态变量持有Activity引用会导致内存泄露

仔细分析在一个静态成员的变量中保留了Activity里面的一个视图,可恶的是视图中保留了Context的引用,这个时候就产生了一个对象长期被引用,导致Activity无法被GC掉,Activity占用的内存也无法被GC掉。这个时候内存溢出发生了。
浅谈Android开发中内存泄露与优化
http://m.blog.csdn.net/article/details?id=50581404
http://www.linuxidc.com/Linux/2015-12/126432.htm

7.jni的开发流程

eclipse的jni的开发
dnk环境搭建
先要用编译,在bin里,用javah编译,生成.h文件。
编写Android.mk文件
用gunstep生成so文件。
用Android studio 来开发jni

8多线程、同步异步、线程池

并发:
多个用户争夺同一个资源(这个资源可以是服务器上的日志,可以是执行某一此sql操作,可以使ftp服务器上的某个文件等,又或者是程序中的某一个全局变量,因此我们可以称这种资源为:全局资源);
解释:
并发是在多个用户请求同一个资源的时候,或者是程序本身多线程请求同一个资源的时候造成的。
比如:
一个财务系统,两个人同时对总钱数进行操作,一个加10块一个减100块,注意这两个操作是同时进行的,那系统就不知道是加还是减了,这是并发问题。或者,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线程的处理的数据,而B线程又修改了A线程处理的数理(线程安全)。

异步:
A线程要请求某个资源,但是此资源正在被B线程使用中,因为没有同步机制存在,A线程
仍然请求的到这个资源,A线程无需等待。
同步:
A线程要请求某个资源,但是此资源正在被B线程使用中,因为同步机制存在,A线程请求
不到,怎么办,A线程只能等待下去。

同步与异步:
显然,同步最安全,最保险的。而异步不安全,容易导致死锁,这样一个线程死掉就会导致整个
进程崩溃,但没有同步机制的存在,性能会有所提升。所以对于同步与异步必须有所取舍。

8.1线程池

8.2同步机制的实现

Java同步机制有4种实现方式:(部分引用网上资源)

① ThreadLocal ② synchronized( ) ③ wait() 与 notify() ④ volatile

目的:都是为了解决多线程中的对同一变量的访问冲突
ThreadLocal
ThreadLocal 保证不同线程拥有不同实例,相同线程一定拥有相同的实例,即为每一个使用该
变量的线程提供一个该变量值的副本,每一个线程都可以独立改变自己的副本,而不是与其它线程的副本冲突。
优势:提供了线程安全的共享对象
与其它同步机制的区别:同步机制是为了同步多个线程对相同资源的并发访问,是为了多个线程之间进行通信;而 ThreadLocal 是隔离多个线程的数据共享,从根本上就不在多个线程之间共享资源,这样当然不需要多个线程进行同步了。

volatile
volatile 修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。

而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。
优势:这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
缘由:Java 语言规范中指出,为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而

且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。这样当多个线程同时与某

个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。而 volatile 关键字就

是提示 VM :对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
使用技巧:在两个或者更多的线程访问的成员变量上使用 volatile 。当要访问的变量已在

synchronized 代码块中,或者为常量时,不必使用。
线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的

是B。只在某些动作时才进行A和B的同步,因此存在A和B不一致的情况。volatile就是用来避免这种

情况的。 volatile告诉jvm,它所修饰的变量不保留拷贝,直接访问主内存中的(读操作多时使用

较好;线程间需要通信,本条做不到)

Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自

动发现 volatile 变量的最新值。Volatile 变量可用于提供线程安全,但是只能应用于非常有限的

一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。

您只能在有限的一些情形下使用 volatile 变量替代锁。要使 volatile 变量提供理

想的线程安全,必须同时满足下面两个条件:

对变量的写操作不依赖于当前值;该变量没有包含在具有其他变量的不变式中。

sleep() vs wait()
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监

控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁

定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁

进入运行状态。

(如果变量被声明为volatile,在每次访问时都会和主存一致;如果变量在同步方法或者同步块中

被访问,当在方法或者块的入口处获得锁以及方法或者块退出时释放锁时变量被同步。)

8.3 java同步机制:synchronized

9.view相关

9.1自定义view
自定义view的步骤
自定义viewgroup的方法,动态加载

9.2图表,柱状图
9.3新特性view
Android开发之RecyclerView的使用全解
9.4字体阴影

10.http反馈码

HTTP协议状态码表示的意思主要分为五类 ,大体是 :
1××   保留
2××   表示请求成功地接收
3××   为完成请求客户需进一步细化请求
4××   客户错误
5××   服务器错误

11.asyctask的实现原理

AsyncTask的本质是一个线程池,所有提交的异步任务都会在这个线程池中的工作线程内执行,当工作线程需要跟UI线程交互时,工作线程会通过向在UI线程创建的Handler(原理见:《Handler+Looper+MessageQueue深入详解》)传递消息的方式,调用相关的回调函数,从而实现UI界面的更新。
1、 AsyncTask的本质是一个静态的线程池,AsyncTask派生出的子类可以实现不同的异步任务,这些任务都是提交到静态的线程池中执行。

2、线程池中的工作线程执行doInBackground(mParams)方法执行异步任务

3、当任务状态改变之后,工作线程会向UI线程发送消息,AsyncTask内部的InternalHandler响应这些消息,并调用相关的回调函数

12.handler的是怎样实现的

handler不是不可以在子线程里生成,生成时,需要prepare,否则报错。
具体见博客。
handler的实现原理,代码

13.ArrayList和LinkedList的区别

arraylist,linkedlist,vector的区别呢?
一般大家都知道ArrayList和LinkedList的大致区别:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

14.序列化Serializable和Parcelable的理解和区别

15.65k 64k个方法的限制

当Android系统启动一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt。DexOpt的执行过程是在第一次加载Dex文件的时候执行的。这个过程会生成一个ODEX文件,即Optimised Dex。执行ODex的效率会比直接执行Dex文件的效率要高很多。但是在早期的Android系统中,DexOpt有一个问题,也就是这篇文章想要说明并解决的问题。DexOpt会把每一个类的方法id检索起来,存在一个链表结构里面。但是这个链表的长度是用一个short类型来保存的,导致了方法id的数目不能够超过65536个。当一个项目足够大的时候,显然这个方法数的上限是不够的。尽管在新版本的Android系统中,DexOpt修复了这个问题,但是我们仍然需要对老系统做兼容。
android studio 中这样做

android{
    defaultConfig {
        ...
         // Enabling multidex support.
         multiDexEnabled true
    }

    dexOptions {
        javaMaxHeapSize "4g" //set the max heap size for dexing to 4GB.

        incremental true
    }
}

dependencies {
    //compile fileTree(include: ['*.jar'], dir: 'libs')
    //compile project(':library')
    compile 'com.android.support:multidex:1.0.1'
    ...
}

16.webview和js的交互,cordova,crosswalkwebview,react native

17. activity view window的区别

18.handler thread handlerthread

handlerthread的用法

2.框架知识

利用了什么框架
框架是何种原理

2.1afinal

github项目地址

2.2http android Android http请求代码

HttpClient和HttpURLConnection的区别

okhttp 图片上传 断点续传

github地址
android 介绍Retrofit的简单使用
Retrofit原理及调用流程分析

xutils

github地址
Android-xUtils框架原理分析

im

比较好的,就是下面这俩个,
腾讯im 免费,企业和个人
网易云信 个人有期限,企业收费

bug上报实时

bugly
bghd

二维码 中兴

图片加载框架

视频播放

vitamio
ijkplayer
vlc

rxjava

ButterKnife基本使用

https://github.com/JakeWharton/butterknife

3.模式知识

3.1观察者模式

3.2单例模式

4.技术博客

为知笔记

github项目

Android:学习AIDL,这一篇文章就够了(上)

MVC以外的另两种软件架构(ORM,IOC)

android–动态加载、插件化

mvp
使用新版Android Studio检测内存泄露和性能

5.做过的项目,开发环境

移动项目:开发,项目经理
个人仓库
无线电管理监测
智能玩具交互
党建加油站 视频播放器
混合开发:rn,cordova

后台:
spring hibernate
node

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不对法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值