Java基础-序列化
参考文献
面试官:Java序列化为什么要实现Serializable接口?我懵了
什么是序列化
序列化: Java中的序列化机制能够将一个实例化对象信息写入到一个字节流中(只序列号对象的属性值,而不会去序列化方法),序列化后的对象可用于网络传输,或者持久化到数据库,磁盘中.
反序列化: 需要对象的时候,在通过字节流中的信息来重构一个相同的对象.
Java中具体实现
Java中要使一个类可以序列化,实现java.io.Serializable接口是最简单的.
1234public class User implements Serializable { private static final long serialVersionUID = 1L;}
123456789@Datapublic class User implements Serializable { private static final long serialVersionUID = 1L; private String name; private S ...
Java基础-反射&&动态代理
参考文献
java动态代理实现与原理详细分析
Trail: The Reflection API
Spring CGLIB 动态代理子类导致的注解丢失
反射
获取Class对象的四种方式
知道具体类的情况下可以使用:
1Class klass = Person.class;
通过 Class.forName()传入类的全路径获取:
1Class klass = Class.forName("cn.holelin.Person");
通过对象实例instance.getClass()获取:
12Person o = new Person();Class klass = o.getClass();
通过类加载器xxxClassLoader.loadClass()传入类路径获取:
1ClassLoader.getSystemClassLoader().loadClass("cn.holelin.Person");
通过类加载器获取 Class 对象不会进行初始化,意味着不进行包括初始化等一系列步骤,静态代码块和静态对象不会得到执 ...
JavaNIO-基础知识点
参考文献
【对线面试官】 Java NIO
Reading a File with Channels and Buffers
Netty权威指南 第二版
黑马-Netty课程
Java NIO浅析
BIO NIO和AIO
BIO、NIO和AIO是Java中用于网络编程的三种不同的I/O模型,它们之间的区别主要体现在对IO操作的处理方式和API设计上.以下是它们的区别:
BIO(Blocking I/O)阻塞I/O
同步阻塞:每个连接都需要一个独立的线程来处理,因此连接数受限于服务器的性能.
通信是同步的,即代码阻塞在输入流(InputStream)和输出流(OutputStream)上等待I/O完成.
只有阻塞模式,无法发挥多路复用的优势.
在I/O通信线程和业务处理线程中使用同一个线程池,无法发挥多核CPU的优势.
NIO(Non-Blocking I/O)非阻塞I/O
异步非阻塞:NIO可以使用单线程处理多个连接(轮询器Selector),因此可以支持更多的连接.
通过Selector实现了多路复用,同时可以采取异步非阻塞模式,即不用等待I/O操作的完成,可以通过回 ...
Java基础-泛型
参考文献
【对线面试官】今天来聊聊Java泛型
Java 基础 - 泛型机制详解
泛型
Java泛型这个特性是从JDK 1.5才开始加入的,因此为了兼容之前的版本,Java泛型的实现采取了“伪泛型”的策略,即Java在语法上支持泛型,但是在编译阶段会进行所谓的“类型擦除”(Type Erasure),将所有的泛型表示(尖括号中的内容)都替换为具体的类型(其对应的原生态类型),就像完全没有泛型一样.
泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型).也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法.
引入泛型的意义在于:
适用于多种数据类型执行相同的代码(代码复用)
泛型类
123456789public class Test<T>{ private T var ; public T getVar(){ return var ; ...
Java基础-注解
参考文献
【对线面试官】今天来聊聊Java注解
玩转Java注解:元注解、内置注解、自定义注解的原理和实现
注解概念
Java注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制.重点:和javadoc不同,Java 标注可以通过反射获取标注内容.
在编译器生成类文件时,标注可以被嵌入到字节码中.Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容
注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解.它主要的作用有以下四方面:
生成文档,通过代码里标识的元数据生成javadoc文档.
编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证.
编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码.
运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例
注解是对代码的一种增强,可以在代码编译或者程序运行期间获取注解的信息,然后根据这些信息做各种事情。
Java自带的标准注解
@Override重写
概念:检查该方法是否是 ...
Java并发编程(十)-ThreadLocal
参考文献
【对线面试官】ThreadLocal
JAVA并发编程实战
Spring 4.3: Using a TaskDecorator to copy MDC data to @Async threads
从ThreadLocal到InheritThreadLocal再到阿里的TransmittableThreadLocal,吊打面试官
ThreadLocal
它运行你将每个线程与持有数值的对象关联在一起.ThreadLocal提供了get与set访问器,为每个使用它的线程维护一份单独的拷贝.所以get总是返回由当前执行线程通过set设置的最新值.
一种解决多线程环境下成员变量的问题的方案,但是与线程同步无关.其思路是为每一个线程创建一个单独的变量副本,从而每个线程都可以独立地改变自己所拥有的变量副本,而不会影响其他线程所对应的副本
线程本地(ThreadLocal)变量通常用与基于可变的单体(Singleton)或全局变量的设计中,出现(不正确的)共享.
比如说,一个单线程的应用程序可能会维护一个全局的数据连接,这个Connection在启动时就已经被初始化了.这 ...
Java基础-基础理论
基础概念
Java和JVM的历史
1996年SUN JDK1.0 Classic VM
纯解释运行,使用外挂进行JIT
1997年 JDK1.1发布
AWT
内部类
JDBC
RMI
反射
1998年 JDK1.2 Solaris Exact VM
JDK1.2开始称为Java2,三个版本J2SE,J2EE,J2ME
JIT解释器混合
Accutane Memory Management 精确内存管理,数据类型敏感
提示GC性能
2000年 JDK1.3 Hotspot作为默认虚拟机发布
2002年 JDK1.4 Classic VM退出历史舞台
Assert
正则表达式
NIO
IPV6
日志API
加密类库
2004年 JDK1.5
泛型
注释
枚举
可变长的参数
装箱
Foreach循环
JDK1.6
脚本语言支持
JDBC4.0
Java解释器API
2011年 JDK7
延期项目推迟到JDK8
G1
动态语言增强
64位系统中的压缩指针
NIO2.0
泛型实例化简写
try-with-resource
2014年 JDK8
La ...
Java多线程(四)-线程池
参考文献
Java 线程池必备知识点:工作流程、常见参数、调优、监控
以面试官视角万字解读线程池10大经典面试题!
线程池
合理使用线程池的好处
降低资源消耗.
通过重复利用已经创建的线程降低线程创建的和销毁造成的消耗.例如,工作线程Woker会无线循环获取阻塞队列中的任务来执行.
提高响应速度.
当任务到达时,任务可以不需要等到线程创建就能立即执行.
提高线程的可管理性.
线程是稀缺资源,Java的线程池可以对线程资源进行统一分配、调优和监控.
实现线程池
一般的线程池主要分为以下4个组成部分
线程池管理器:用于创建并管理线程池
工作线程:线程池中的线程
任务接口:每个任务必须实现的接口,用于工作线程调度其运行
任务队列:用于存放待处理的任务,提供一种缓冲机制
自定义拒绝策略接口
1234@FunctionalInterfacepublic interface RejectPolicy<T> { void reject(BlockingQueue<T> queue, T task);}
...
无题
参考文献
3W 字详解 Java 集合
源码阅读(1):Java中主要的List结构——概述
集合框架
所有集合实现类的最顶层接口为Iterable和Collection接口,再向下Collection分为了三种不同的形式,分别是List,Queue和Set接口,然后就是对应的不同的实现方式.
List
ArrayList: Object[] 数组
Vector: Object[] 数组
LinkedList: 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环)
Set
HashSet(无序,唯一): 基于 HashMap 实现的,底层采用 HashMap 来保存元素
LinkedHashSet: LinkedHashSet 是 HashSet 的子类,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的 LinkedHashMap 其内部是基于 HashMap 实现一样,不过还是有一点点区别的
TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树)
Queue
Priorit ...
Java基础-内部类
参考文献
Java内部类详解
Java内部类以及使用场景
Nested Classes
8.1.3. Inner Classes and Enclosing Instances
Nested Classes
Terminology: Nested classes are divided into two categories: non-static and static. Non-static nested classes are called inner classes. Nested classes that are declared static are called static nested classes.
术语:嵌套类分为两类:非静态类和静态类.
非静态嵌套类称为内部类(inner class).
声明为static的嵌套类称为静态嵌套类(static Nested class).
123456789class OuterClass { ... class InnerClass { ... } ...