- 早上查题,背一遍然后检查自己一遍以上
- 中午有时间就背一遍以复习昨天的为主
- 晚上背一遍,第二天中午再看一眼:day+1
- 第四天课间看一遍:day+3
- 第七天课间看一遍:day+6
- 第十五天课间看一遍:day+14
单例模式:特殊问题的方案(来源于23种特殊的面向对象的设计模式):
作用:一是,解决多线程并发访问的问题。二是节约系统内存,提交系统运行的效率,提高系统性能。
要求:私有构造器,私有静态本类的属性(赋值),公有的提供属性的方法
class Single{
private static Single s= new Single();
//封装 static:静态方法只能调用静态属性 任意类型都可以作为类的属性,总点new出来一个对象
private Single(){
//只有构造器私有,才能避免其他的类随便new构造器,生产对象
}
public static Single getInstance(){
//方便其他类访问 只有静态的方法 才能不需要对象调用
return s;
}
}
abstract:抽象的
-
抽象方法:没有方法体,在形参列表后用分号结尾
一旦一个类中有抽象方法,则这个类也必须抽象,注定永远不会被执行也无法执行,
不能被静态修饰,
不能被final修饰, -
抽象类
不能被实例化,可以有构造器
抽象类可以全是抽象方法;抽象了也可以没有抽象方法
子类如何继承一个抽象类作为父类,则要不然实现所有的抽象方法,要不然自己变成抽象类
异常继承关系
Object 类的直接子类Throwable描述了所有被虚拟机抛出的非正常状况。一般情况下很少用Throwable,而是使用它的两个子类Error、Exception。
Error类特指应用程序在运行期间发生的严重错误。
如:虚拟机内存用尽、堆栈溢出等等。一般情况下这种错误都是灾难性的,所以没有必要使用异常处理机制处理Error。
Exception类有几十个子类,描述了不同类型的异常,其中:
-
以RuntimeException为代表的一些类,称为非检查性异常(unchecked Exception),若系统运行时可能产生该类异常,则不必在程序中声明对该类异常的处理,就可以编译执行。
如:NullPointerException - 空指针引用异常, ArithmeticException - 算术运算异常, IndexOutOfBoundsException - 下标越界异常
-
以IOException为代表的一些类为检查性异常(checked Exception),若系统运行时可能产生该类异常,则必须写出相应的处理代码,否则无法通过编译。
如:FileNotFoundException ClassNotFoundException SQLException
异常处理的方案
-try …catch:
try:监视问题代码,在try块中的代码如果出问题,会自动new一个异常的对象发送给catch进行匹配(try代码后不能既没catch块也没finally块)一旦被try捕获则停止继续执行try块里的代码
catch:捕获try提供的异常,看是否和参数的类型匹配如果匹配则执行catch块的代码,(不能独立与try存在,必有try)
catch可以提供多个,但是异常的类型必须从小到大(继承关系)
finally:无论发生什么情况一定会执行,只要进入try肯定要执行finally的代码(函数跳出也要执行)(在try/catch后面添加finally块并非强制性要求的)
-
throws:抛出(甩锅),throws一般放在方法的形参列表后面 + 异常的类型:
如果该方法中发现相同类型的异常,则把异常对象抛出给调用方,
两种结果:第一种,谁都不处理,交给java虚拟机。 第二种,中间使用trycatch 处理问题。
hashCode()与equals()方法重写
对象放入Set或Map集合(以对象作为Map的键)之前,对象所属类必须重写hashCode()和equals()方法,否则无法在集中中正确查找到相关对象。
按照哈希契约,如果两个对象相等的话,它们的hash code必须相等(相等对象应在内存上有相同地址);但如果两个对象的hash code相等的话,这两个对象不一定相等(分配内存地址时可能有哈希冲突即将两个不同对象分配到相同地址上,不同哈希算法都在尽量减少这种冲突)。
默认情况下,hashCode()表示的是内存地址,如不重写hashCode(),Map中作为键的对象和作为查询条件的对象即便在意义上相同(比如两个表示人的对象都有相同身份证属性),但内存地址不同,所以会出现在Map中找不到对应键(对象)情况。重写hashCode()后按相应属性生成新哈希码则可以规避这个问题。
重写hashCode()后还应重写equals方法,因为按照哈希契约比较对象时是先比较hashcode(),然后再比较equals方法,默认情况下equals方法也是比较对象内存地址,故也需要按属性比较原则重写。
String、StringBuffer、StringBuilder的区别
-
String类被final修饰,代表一组不可改变的Unicode字符序列,对它的任何修改实际上又产生一个新的字符串,String类对象的内容一旦被初始化就不能再改变。
-
StringBuffer和StringBuilder代表一组可改变的Unicode字符序列。
-
StringBuilder是线程不安全的
-
StringBuffer是线程安全的
-
StringBuilder在并发操作上效率高于StringBuffer。
总结: 1、在字符串不经常发生变化的业务场景优先使用String(代码更清晰简洁)。如常量的声明,少量的字符串操作(拼接,删除等)。 2、在单线程情况下,如有大量的字符串操作情况,应该使用StringBuilder来操作字符串。不能使用String"+"来拼接而是使用,避免产生大量无用的中间对象,耗费空间且执行效率低下(新建对象、回收对象花费大量时间)。如JSON的封装等。 3、在多线程情况下,如有大量的字符串操作情况,应该使用StringBuffer。如HTTP参数解析和封装等。
StringBuffer和StringBuilder的比较
==比较的是内存地址
Equals比较的也是内存地址,因为未重写equals方法
需要用toString()方法转换为String后再调用String的equalsIgnorecase()方法或equals()方法