Java学习笔记(四)

**

几种单例模式

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传输对象的时候;
**

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章