Android面试题—校招—阿里

1 String类为什么是final

重要的是不可变性和快速加载性,可以变为内链模式。因为很多都在用String,所以最好的办法就是让他们不可被继承

2 Hashmap的原理:

哈希表是基于 数组+链表的结构
Hashmap其实也是一个数组(其中存放链表的实现 Entry[] 数组

Hashmap里实现了一个静态内部类Entry,里面含有 key,value,next。

hashcode来标示对象应该存放到哪儿。如果有相同的hashcode则会头插next
再通过keys.equals()去找LinkedList的正确节点。

Treemap的原理:

基于TreeSet基于红黑树。

3 List接口的实现类:ArrayList, Vector LinkedList

ArrayList:实现了List接口,用数组保存对象,同步,扩容1.5

Vector:其他同上,不同步,扩容2

LinkedList:用链表保存对象,不同步。

 

Set接口的实现类:HashSetTreeSet

HashSet:底层是基于HashMap来实现的,其中元素位于HashMapkeyvalue为统一的:private static final Object PRESENT = new Object();扩容为2

TreeSet基于红黑树。

4 JAVA中队列的区别。阻塞队列,非阻塞队列,普通队列

1 阻塞队列:队列为空时,获取元素将被阻塞

5 Class.forName classLoader的区别?

1.Class.forName返回的Class对象可以决定是否初始化。而ClassLoader.loadClass返回的类型绝对不会初始化,最多只会做连接操作。

2.Class.forName可以决定由哪个classLoader来请求这个类型。而ClassLoader.loadClass是用当前的classLoader去请求。

 

6 string stringBuilder StringBuffer

String为不可变类。String对象一旦被创建,就不能修改。新建的基础是StringBuffer

StringBuffer为可变类。 同步

StringBuilder可变。 不同步。

 

7 Synchronized lock:

Synchronized :可以加在方法,代码块。 Lock要显示的关闭和开锁。

Synchronized在竞争激烈的时候性能不如Lock

 

8 HashTable HashMap

HashTable 同步,HashMap不同步。

HashTable不允许key value null.

9 Abstract class Interface区别

接口是抽象类的特殊体。其中的成员变量都是public static final,方法都是 public abstract的。方法只有方法体。 不声明的话,默认也是这样的。

抽象类 可以实现部分方法。

接口强调 功能,是has-a 抽象类强调 所属关系  is-a

 

10 JAVA基础类型及其大小。

类型 字节长度

Byte 1

Boolean 1

Char 2

Short 2

Int 4

Float 4

Double 8

Long 8

 

11 hash的方法:

开放地址法:线性探测 +1,+2,二次探测+1平方,+2平方,

链地址法

 

12 NIO: non blocking io 非阻塞型IO,基于Buffer的。

组成:channel selector buffer 三部分

Channel:非阻塞型的双向通道 通道的两边都可以进行读写

Selector:用一个线程管理多个通道。

Buffer:用来保存数据。

 

13 JAVA GC模型以及算法:

模型:有向图

算法:压缩回收,复制回收,按代回收(堆分为多个子堆,一个子堆一个代,优先年轻)

 

14 runstart的区别

直接调用run,是同步的,无法达成多线程的目的

Start方法可以异步调用线程中的run方法,以此达到多线程的目的。

 

15 sleep() wait()yield

sleepThread类的静态方法,是线程用来控制自身流程的。到时间自动醒,不涉及线程间的通信,所以也就不会释放锁。需要throws InterruptedException

WaitObject的方法,用于线程间的通信,只能用notify notifyAll唤醒。释放锁。

yield声明当前线程回到可执行状态,有可能立刻被执行,且无声明异常

 

16 throw  throws  throwable error exception

throw用于在方法内抛出一个异常,因为每次抛一个,所以用throw

throws用于声明当前方法可能抛出的异常,存在多个,所以用throws

throwableErrorException的父类。

Error表示系统级的问题,不应该被捕捉

Ecetption表示异常,

 

17 ClassLoader机制。

 

什么是类的加载:

当程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过加载,连接,初始化三个步骤来对该类进行初始化,JVM将会连续完成这三个步骤,也把这三个步骤统称为类加载或类初始化。

类加载指的是将类Class文件读入内存,并为之创建一个java.lang.Class对象,也就是说程序使用任何类时,系统都会为之建立一个java.lang.Class对象

 

什么时候加载?

类的加载时机,肯定是在运行时,但并不是一次性全部加载,而是按需动态,依靠反射来实现动态加载,一般来说一个class只会被加载一次,之后就会从jvmclass实例的缓存中获取,谁用谁取就可以了,不会再去文件系统中加载.class文件了。

创建类的实例

访问类的静态变量

访问类的静态方法

反射 ( Class.forName("my.xyz.Test") )

当初始化一个类时,发现其父类还未初始化,则先出发父类的初始化

虚拟机启动时,定义了main()方法的那个类先初始化

 

1 JAVA中的ClassLoader

ClassLoader用来加载classJVM中,

基础有一个叫做 bootstrap classLoader(启动类加载器)。这个ClassLoaderJVM运行的时候加载java核心API。其中就包括自定义的ClassLoader.(ExtClassLoader,AppClassLoader)

ExtClassLoader:加载java中扩展的API。在\lib\ext中的类

AppClassLoader:加载java中,被CLASSPATH变量定义的路径下的Class文件。

 

 

 

加载模式:采用了 双亲委托   模式。   避免重复加载且安全。

每一个自定义的ClassLoader都有一个parent ClassLoader

任何一个自定义ClassLoader加载一个类之前,它都会先委托它的父亲ClassLoader进行加载,只有当父亲ClassLoader无法加载成功后,才会由自己加载.

 

加载流程:在JVM加载类的时候,需要经过三个步骤,装载、连接、初始化。装载就是找到相应的class文件,读入JVM,初始化就不用说了,最主要就说说连接。

 

2 Android中的类加载:

DexClassLoader:这个类加载器用来从.jar.apk类型的文件内部加载classes.dex文件。通过这种方式可以用来执行非安装的程序代码,作为程序的一部分进行运行。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值