https://blog.csdn.net/a724888/article/details/70038420
程序员江湖陆小凤的博客,作为学习Java的顺序目录还可以,内容结合其它博客看比较容易理解,以下未加外链的在此人博客Java分类下基本能找到。
面向对象三大特性:继承、封装和多态
java基本数据类型:byte(8位),short(16),int,long,float,double,boolean(8),char(16)
对应包装类:Byte,Short,Integer,Long,Float,Double,Boolean,Character
自动拆箱装箱:https://www.cnblogs.com/wang-yaz/p/8516151.html,基本数据类型的包装类只在数字范围-128到127中用到常量池,会自动拆箱装箱,其余数字范围的包装类则会新建实例
final关键字:
final修饰基本数据类型保证不可变
修饰引用类型保证引用不能指向别的对象,否则报错
修饰类,不能被继承,类的实例分配空间后地址不可变,子类不能重写所有父类方法
修饰方法,子类不能重写该方法
抽象类和接口
可以有方法实现,有非final成员变量,用abstract修饰,可以有构造方法,但只能由子类实例化
接口可用extends加多个接口实现多继承,接口只能有public final类型的成员变量,接口只能有抽象方法、不能有方法体,接口不能实例化,但是可以作为引用类型
代码块和加载顺序
假设该类是第一次进行实例化,加载顺序如下:
静态代码块比非静态优先,从早到晚包括:静态代码块和静态成员变量顺序根据代码位置前后来决定,代码块和成员变量顺序也根据代码位置来决定,最后才调用构造方法
1、父类静态变量
2、父类静态代码块(若有多个按代码先后顺序执行)
3、子类静态变量
4、子类静态代码块(若有多个按代码先后顺序执行)
5、父类非静态变量
6、父类非静态代码块(若有多个按代码先后顺序执行)
7、父类构造函数
8、子类非静态变量
9、子类非静态代码块(若有多个按代码先后顺序执行)
10、子类构造函数
外部类、内部类
外部类只有public和default两种修饰,全局访问和包内访问
内部类可以有全部访问权限,概念为一个成员变量,故访问权限设置与一般成员变量相同,非静态内部类是外部类一个成员变量,只和外部类的实例有关,静态内部类是独立于外部类存在的一个类,与外部类实例无关,可以通过外部类.内部类直接获取Class类型
异常
Throwable
Error(jvm完全无法处理的系统错误,只能终止运行) 和Exception,日志框架,log4j,slf4j
泛型 https://blog.csdn.net/s10461/article/details/53941091
java中是伪泛型,运行期自动进行泛型擦除,将泛型替换为实际上传入的类型
泛型通配符1、泛化 2、<? extends Number> 上边界 3、<? super Integer>下边界 此种方式限制上下边界
泛型的使用:泛型类,泛型接口,泛型方法
数组的类型不可以是类型变量,除非是采用通配符的方式
Class类和Object类
class.forName
对象.getClass
类名.class
clone()调用需要实现Cloneable接口
反射机制
https://www.jianshu.com/p/5b3acad0f025
注解
https://www.cnblogs.com/acm-bingzi/p/javaAnnotation.html
https://www.cnblogs.com/liangweiping/p/3837332.html
枚举类
https://blog.csdn.net/javazejian/article/details/71333103
集合框架
Collection
List:ArrayList、LinkedList、Vector、Stack
Set:EnumSet、HashSet、HashSet
Map:HashMap,TreeMap,HashTable
Queue:ArrayBlockQueue,PriorityBlockingQueue,LinkedBlockingQueue,ArrayDeque,LinkedBlockingDeque,LinkedList
https://blog.csdn.net/a724888/article/details/80215706
http://calvin1978.blogcn.com/articles/collection.html
序列化:实现serializable接口,transient修饰符保证某个成员变量不被序列化
原文:https://blog.csdn.net/a724888/article/details/80210095
在序列化过程中,如果被序列化的类中定义了writeObject 和 readObject 方法,虚拟机会试图调用对象类里的 writeObject 和 readObject 方法,进行用户自定义的序列化和反序列化。
如果没有这样的方法,则默认调用是 ObjectOutputStream 的 defaultWriteObject 方法以及 ObjectInputStream 的 defaultReadObject 方法。
why transient
ArrayList实际上是动态数组,每次在放满以后自动增长设定的长度值,如果数组自动增长长度设为100,而实际只放了一个元素,那就会序列化99个null元素。为了保证在序列化的时候不会将这么多null同时进行序列化,ArrayList把元素数组设置为transient。
why writeObject and readObject
前面说过,为了防止一个包含大量空对象的数组被序列化,为了优化存储,所以,ArrayList使用transient来声明elementData。 但是,作为一个集合,在序列化过程中还必须保证其中的元素可以被持久化下来,所以,通过重写writeObject 和 readObject方法的方式把其中的元素保留下来。
writeObject方法把elementData数组中的元素遍历的保存到输出流(ObjectOutputStream)中。
readObject方法从输入流(ObjectInputStream)中读出对象并保存赋值到elementData数组中。
多线程:
线程7种状态:new runable running blocked waiting time_waiting terminate
https://www.cnblogs.com/wxd0108/p/5479442.html
Lock类:
java.util.concurrent包内,三个实现,ReentrantLock,ReentrantReadWriteLock.ReadLock,ReentrantReadWriteLock.WriteLock
BlockingQueue:ArrayListBlockingQueue,LinkedListBlockingQueue,DelayQueue,SynchronousQueue
ConcurrentHashMap
CachedThreadPool,SingleThreadPool,FixedThreadPool,ScheduledExecutorService
ThreadPoolExecutor:https://www.cnblogs.com/dolphin0520/p/3932921.html,https://www.cnblogs.com/cjsblog/p/8214921.html(1.8)
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler);
1、如果正在运行的线程数少于核心线程数,则新建一个线程去运行这个任务
2、如果工作队列没有满,则放到工作队列中
3、如果工作队列已满(PS:workQueue.offer(command)返回false),则再新建线程
4、若线程数已经达到最大线程数则reject(command)
IO流与网络编程
字节流、字符流。
代理
https://www.cnblogs.com/cenyu/p/6289209.html
https://www.jianshu.com/p/471c80a7e831
https://blog.csdn.net/a724888/article/details/77194098
静态代理:使用时定义接口或父类,被代理对象与代理对象一起实现相同的接口或是继承相同父类
动态代理(JDK代理,接口代理):代理对象,不需要实现接口;代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象
Cglib代理(子类代理):目标对象只是一个单独的对象,并没有实现任何的接口,这个时候就可以使用以目标对象子类的方式类实现代理,这种方法就叫做:Cglib代理