Java平台的理解:
两个关键词,一个是write once run anywhere,另一个是GC
JRE Java运行环境(包括JVM和类库), JDK JRE的超集还包括更多的工具
Excepeion和Error的区别:
他们两个都是继承Throwable类,听名字就知道throw able,他是可以throw的其他不行,所以继承Throwable的他俩也可以throw或者catch。
Exception 名字就叫预料到的问题,一般来说不严重不影响程序,我们可以捕获到做相应的处理,常见的就是我们空指针异常,或者我们自己定义的业务异常
Error就要严重得多,直接影响程序的正常运行。内存溢出outofmemory程序就是会挂掉,要修复重启。
final finally finalize区别:
final 修饰符 ,修饰的常量,方法,类不能修改。
finally 一种机制,try-finally,就是那种一定要执行的,不如说关比jdbc连接的方法。
finalize Object的方法,目的是来主动回收,但是现在已经不推荐使用了,JDK9已经对这个方法进行标记了。
强引用 软引用 弱引用 幻想引用:
强引用我们最常见的,一般垃圾回收不会处理这个,一般一个对象没有引用关系,或者引用关系太长查出范围了,会被回收
SoftReference软引用,可以规避一些垃圾回收,但是内存不足的时候就会拿软引用开刀,保证一些必要的缓存。
WeakReference弱引用,不能规避垃圾回收,适合做缓存的基础。
幻想引用甚至访问不到对象,就是对象被finalize还提供对象还在工作,一般来监控对象的创建和销毁。
String StringBuffer StringBuilder:
String 字符类,final class,里面很多属性也都是final的,由于它的不可变性,字符的操作裁剪拼接都会有性能问题。
StingBuffer 就是为了解决String操作性能的问题,新出的一个线程安全的字符操作类。
StringBuilder是一个更激进的,为了效率连线程安全都不管了的一个字符操作类。
Java反射机制,动态代理基于什么原理:
反射机制是Java的一种基础功能,通过反射我们可以直接操作类或者对象,获取定义变量,甚至运行时改变类的定义。
动态代理是一种机制,一种动态处理代理,动态处理,想AOP,RPC很多都是基于这个
(动态代理,静态代理 都涉及到一个代理模式,他俩的区别,静态代理的代码是写好的代理关系,动态代理要靠反射才可以)
int Integer的区别:
其实基本类型和包装类的问题
int是基本类型
Integer是int的包装类,除了存储一个int的值以外,还包括了很多方法关于int的操作,而且JDK涉及到装箱拆箱的问题
Vector ArrayList LinkedList区别:
vector是做早的线程安全数组没性能太差,现在不推荐用了。
ArrayList 线程不安全的动态数组,扩容是一半一半的扩
LinkedList双向链表,线程也不安全。
HashMap HashTable TreeMap的区别:
HashTable是同步的,哈希表的一个实现,不支持null键和值,因为是同步的反而是线程安全的。
HashMap是使用的更广泛的一个哈希表的实现,支持null的键和值,但是异步性能高,线程不安全。
TreeMap是红黑树实现的一个Map,他和Map不一样他是有顺序的,但是他的时间复杂度logn不如hashmap的1.
如何保证容器线程安全,concurrentHashMap如何实现的线程安全且是高效的?
除了传统的容器提供的包装类方法,粗粒度的保护线程安全,
现在又推出concurrent线程安全容器包来使用保证容器线程安全。
concurrentHashMap主要是分离锁来实现,就是将里面的元素,散列到队列的各个桶上,每个桶都锁起来,来支持并发,还有就是通过volite关键字来看可见性,以及底层JVM的优化。
Java提供了那些IO,NIO怎么实现的多路复用:
BIO 同步阻塞 NIO同步非阻塞 NIO2(AIO)
NIO提供了selector channel buffer来支持多路复用
多个channel注册在selector上,selector看那些channel是就绪状态,下一个就给他,在高性能容器buffer上进行IO操作。
Java有几种拷贝方式,那种方式跟高效:
最早的input output流的方式
还有nio的transferto和transerfrom
还有File的各种copy
高效肯定是NIO的因为减少了上线问的切换和不必要的拷贝。
接口和抽象类的对比:
Java | 目的区别 | 实例化 | 内部的区别 | ||
---|---|---|---|---|---|
接口 | Java的基础机制 | API定义和实现的区别 | 接口不能实例化 | 没有非静态方法,要不是抽象要不就是静态方法 | |
抽象类 | Java的基础机制 | 代码重用 | 也不能实例化 | 可以有一个或者多个抽象方法,也可以没有抽象方法 |
相同都是Java的基础机制,都不能实例化
目的不同,一个是定义和实现分离,一个是继承复用代码,还有就是内部成员的限制,接口要严一些,抽象类和普通的类差不多。
常见的设计模式,写两个简单的:
创建型 工厂模式,单例模式 ,构造器模式,原型模式
结构型 桥接,适配器,装饰者
行为型 观察者,迭代器
懒汉模式的单例模式
public class Singleton(){
private static Singleton instance;
public Singleton getInstance(){
if(insatnce == null){
retuen new Singleton();
}else{
return instance;
}
}
}
工厂模式(实际上用接口改写也可以)
public classs Factory(){
public void make(){
sout( "it is factory");
}
}
public class PhoneFactory extends Factory(){
public void make(){
sout(" it is PhoneFactory ")
}
}