序列化和反序列化
序列化:把对象的状态转换为字节码的过程叫序列化。
transient修饰的属性,不会被序列化。
静态static的属性不会被序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
-
什么方式进行序列化
实现了Serializable接口。
Hessian 序列化
Json序列化 -
序列化中需要注意的几个点
transient可以修饰属性,防止属性被序列化
static属性也不会被序列化。
子类能够继承父类的序列化功能
引用类型的属性会随着对象序列化而序列化
即序列化一个对象a时,对象a的引用属性b不用实现序列化接口也能随着对象a的序列化而序列化;实际不然,对象b的类也需要实现序列化接口才能随着对象a的序列化而序列化。 -
序列化的作用
持久化存储时。
网络传输时。
通过RMI传输对象时。
wait和sleep的区别
这两个方法来自不同的类,分别是sleep来自thread类,wait来自object类
最主要的是sleep方法没有释放锁,而wait方法释放了锁,是的其他线程可以同步控制块和方法
使用范围:wait,notify,notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。
sleep必须捕获异常,而wait,notfy,notifyAll不需要捕获异常
数组的初始化方式
动态初始化:数组定义与为数组分配空间和赋值的操作分开进行;
静态初始化:在定义数组的同时就为数组元素分配空间并赋值;
默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后每个元素也被按照成员变量的规则被隐式初始化
String,StringBuffer,StringBuilder区别
- 长度是否可变
String是被final修饰,底层是final修饰的byte数组。(不完全不可变,可以通过反射的机制强行赋值改变)这里不做说明。
StringBuffer和StringBuilder类的对象可变。 - 执行效率
Stringbuilder>StringBuffer>String - 应用场景
如果要操作少量的数据用=String
单线程操作字符串缓冲区下操作大量数据=StringBuilder
多线程操作字符串缓冲去下操作大量数据=StringBuffer - 是否线程安全
StringBuffer是线程安全,线程安全实现方式是将此类下所有的方法都加上了synchronized关键字进行修饰,因此是线程安全的,StringBuilder的方法没有加上修饰所以不安全。
java面向对象的特性
分别是封装,继承和多态。
- 封装
把数据和操作数据的方法绑定起来。并命名,使用时不需要考虑内部实现,只需要调用对应命名的名字。这就是封装
内部类提供更好的封装,可以把内部类隐藏在外部类之内不允许其他包中的类访问该类
内部类的方法可以直接访问外部类的所有数据,包括私有数据。
内部类所实现的功能使用外部类同样可以实现,只是有时候使用内部类更方便。
内部类可分为以下几种:
成员内部类
静态内部类
方法内部类
匿名内部类
暂时不做深刻研究。内部类可以更好的提供封装。
-
继承
继承是类与类的一种关系,是一种is a的关系。比如狗继承动物。java中的继承是单继承,即一个类只有一个父类。
继承的好处,子类拥有父类的所有属性和方法(被private修饰的属性不能拥有) -
多态
允许不同子类型堆同一信息状态而进行的不同响应。主要发生在子类和父类之间。主要实现是重写和重载
重写和重载是什么
- 重写是子类对父类的允许访问的方法实现过程进行重新编写,返回值和形参都不能改变。
重写的好处
在于子类根据需要,定义特定于自己的行为。也就是说子类根据自己的需要重新实现父类的方法
方法的覆写可以总结为一大两小两同
一大:子类访问权限只能变大或者相同
两小:子类返回值类型和抛出的异常只能变小,然后类型能够转换。
两同:方法名和形参相同 - 重载是一个类中,同名的方法有不同的参数列表。重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载。
cookie和session
- 数据存放位置不同:
cookie数据存放在客户的浏览器上,session数据放在服务器上。 - 安全程度不同:
cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗考虑到安全可以使用session - 性能使用程度不同
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你的服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
- 数据存储大小不同:
单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,而session则存储与服务端,浏览器对其没有限制。
mabatis中的session作用
mybatis 的session 就是一个事务和缓存的管理器.
抽象类和接口
- 抽象类
抽象类(abstract修饰)不可以实例化,只能用来继承
抽象类的子类应提供对所有抽象方法的实现,如果子类没有全部重写,则子类也为抽象类
抽象类中可以包含非抽象方法
抽象类的引用可指向子类的实例 - 接口
接口(interface修饰)。接口所有的方法都为抽象方法,jdk1.8之后可以拥有static方法,和被default修饰(而且这两种方法可以存在方法体)
接口中的变量都为常量(static final)
接口不能实例化,只能被实现,可以被接口继承
接口的实现类必须实现接口中的所有方法,如果不能实现子类会变成一个抽象类。
接口可以多实现
接口可以多继承
接口的引用指向实现类的实例
自动装箱和自动拆箱
自动装箱和拆箱是Java为每个原始类提供的包装类型
主要作用是方便基本数据类型之间的相互转换。
Java基本数据类型
四类八种:
整型:byte(1),short(2),int(4),long(8)
浮点型:float(4)double(8)
字符型:char(2)
布尔型:boolean(1)
- int类型转换为String类型
String.valueOf(1111);
String a=1+"";
如果是对应的封装类可以调用toString();
- String转换为int类型
用基本类型的封装类调用parseXxx()方法。
int a=Integer.parseInt("1111");
final、finally、finalize区别
- final
被final修饰的类不可变不能修改,不能继承。(反射违背了封装,不完全不可变)
被final修饰的变量只能赋值一次,之后不能修改。
被final修饰的方法不能不重写(覆盖) - finally
finally - finalize
每个对象都有这个方法,在JVM执行垃圾回收时会调用finalize方法,第二次调用之后对象被清理掉,释放内存。
文章随意而作,如有概念错误的地方希望热心网友指出共同学习。