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接口的实现类:HashSet,TreeSet
HashSet:底层是基于HashMap来实现的,其中元素位于HashMap的key,value值为统一的: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 run和start的区别
直接调用run,是同步的,无法达成多线程的目的
Start方法可以异步调用线程中的run方法,以此达到多线程的目的。
15 sleep() wait(),yield
sleep是Thread类的静态方法,是线程用来控制自身流程的。到时间自动醒,不涉及线程间的通信,所以也就不会释放锁。需要throws InterruptedException
Wait是Object的方法,用于线程间的通信,只能用notify notifyAll唤醒。释放锁。
yield声明当前线程回到可执行状态,有可能立刻被执行,且无声明异常
16 throw throws throwable error exception
throw用于在方法内抛出一个异常,因为每次抛一个,所以用throw
throws用于声明当前方法可能抛出的异常,存在多个,所以用throws
throwable是Error和Exception的父类。
Error表示系统级的问题,不应该被捕捉
Ecetption表示异常,
17 ClassLoader机制。
什么是类的加载:
当程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过加载,连接,初始化三个步骤来对该类进行初始化,JVM将会连续完成这三个步骤,也把这三个步骤统称为类加载或类初始化。
类加载指的是将类Class文件读入内存,并为之创建一个java.lang.Class对象,也就是说程序使用任何类时,系统都会为之建立一个java.lang.Class对象
什么时候加载?
类的加载时机,肯定是在运行时,但并不是一次性全部加载,而是按需动态,依靠反射来实现动态加载,一般来说一个class只会被加载一次,之后就会从jvm的class实例的缓存中获取,谁用谁取就可以了,不会再去文件系统中加载.class文件了。
创建类的实例
访问类的静态变量
访问类的静态方法
反射 如( Class.forName("my.xyz.Test") )
当初始化一个类时,发现其父类还未初始化,则先出发父类的初始化
虚拟机启动时,定义了main()方法的那个类先初始化
1 JAVA中的ClassLoader
ClassLoader用来加载class到JVM中,
基础有一个叫做 bootstrap classLoader的(启动类加载器)。这个ClassLoader在JVM运行的时候加载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文件。通过这种方式可以用来执行非安装的程序代码,作为程序的一部分进行运行。