面向对象六大原则
- 单一职责:一个类应该只做一件事;
- 开放封闭:尽量是拓展原来的代码,而不是修改原来的代码;
- 里氏替换:子类可以拓展父类的功能,但不能改变父类的功能;
- 依赖倒置:指模块间的依赖是通过抽象来发生的,实现类之间不直接发生依赖关系,其依赖关系是通过接口来实现的,面向接口编程;
- 接口分离:客户端不应该依赖它不需要的接口;没用的接口应该分离出去;
- 迪米特:只与直接的朋友通信;
总结:每当需求变化的时候,我们利用这些原则来使我们的代码改动量最小,而且所造成的影响也是最小的。
内部类
成员内部类:类里边没有修饰符修饰的类,可访问所有变量和方法,外部类对象.new 内部类();
局部内部类:方法内定义的类,非静态方法的局部类可访问外部类的所有变量和方法,静态方法的局部类之可以访问外部类的静态变量和静态方法;
静态内部类:在类里边用static修饰的类,可访问外部类的静态变量,不可访问非静态变量;
匿名内部类:必须实现接口或者继承抽象类,不能在类里边定义静态的变量或者方法,所在方法的形参要被使用的时候必须加上final,因为局部变量存储在栈中,用完非final的局部变量就会被销毁,但是局部类中局部变量的引用还存在,调用时候会出异常,加了final就可以是局部内部类使用的变量和外部的局部变量区分开。
好处:
- 一个内部类对象可以访问创建它的外部类对象的内容,包括私有数据;
- 内部类不为同一包的其他类所见,具有很好的封装性;
- 内部类有效实现了“多重继承”,优化 java 单继承的缺陷;
- 匿名内部类可以很方便的定义回调;
==与equals的区别
==比较的是地址,equals在没有重写的情况下也是比较地址,有重写的情况下根据重写的逻辑来。
重写equals必须重写hashCode()方法,如果不重写,那么每个对象的hashcode都不相同,在进行集合操作的时候,或出错。
java和javax
没什么区别。
包:
lang,io,nio,net,util,sql
IO
Reader
Writer
InputStream
OuputStream
- 字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。
- 字节流默认不使用缓冲区;字符流使用缓冲区。
- 字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。
BIO
NIO
AIO(NIO2)
反射
概念:运行时创建对象,并能调用所有方法和属性
优点:提高代码灵活度;
缺点:性能相比运行编译好的代码比较慢;
应用: jdbc连接的时候;spring中Bean的装载;
获取方式:类名.class;Class.forName();Obj.getClass();通过类加载器.loadClass();
常用API
String
Date
集合
List
ArrayList:底层是Object[],默认容量是10,每次扩容为原来的1.5倍,每次add的时候校验扩容;
LinkedArrayList:底层是双向链表,默认容量0;
CopyOnWriteArrayList:底层是Object[],默认0,每次扩容加1,里边一个可重入锁;
Vector:底层是Object[],默认容量10,每次扩容为原来的2倍,每次add是校验扩容,方法加锁;
Stack:继承Vector;
Map
HashMap:底层是个数组+链表+红黑树,默认容量是16,扩容因子为0.75倍,链表大于等于8时变为红黑树,小于等于6时又变回链表;
LinkedHashMap:
HashTable:
TreeMap:
ConcurrentHashMap:
ConcurrentSkipListMap:
Set
HashSet:
LinkedHashSet:
TreeSet:
CopyOnWriteArraySet:
ConcurrentSkipListSet:
可以使用 Collections. unmodifiableCollection(Collection c) 方法来创建一个只读集合,这样改变集合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异常。
快速失败机制:遍历集合的同时集合的大小发生了变化,多线程环境下;
迭代器:使用可以进行遍历删除;
遍历:for(在集合外部维护一个计数器,然后依次读取每一个位置的元素,当读取到最后一个元素后停止),iterator,foreach(内部采用iterator);支持 Random Access 的列表可用 for 循环遍历,否则建议用 Iterator 或 foreach 遍历。
ArrayList 不是线程安全的,如果遇到多线程场景,可以通过 Collections 的 synchronizedList 方法将其转换成线程安全的容器后再使用。List<String> synchronizedList = Collections.synchronizedList(list); synchronizedList.add("aaa"); synchronizedList.add("bbb");
异常
JVM 是如何处理异常的?
并发
死锁的条件
- 互斥条件:线程(进程)对于所分配到的资源具有排它性,即一个资源只能被一个线程(进程)占用,直到被该线程(进程)释放
- 请求与保持条件:一个线程(进程)因请求被占用资源而发生阻塞时,对已获得的资源保持不放。
- 不剥夺条件:线程(进程)已获得的资源在末使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。
- 循环等待条件:当发生死锁时,所等待的线程(进程)必定会形成一个环路(类似于死循环),造成永久阻塞
Linux查看资源使用情况:
为什么线程通信的方法 wait(), notify()和 notifyAll()被定义在 Object 类里
为什么 Thread 类的 sleep()和 yield ()方法是静态的
jvm
jvm各大区域的作用
垃圾回收算法
类加载过程
调优工具
mybatis
分页插件
执行原理
一二级缓存
Redis
删除策略:定时删除,主动删除,惰性删除
持久化方式:rdb,aof
集群搭建: