Android 面试
来源:互联网 发布:酒店网络营销策划方案 编辑:程序博客网 时间:2024/06/08 19:58
ArrayList和Vector的区别
ArrayList的底层实现是基于Object[],因此ArrayList具有数组的特性,即每个元素都有对应的索引,查询的效率较高。相对于数组,ArrayList具有容器扩容的特性(增加原来空间的50%),也就是自增长的机制。但是ArrayList不是线程安全的,要开发线程安全的ArrayList还需要开发人员用代码实现。
Vector底层的实现也是基于Object[],Vector也具有自增长的机制(增加原来空间的一倍),Vector是多线程安全的。但是Vector的性能较低。
IO流
- FileInputStream、FileOutputStream
- 前者文件必须是存在并且是可读的,后者输出文件必须存在并且是可覆盖的。
- PipedInputStream、PipedOutpStream
- 两个实例要同时使用,共同完成管道的读取写入操作。主要用于线程操作。管道输入流包含一个缓冲区,可以在缓冲区限定范围内将读操作和写操作分离开。如果想连接管道输出流提供数据字节的线程不存在,则认为该管道已经损坏了。
- BufferedInputStream、BufferedOutputStream
- Buffered缓冲流主要作用是将数据从原始数据流成块读入或者把数据积累到一个大数据块后再成批写出,通过减少系统资源的读写次数来加快程序的执行,提高数据访问的效率。并且BufferedOutputStream类仅仅在缓冲区满或者flush()的方法的时候才将数据写到目的地。
- InputStreamReader、OutputStreamWriter
- 在构造这两个类对应的流的时候,他们会自动进行转换,将平台缺省的编码集编码的字节转换为Unicode字符。对于英语环境来说,其缺省的编码集一般是ISO8859-1。
多线程Sleep()和yield()
sleep()让当前正在执行的线程休眠,有一种用法可以代替yield(),就是sleep(0).
yield()暂停当前正在执行的线程对象,并执行其他线程,也就是交出CPU使用时间。
区别
- sleep()方法会给其他线程运行的机会,而不考虑其他线程优先级,因此会给较低线程一个运行的机会,yield()方法只会给相同优先级或者更高优先级的线程一个运行的机会。
- 当线程执行了sleep(long millis)方法后,将转到阻塞状态。当线程执行了yield()方法后,将转到就绪状态。
- sleep()方法声明抛出InterruptException异常,而yield()方法没有声明抛出任何异常。
- sleep()方法比yield()方法具有更好的移植性。
多线程wait()和sleep()
sleep()和wait()方法的作用都是停止当前线程,其中sleep()是线程类(Thread)的方法,导致此线程暂定执行指定时间,将执行机会让给其他线程,但是监控状态依然保持,到暂停时间后会自动恢复。调用sleep()不会释放对象锁。
wait()是Object类的方法,因此该对象调用wait()方法会导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出的notify()方法(或notifyAll())后本线程才进入对象锁定池准备获得对象锁进入运行状态。
Java堆栈
JVM内存中由两个重要的空间,一个是栈内存,一个是堆内存。
在方法中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配的,当在一段代码块中定义一个变量的时候,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。
堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊变量就变成了数组或者这个变量的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起一个别名,或者代号。
Intent和PendingIntent
PendingIntent是延时意图,可以看做对Intent的包装,主要用于处理非及时的Intent,供当前APP与外部APP调用。PendingIntent主要持有的信息是它所包装的Intent和当前的App Context,即使当前App已经不存在了,也可以通过存在于PendingIntent中的Context来执行Intent。例如,用户点击通知栏中的消息的时候,跳转到App中的某个页面。
区别
- Intent是即时启动,随所在的Activity消失而消失,而PendingIntent用于处理非即时Intent。
- Intent在程序结束后终止,而PendingIntent在程序结束后依然有效。
- Intent需要在某个Context中运行,而PendingIntent自带Context
- Intent在原Task中运行,而PendingIntent在新的Task中运行。
- Intent一般用于Activity、Service、BroadcastReceiver之间传递数据,而PendingIntent一般用于消息通知上,可以理解为延迟执行的Intent。
服务的混合开启模式
服务的正常开启模式
一般情况下,服务的开启和停止的过程中调用的方法如下:
- start() -> stop() 开启服务-> 结束服务
- bind() -> unbind() 绑定服务 -> 解绑服务
服务的混合开启模式
混合调用的情况下,服务的开启和停止的过程中调用的方法如下:
- start() -> bind() -> stop() -> unbind() -> onDestory() 通常不会使用这种模式。开启服务 -> 绑定服务 -> 结束服务(服务不停) -> 解除绑定(服务停止)。
- start() -> bind() -> unbind() -> stop() 经常使用这种混合模式。开启服务 -> 绑定服务 -> 解绑服务(此时服务还继续运行)-> 结束服务(不用时,在停止服务)。
混合开启服务的方式既保证了服务可以长期在后台运行,又可以让调用者远程调用服务中提供的方法。
创建线程池
创建线程池使用的是ThreadPoolExecutor,ThreadPoolExecutor作为java.util.concurrent包对外提供基础的实现,以内部线程池的形式对外提供管理任务执行、线程调度、线程池管理等服务。
创建线程池ThreaPoolExecutor最核心的构造方法如下:
public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) {}
- corePoolSize:线程池维护线程的核心线程数。
- maximumPoolSize:线程池维护线程的最大数量。
- keepAliveTime:线程池维护线程所允许的空闲时间。
- unit:线程池维护线程所允许的空闲时间的单位。
- workQueue:线程池所使用的缓冲队列。
- threadFactory:新建线程工厂。
- handler:线程池对拒绝任务的处理策略。
避免ANR异常
全称:Application Not Responding,ANR
种类
- KeyDispatchTimeout(5 seconds):按键或者触摸事件在特定时间内无响应(主要类型)。
- BroadcastTimeout(10 seconds):BroadcastReceiver在特定时间内无法处理完成。
- ServiceTimeout(20 seconds):Service在特定事件内无法处理完成(小概率类型)。
避免方式
- 避免在主线程中进行复杂耗时的操作,如发送或者接收网络数据、进行大量计算、操作数据库、读写文件等。
- 避免在BroadCastReceiver中进行复杂操作,若必须在BroadCastReceiver中进行复杂操作,则可以在onReceive()方法中启动一个Service来处理。
- 在设计与代码编写阶段避免出现同步、死锁以及处理不恰当等情况。
测试
- JUnit单元测试
- Monkey测试
REST
REST(REpresentational State Transfer,表述性状态转移)从资源的角度来观察整个网路,分布在各处的资源由URI确定,对资源的操作包括获取、创建、修改和删除资源,这些操作正好对应HTTP协议提供的GET、POST、PUT、DELETE方法,REST通过操作资源的表现形式来操作资源。
资源的表现形式由XML、HTML、JSON文件等。
REST的优点
- 可以利用缓存Cache来提高响应速度。
- 通信本身的无状态性可以让不同的服务器处理一系列请求中的不同请求,提高服务器的扩展性。
- 浏览器即可作为客户端,简化软件需求。
- 相对于其他叠加在HTTP协议之上的机制,REST的依赖性更小。
- 不需要额外的资源发现机制。
- 在软件技术演进中的长期兼容性更好。
REST的缺点
- 在复杂的应用中,构造的URL会很长,影响对URL的理解。
- REST不能支持事务。
- 在安全应用中,REST方式先天不足,需要后期策略补救。
- 由于REST是一种架构风格,不是一个标准,加上每个人的理解的差异,造成了REST不能很好的统一,规范较困难。
Resource与HTTP方法对应
APK瘦身
APK的辅助分析工具是NimbleDroid,NimbleDroid是美国格罗比亚大学的博士创业团队研发出来的分析Android App性能指标的系统,通过这个系统能够得知App内存使用,网络使用,磁盘输入/输出,文件大小等一些NimbleDroid认为至关重要的数据。
开启混淆
开启混淆,删除无用的Java文件。开启minifyEnable(开启混淆,删除无用的Java文件),可以减少项目中的APK文件的大小,具体代码如下:
buildTypes { debug { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }}
去除无用的资源
去除无用的资源,同时去除工程中临时展示的图片。开启shrinkResource(去除无用的资源),同时去除工程中临时展示的图片可以减少APK文件的大小,具体代码如下:
buildTypes { debug { minifyEnabled false shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }}
删除无用的语言资源
删除无用的语言资源可以减小APK文件的大小,具体代码如下:
defaultConfig { resConfigs "zh"}
使用TinyPNG有损压缩
TinyPNG是一种智能有损压缩技术(通过降低图片中的颜色数量,来较少存储图片所需要的数据)来降低PNG图片的大小。这样的压缩对图片的影响是很小的,但是可以大大降低图片的大小,并且还能保持PNG的透明度。
由于TinyPNG将PNG图片压缩成为8位的,因此它的压缩比例非常的高,至少有50%以上的压缩比例,有些甚至达到了70%,并且压缩之后的图片和原图人眼基本看不出区别。
PNG图片准换成为JPG图片
对于非透明的大图,JPG将会比PNG的图片的大小有显著的优势,在启动页、活动页等之类的大图展示区采用JPG将是非常明智的选择,这样可以减小APK文件的大小。
使用webp格式
从Android 4.0+开始原生支持,但是不支持包含透明度的webp,直到Android 4.2.1+才开始支持显示含透明度的webp,使用时要特别注意使用格式工厂进行转换。
- WebP 相对于 PNG、JPG 有什么优势?
- 【腾讯Bugly干货分享】WebP原理和Android支持现状介绍
删除或者替换兼容包
删除或者替换兼容包(v4、v7、v13)中的无用的一些图。删除drawable-LDRTL(layout-direction-right-to-left的缩写),意味着布局方式从右到左,主要是为了适配阿拉伯语用。这应该是API17,即Android 4.2上新出的功能。
注意删除第三方库中使用的大图
so库的删除
建议实际工作的配置只保留armeabi、x86文件夹下的so文件。
selector效果
通过v4包中的Drawable Compat,通过着色方案实现selector效果。
Drawable icon = getResources().getDrawable(drawableId);Drawable tintIcon = DrawableCompat.wrap(icon);// 着色一个selectorDrawableCompat.setTintList(tintIcon, getResources().getColorStateList(R.color.xx));// 着色一个颜色DrawableCompat.setTintList(tintIcon, ColorStateList.valueOf(Color.BLUE));imageView.setImageDrawable(tintIcon);
使用shape代替图片
把so文件放置在网上或者sdcard内
- android面试
- Android面试
- Android面试
- android面试
- android 面试
- android面试
- android面试
- android面试
- android面试
- Android 面试
- android 面试
- android面试
- Android面试
- android面试
- android面试
- android 面试
- android面试。
- Android面试
- People类中添加Speak()方法
- Windows 下线程的设置
- BZOJ3944 Sum 杜教筛
- java集合框架之学生成绩排序
- GYM
- Android 面试
- README
- 符合ASIL D的AUTOSAR基础软件带来的安全和性能
- 机器学习实战-之SVM核函数与案例
- 机器学习实战 决策树代码 计算香农熵 Error return arrays must be of ArrayType
- angular框架的SmartAdmin模板 如何请求后台数据
- 575. Distribute Candies
- git 常用命令
- php中 $$str 中 "$$"是什麽意思