**
几种单例模式
1.饿汉模式线程安全,缺点内存浪费
public class testsingle {
private static final testsingle single=new testsingle();
private testsingle(){}
public static testsingle get(){
return single;
}
public static void main(String args[]){
}
}
2.懒汉模式线程不安全,缺点如果获取实例时,初始化工作较多,加载速度会变慢,影响系统系能,每次获取实例都要进行非空检查,系统开销大
public class testsingle {
private static final testsingle single=null;
private testsingle(){}
public static testsingle get(){
if(single==null)
single=new testsingle();
return single;
}
}
3.加锁 优点:线程安全,缺点:每次获取实例都要加锁,耗费资源,其实只要实例已经生成,以后获取就不需要再锁了
public class testsingle {
private static final testsingle single=null;
private testsingle(){}
public static synchronized testsingle get(){
if(single==null)
single=new testsingle();
return single;
}
}
4.双重检查所优点:线程安全,进行双重检查,保证只在实例未初始化前进行同步,效率高 缺点:还是实例非空判断,耗费一定资源
public class testsingle {
private static final testsingle single=null;
private testsingle(){}
public static testsingle get(){
if(single==null){
synchronized(testsingle.class){
if(single==null)
single=new testsingle();
}
}
return single;
}
}
5.静态内部类优点:既避免了同步带来的性能损耗,又能够延迟加载
public class testsingle {
private testsingle(){}
private static class horld{
private static final testsingle single=new testsingle();
}
public static testsingle get(){
return horld.single;
}
}
6.枚举天然线程安全,可防止反射生成实例。
public enum single{
instance;
public void init (){
System.out.println("资源初始化");
}
}
**
**
public、private、protected、default的作用
访问修饰符用来控制访问权限
.不在类内部的类的只有两种public,default(不同包不可以访问)
public–都可访问(公有)
private–类内可访问(私有)
protected–包内和子类可访问(保护)
不写(default)–包内可访问 (默认)
**。
**
深拷贝和浅拷贝区别
浅拷贝只是拷贝了地址当原对象改变时拷贝的对象也会一起改变
深拷贝在内存空间内重新分配一块区域来拷贝对象,两者地址不同内容相同原对象改变不会影响新对象
**
**
error和exception的区别,CheckedException,RuntimeException的区别
error类型的错误一般有JVM虚拟机抛出,如Java虚拟机运行错误(Virtual MachineError),当JVM不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止;还有发生在虚拟机试图执行应用时,如类定义错误(NoClassDefFoundError)、链接错误(LinkageError)。
运行异常一般是程序逻辑错误造成,如ArrayIndexOutOfBoundsException(数组下标越界),NullPointerException(空指针异常)、ArithmeticException(算术异常)、MissingResourceException(丢失资源)、ClassNotFoundException(找不到类)等异常
检查异常一般与运行上下文有关需要try-catch一般有IOException(文件异常)、SqlException(sql异常)
**
**
类加载器加载顺序
启动类加载器(Bootstrap ClassLoader)有C++实现属于JVM一部分,其余均有Java实现继承java.lang.ClassLoader独立于JVM之外
自底向上检查类是否加载
Custom ClassLoader–>App ClassLoader–>Extension ClassLoader–>Bootstrap ClassLoader
自顶向下加载类
通过java.lang.ClassLoader的子类自定义加载class<–Load CLASSPATH或Djava.class.path所指定的jar包和类<–Load JRE\lib\ext*.jar或Djava.class.dirs指定目录下的jar包<–Load JRE\lib\rt.jar或者-Xbootclasspath所指定的jar包
假设自定义了一个java.lang.String类根据规则最终都会调用Bootstrap ClassLoader去加载jdk自带的String类
**
**
什么是序列化,怎么序列化,为什么序列化
序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化
序列化原因:
当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
当你想用套接字在网络上传送对象的时候;
当你想通过RMI传输对象的时候;
**