Android面试知识整理-java篇

Android面试知识整理-android基础知识

Android面试知识整理-性能优化

Android面试知识整理-android版本新特性

以下内容,是我根据自己的理解,对Java知识进行总结,如有不足,希望大神多多指正。

1.java虚拟机

内存包括内存共享区和内存私有区,共享区包括堆和方法区,私有区包括虚拟机栈、局部变量表、本地方法区,除了这些一些虚拟机还包括直接内存,通过NIO技术可以操作。

:中包括几乎所有对象和数组,虚拟机优化之后,一些对象会在栈上执行,是因为逃逸技术。

方法区:包括final、static、编译后的class。

虚拟机栈:包括局部变量表、操作数栈、返回地址、动态链接、本地线程缓存等,进行对象引用的入栈出栈操作,局部变量表中存放一些基本数据类型和局部变量的引用。

本地方法栈:存放native的方法

程序计数器:为当前线程进行标识,为什么需要程序计数器?因为需要线程切换

为什么jvm要使用栈,先进后出,符合方法间的调用

2.垃圾回收机制

垃圾回收主要是堆和方法区,按照GC Root引用链,回收引用的对象,包括栈中引用、本地方法区引用、final、static引用的对象。其中方法区回收效率差,只回收无用final和无用类。

引用分为:

强引用,new对象,只要存在就不会回收,只有当引用为null时,才会回收

软引用,在内存溢出OOM时进行回收

弱引用,下一次垃圾回收gc时候回收

虚引用,在回收时候进行一些操作,收到一个系统通知

另外,没有引用,内存满了必然回收

分为新生代、老年代、永久带(方法区)

gc算法一般分为copy算法、mark算法、分代收集算法

copy算法使用一个大的Eden空间和两个小的survivor空间,将存活的对象,先复制到Eden和一个survivor里,不够再使用survivor,再不够使用老年代,始终保证一个survivor为空闲。

Mark算法标记存活的进行回收

3.多线程并发

CPU核心数即通常说的双核、四核、八核,线程数一般与核心数为2:1的关心,源于后来Intel提出的超线程技术。

而我们通常开发时用到的线程是通过时间片轮转机制,将线程分为一个个时间片实现并发的。

进程是操作系统分配的资源,包括CPU、内存空间、磁盘IO等,一个进程对应多个线程,线程的并行是真正的同时执行,而并发需要在一段时间内运行,需要有时间的概念。

线程在使用时候还需要注意线程安全的问题,和synchronized同步有关。以及线程调用时候注意死锁问题。

Java中只有Tread具有线程的概念

线程启动的方式有三种:

1、x extends Thread;然后运行x.run();然后调用start();

2、x implements Runnable;实现run方法,然后new Thread(run).start();

3、x implements Callable;实现call方法,然后new FutureTask<>(call);然后new Thread(run).start();

其中FutureTask实现了Future和Runnable接口。

线程的中止:有一些过期的API提供了stop(),stop()不保证线程的资源是否正常释放,所以被废弃了;常用的中止方法为interrupt,在这里就体现了线程是协作式的,而不是抢占式的。interrupt配合isInterrupted()或Thread.interrupted()来使用,原理是通过设置Boolean标志位实现。

线程的yield()方法:让出当前线程的CPU占有权,但让出时间不确定。

线程的join方法:把指定的线程加入到当前线程,意思是把两个线程顺序执行,如在B中A.join(),会先执行A,再执行B.

线程同步实现:synchronized内置锁机制,其实是对象锁和类锁的概念,通过锁定类、方法、代码块实现线程锁定以及同步。还有显示锁Lock,显示锁是一个接口,通过ReentrantLock实现,内置锁不可以配置,显示锁可以实现一些其他功能,如中断锁、超时获取锁、非阻塞获取锁等。还包括读写锁的方法。非公平锁比公平锁性能更优。通过condition实现了类似wait方法的功能。

线程协作,即生产消费者模式,由于线程难以及时响应,所以难以有效的协作。通过wait()/notifyAll()有效的实现了线程间的协作,并且在使用时都要有synchronized内置锁控制。

线程隔离,即ThreadLocal,它是键值对结构,以ThreadLocal为键,包括initialValue、get、set、remove等方法。

handler机制的Looper对象就是通过ThreadLocal实现的。

线程池Threadpool:好处实现线程的复用,降低消耗、提高响应速度

线程池七个主要参数:

corePoolSize:线程池线程核心数

maximumPoolSize:线程池中运行最大线程数

keepAliveTime:线程没有任务运行时,继续存活的时间

TimeUnit:keepAliveTime时间单位

workQueue:BlockingQueue阻塞队列,满了阻塞的意思

threadFactory:线程工厂,线程命名时用到

RejectedExecutionHandler:饱和策略,当线程池满了,执行一些方法,如抛出异常、执行任务、丢弃任务

工作机制:当线程小于corePoolSize,新建线程,若线程多于corePoolSize,加到阻塞队列里,若阻塞队列满了,新建线程,若新建的线程超过maximumPoolSize,则调用RejectedExecutionHandler.rejectedExecution()方法。

cpu密集型设置cpu+1,IO密集型设置2×cpu,混合型视情况而定。

AsyncTask原理:创建时通过创建线程池和串行化任务,执行时从队列中轮询,消息处理通过handler实现

缺点:不适合大量UI异步更新,需要考虑多线程的控制问题。

static:执行时不依附于任何对象,先于类中其他对象执行,可以通过this来调用,如this.static对象

4.设计模式

创建型:

1.单例模式:

优选方案:饿汉式、静态内部类、双重加锁dcl需加volatile关键字

2.建造者模式:

用户不关心产品是如何创建的,直接调用

应用场景:AlertDialog.builder

3.工厂方法模式


每一个产品对应每一个工厂

4.简单工厂模式

实现了接口的简单封装,一个工厂生产很多产品

5.抽象工厂模式

抽象工厂可以理解成:一个工厂里可以生产多个产品

6.原型模式

调用clone方法实现对象的拷贝

浅拷贝:直接将对象引用拷贝给新对象

深拷贝:先复制一个对象,然后将新对象进行浅拷贝

应用场景:Intent中实现了Cloneable接口,但却用new实现的

结构性模式

7.代理模式

一个真实对象接口,一个真实对象,一个代理对象,代理对象持有真实对象的引用

动态代理:一个真实对象接口,一个真实对象,一个动态代理类,实现了InvocationHandler方法,重写它的invoke(),内部用反射实现

应用场景:ActivityManager中的ActivityManagerProxy

8.组合模式:部分—整体模式


透明的组合模式:抽象类里包含所有抽象方法

安全的组合模式:抽象类里包含基本方法,一些其他方法在子类实现

应用场景:ViewGroup与View,并且是安全的组合模式

9.适配器模式:

对象适配器:适配器中持有源对象的引用

类适配器:继承源对象,实现adapter接口,不需要持有源对象引用

应用场景:RecyclerView属于类适配器

10.装饰者模式

扩展一个类的额外功能时,是继承的替代方案之一

应用场景:Context类,Context是具体抽象类,ContextImpl具体实现类,ContextWrapper是装饰角色,Activity、Service是扩展的功能

11、桥接模式

如果两端都需要拓展,可以用桥接模式,比如,人穿衣服,衣服有多种,人有多种,可以进行拓展(人中需要持有衣服的引用)

应用场景:window与windowManager,AbsListView与ListAdapter

12、享元模式

池技术重要实现技术,减少重复对象的创建,通过享元工厂管理享元角色

应用场景:String字符串常量池

13、外观模式(门面模式)

对子系统进行封装,封装成一个类,调用封装类

行为型模式

14、策略模式

抽象类实现策略方法,然后实现类实现,可以用来优化if-else语句结构

应用场景:ArrayAdapter与SimpleAdapter就是策略模式

15、状态模式

与策略模式类似,但本质不同,不同行为有不同状态

16、责任链模式

抽象类持有下一个引用(引用自身)

应用场景:ViewGroup与view事件分发

17、观察者模式

观察者与主题(被观察者),主题通知观察者,主题发送,观察者接受并更新

应用场景:view的setOnClickListener监听

18、模板方法模式

抽象类与实现类之间的关系,包括钩子方法(空实现或者返回Boolean)、抽象方法、具体方法

应用场景:view的draw()

19、迭代器模式

容器接口中包含迭代器接口,在迭代器实现类中调用容器接口

应用场景:Map、List、Cursor

20、备忘录模式

三个类之间的关系,一个发起人创建备忘录、一个备忘录、一个负责管理备忘录

应用场景:onSaveInstanceState和onRestoreInstanceState

21、访问者模式

将数据结构与数据操作分离,适用于结构较稳定的元素操作上

22、中介者模式

比如房产中介,将网状结构变为星状结构,中介只有通知功能,同事之间发送信息都通过中介

应用场景:android锁屏功能

23、解释器模式

应用场景:AndroidManifest.xml通过PackageManagerService使用了PackageParser这个类来解释的

24、命令模式

通过Command实现类控制接受、用户调用命令,接受者执行,实现了调用者和接受者之间解耦

应用场景:Handler(Handler接受者、Looper调用者、Message命令类)

未完待续~

好吧这是一篇很长的文章。。

鸣谢

https://ke.qq.com/course/341933享学课堂Mark、king老师

https://www.jianshu.com/p/d59c64480ed8

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350