Android 面试主题集合整理

本文讨论了JDK中的原子类、锁机制(synchronized和LOCK),以及可见性和有序性在多线程编程中的重要性。同时涵盖了Android面试中关于ListView优化、安全问题、APK包减小、加密方法、内存管理等方面的内容。
摘要由CSDN通过智能技术生成

JDK中提供了很多atomic类,如 AtomicInteger\AtomicBoolean\AtomicLong,它们是通过 CAS 完成原子性。 JDK 提供锁分为两种:synchronized 依赖 JVM 实现锁,该关键字作用对象的 作用范围内同一时刻只能有一个线程进行操作。另一种是 LOCK,是 JDK 提供的代码层面的锁,依赖 CPU 指令,代表性是 ReentrantLock。

2)可见性:一个线程对主内存的修改及时被其他线程看到。

JVM 提供了 synchronized 和 volatile,volatile 的可见性是通过内存屏障和禁 止重排序实现的,volatile 会在写操作时,在写操作后加一条 store 屏障指令, 将本地内存中的共享变量值刷新到主内存;会在读操作时,在读操作前加一条 load 指令,从内存中读取共享变量。

3)有序性:指令没有被编译器重排序。

可通过 volatile、synchronized、Lock 保证有序性。

10、两个进程同时要求写或者读,能不能实现?如何防止进程的同步?

我认为可以实现,比如两个进程都读取日历进程数据是没有问题,但同时写,应 该会有冲突。

可以使用共享内存实现进程间数据共享。

二、Android 面试帮助篇


1、要做一个尽可能流畅的 ListView,你平时在工作中如何进行优化的?

①Item 布局,层级越少越好,使用 hierarchyview 工具查看优化。

②复用 convertView

③使用 ViewHolder

④item 中有图片时,异步加载

⑤快速滑动时,不加载图片

⑥item 中有图片时,应对图片进行适当压缩

⑦实现数据的分页加载

2、对于 Android 的安全问题,你知道多少

①错误导出组件

② 参数校验不严

③WebView 引入各种安全问题,webview 中的 js 注入

④不混淆、不防二次打包

⑤明文存储关键信息

⑦ 错误使用 HTTPS

⑧山寨加密方法

⑨滥用权限、内存泄露、使用 debug 签名

3、如何缩减 APK 包大小?

代码保持良好的编程习惯,不要重复或者不用的代码,谨慎添加 libs,移除使用不到的 libs。

使用 proguard 混淆代码,它会对不用的代码做优化,并且混淆后也能够减少安 装包的大小。

native code 的部分,大多数情况下只需要支持 armabi 与 x86 的架构即可。如果 非必须,可以考虑拿掉 x86 的部分。

资源

使用 Lint 工具查找没有使用到的资源。去除不使用的图片,String,XML 等等。 assets 目录下的资源请确保没有用不上的文件。

生成 APK 的时候,aapt 工具本身会对 png 做优化,但是在此之前还可以使用其 他工具如 tinypng 对图片进行进一步的压缩预处理。

jpeg 还是 png,根据需要做选择,在某些时候 jpeg 可以减少图片的体积。 对于 9.png 的图片,可拉伸区域尽量切小,另外可以通过使用 9.png 拉伸达到大图效 果的时候尽量不要使用整张大图。

策略

有选择性的提供 hdpi,xhdpi,xxhdpi 的图片资源。建议优先提供 xhdpi 的图片, 对于 mdpi,ldpi 与 xxxhdpi 根据需要提供有差异的部分即可。

尽可能的重用已有的图片资源。例如对称的图片,只需要提供一张,另外一张图 片可以通过代码旋转的方式实现。

能用代码绘制实现的功能,尽量不要使用大量的图片。例如减少使用多张图片组 成 animate-list 的 AnimationDrawable,这种方式提供了多张图片很占空间。

4、Android 与服务器交互的方式中的对称加密和非对称加密是什么?

对称加密,就是加密和解密数据都是使用同一个 key,这方面的算法有 DES。 非对称加密,加密和解密是使用不同的 key。发送数据之前要先和服务端约定生 成公钥和私钥,使用公钥加密的数据可以用私钥解密,反之。这方面的算法有 RSA。ssh 和 ssl 都是典型的非对称加密。

三、Android 面试常见题


**1、java 中==和 equals 和 hashCode 的区别 **

基本数据类型的比较的值相等. 类的比较的内存的地址,即是否是同一个对象,在不覆盖 equals 的情况下, 同比较内存地址,原实现也为 == ,如 String 等重写了 equals 方法. hashCode 也是 Object 类的一个方法。返回一个离散的 int 型整数。在集合类操作 中使用,为了提高查询速度。(HashMap,HashSet 等比较是否为同一个) 如果两个对象 equals,Java 运行时环境会认为他们的 hashcode 一定相等。 如果两个对象不 equals,他们的 hashcode 有可能相等。 如果两个对象 hashcode 相等,他们不一定 equals。 如果两个对象 hashcode 不相等,他们一定不 equals。

2、int 与 integer 的区别

int 基本类型

integer 对象 int 的封装类

3、String、StringBuffer、StringBuilder 区别

String:字符串常量 不适用于经常要改变值得情况,每次改变相当于生成一个新 的对象

StringBuffer:字符串变量 (线程安全)

StringBuilder:字符串变量(线程不安全) 确保单线程下可用,效率略高于 StringBuffer

4、什么是内部类?内部类的作用

内部类可直接访问外部类的属性

Java 中内部类主要分为成员内部类、局部内部类(嵌套在方法和作用域内)、匿名 内部类(没构造方法)、静态内部类(static 修饰的类,不能使用任何外围类的 非 static 成员变量和方法, 不依赖外围类)

5、进程和线程的区别

进程是 cpu 资源分配的最小单位,线程是 cpu 调度的最小单位。 进程之间不能共享资源,而线程共享所在进程的地址空间和其它资源。 一个进程内可拥有多个线程,进程可开启进程,也可开启线程。 一个线程只能属于一个进程,线程可直接使用同进程的资源,线程依赖于进程而存在。

6、final,finally,finalize 的区别

final:修饰类、成员变量和成员方法,类不可被继承,成员变量不可变,成员方法 不可重写

finally:与 try…catch…共同使用,确保无论是否出现异常都能被调用到

finalize:类的方法,垃圾回收之前会调用此方法,子类可以重写

finalize()方法实现对 资源的回收

7、Serializable 和 Parcelable 的区别

Serializable Java 序列化接口 在硬盘上读写 读写过程中有大量临时变量的生成, 内部执行大量的 i/o 操作,效率很低。

Parcelable Android 序列化接口 效率高 使用麻烦 在内存中读写(AS 有相关插件 一键生成所需方法) ,对象不能保存到磁盘中

8、静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?

可继承 不可重写 而是被隐藏

如果子类里面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为 “隐藏”。如果你想要调用父类的静态方法和属性,直接通过父类名.方法或变量名 完成。

9、成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用

Java 中内部类主要分为成员内部类、局部内部类(嵌套在方法和作用域内)、匿名内部类(没构造方法)、静态内部类(static 修饰的类,不能使用任何外围类的 非 static 成员变量和方法, 不依赖外围类)

使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现, 所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。

因为 Java 不支持多继承,支持实现多个接口。但有时候会存在一些使用接口很 难解决的问题,这个时候我们可以利用内部类提供的、可以继承多个具体的或者 抽象的类的能力来解决这些程序设计问题。可以这样说,接口只是解决了部分问 题,而内部类使得多重继承的解决方案变得更加完整。

10、string 转换成 integer 的方式及原理

String integer Intrger.parseInt(string);

Integer string Integer.toString();

四、初级面试专题(中小厂)


1、导致内存泄露的原因有哪些?

2、理解 Activity,View,Window 三者关系

3、Handler 的原理

4、View,ViewGroup 事件分发

5、onNewIntent()什么时候调用?(singleTask)

6、mvc 和 mvp mvvm

7、自定义控件

8、Serializable 和 Parcelable 的区别

学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

image

七大模块学习资料:如NDK模块开发、Android框架体系架构…

image

2021大厂面试真题:

image

只有系统,有方向的学习,才能在短时间内迅速提高自己的技术,只有不断地学习,不懈的努力才能拥有更好的技术,才能在互联网行业中立于不败之地。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

1大厂面试真题:

[外链图片转存中…(img-T4b6cYvj-1714335929239)]

只有系统,有方向的学习,才能在短时间内迅速提高自己的技术,只有不断地学习,不懈的努力才能拥有更好的技术,才能在互联网行业中立于不败之地。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值