Open SunnyShen123 opened 5 years ago
面向对象、面向过程
[x] 面向对象的三大基本特征和五大基本原则
[ ] → 平台无关性
Java 如何实现的平台无关
JVM 还支持哪些语言(Kotlin、Groovy、JRuby、Jython、Scala)
值传递、引用传递
为什么说 Java 中只有值传递
什么是多态、方法重写与重载
构造函数与默认构造函数
类变量、成员变量和局部变量
成员变量和方法作用域
8 种基本数据类型:整型、浮点型、布尔型、字符型
整型中 byte、short、int、long 的取值范围
什么是浮点型?什么是单精度和双精度?为什么不能用浮点型表示金额?
什么是包装类型、什么是基本类型、什么是自动拆装箱
Integer 的缓存机制
字符串的不可变性
JDK 6 和 JDK 7 中 substring 的原理及区别、
replaceFirst、replaceAll、replace 区别、
String 对“+”的重载、字符串拼接的几种方式和区别
String.valueOf 和 Integer.toString 的区别、
switch 对 String 的支持
字符串池、常量池(运行时常量池、Class 常量池)、intern
[ ] → 熟悉 Java 中各种关键字 transient、instanceof、final、static、volatile、synchronized、const 原理及用法
[ ] → 集合类 常用集合类的使用、ArrayList 和 LinkedList 和 Vector 的区别 、SynchronizedList 和 Vector 的区别、HashMap、HashTable、ConcurrentHashMap 区别、
Set 和 List 区别?Set 如何保证元素不重复?
Java 8 中 stream 相关用法、apache 集合处理工具类的使用、不同版本的 JDK 中 HashMap 的实现的区别以及原因
Collection 和 Collections 区别
Arrays.asList 获得的 List 使用时需要注意什么
Enumeration 和 Iterator 区别
fail-fast 和 fail-safe
CopyOnWriteArrayList、ConcurrentSkipListMap
Java 枚举如何比较
switch 对枚举的支持
枚举的序列化如何实现
枚举的线程安全性问题
同步、异步、阻塞、非阻塞、Linux 5 种 IO 模型
BIO、NIO 和 AIO 的区别、三种 IO 的用法与原理、netty
Class 类、java.lang.reflect.*
动态代理和反射的关系
动态代理的几种实现方式
AOP
[ ] → 序列化 什么是序列化与反序列化、为什么序列化、序列化底层原理、序列化与单例模式、protobuf、为什么说序列化并不安全
[ ] → 注解 元注解、自定义注解、Java 中常用注解使用、注解与反射的结合
Spring 常用注解
[ ] → JMS 什么是 Java 消息服务、JMS 消息传送模型
[ ] → JMX java.lang.management.、 javax.management.
[ ] → 泛型 泛型与继承、类型擦除、泛型中 KTVE? object 等的含义、泛型各种用法
限定通配符和非限定通配符、上下界限定符 extends 和 super
List
List<?> 和 List
[ ] → 单元测试 junit、mock、mockito、内存数据库(h2)
[ ] → 正则表达式 java.lang.util.regex.*
[ ] → 常用的 Java 工具库 commons.lang、commons.*...、 guava-libraries、 netty
[ ] → API & SPI API、API 和 SPI 的关系和区别
如何定义 SPI、SPI 的实现原理
Error 和 Exception
异常链、try-with-resources
finally 和 return 的执行顺序
格林威治时间、CET,UTC,GMT,CST 几种常见时间的含义和关系
SimpleDateFormat 的线程安全性问题
Java 8 中的时间处理
如何在东八区的计算机上获取美国时间
GBK、GB2312、GB18030 之间的区别
UTF8、UTF16、UTF32 区别
URL 编解码、Big Endian 和 Little Endian
如何解决乱码问题
语法糖:switch 支持 String 与枚举、泛型、自动装箱与拆箱、方法变长参数、枚举、内部类、条件编译、 断言、数值字面量、for-each、try-with-resource、Lambda 表达式
BigDecimal、ThreadLocal、ClassLoader & URLClassLoader、
ArrayList & LinkedList、
HashMap & LinkedHashMap & TreeMap & CouncurrentHashMap、HashSet & LinkedHashSet & TreeSet
并发与并行的区别
线程与进程的区别
为什么不允许使用 Executors 创建线程池
[ ] → 线程安全 死锁、死锁如何排查、线程安全和内存模型的关系
[ ] → 锁 CAS、乐观锁与悲观锁、数据库相关锁机制、分布式锁、偏向锁、轻量级锁、重量级锁、monitor、
锁优化、锁消除、锁粗化、自旋锁、可重入锁、阻塞锁、死锁
死锁如何解决
synchronized 和 lock 之间关系、不使用 synchronized 如何实现一个线程安全的单例
synchronized 和原子性、可见性和有序性之间的关系
volatile 的实现原理
volatile 和原子性、可见性和有序性之间的关系
有了 symchronized 为什么还需要 volatile
堆和栈区别
Java 中的对象一定在堆上分配吗?
可见性、原子性、顺序性、happens-before、
内存屏障、synchronized、volatile、final、锁
GC 参数、对象存活的判定、垃圾收集器(CMS、G1、ZGC、Epsilon)
-XX:PermSize、-XX:MaxPermSize、-XX:MaxTenuringThreshold
[ ] → Java 对象模型 oop-klass、对象头
[ ] → HotSpot 即时编译器、编译优化
[ ] → 虚拟机性能监控与故障处理工具 jps, jstack, jmap, jstat, jconsole, jinfo, jhat, javap, btrace, TProfiler
Arthas
JIT、JIT 优化(逃逸分析、栈上分配、标量替换、锁优化)
编译工具:javac
反编译工具:javap 、jad 、CRF
开闭原则(Open Close Principle)、里氏代换原则(Liskov Substitution Principle)、依赖倒转原则(Dependence Inversion Principle)
接口隔离原则(Interface Segregation Principle)、迪米特法则(最少知道原则)(Demeter Principle)、合成复用原则(Composite Reuse Principle)
创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。
结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter 模式)、状态模式、策略模式、职责链模式(责任链模式)、访问者模式。
工厂模式、适配器模式、策略模式、模板方法模式、观察者模式、外观模式、代理模式等必会
→ tcp、udp、http、https 等常用协议
三次握手与四次关闭、流量控制和拥塞控制、OSI 七层模型、tcp 粘包与拆包
常见的 web 请求返回的状态码
404、302、301、500分别代表什么
[ ] → http/3
[ ] → Java RMI,Socket,HttpClient
[ ] → cookie 与 session cookie 被禁用,如何实现 session
[ ] → 用 Java 写一个简单的静态文件的 HTTP 服务器
[ ] → 了解 nginx 和 apache 服务器的特性并搭建一个对应的服务器
[ ] → 用 Java 实现 FTP、SMTP 协议
[ ] → 进程间通讯的方式
[ ] → 什么是 CDN?如果实现?
[ ] → DNS 什么是 DNS 、记录类型: A 记录、CNAME 记录、AAAA 记录等 域名解析、根域名服务器
DNS 污染、DNS 劫持、公共 DNS:114 DNS、Google DNS、OpenDNS
反向代理服务器
生命周期
线程安全问题
filter 和 listener
web.xml 中常用配置及作用
Hibernate 的懒加载 Hibernate 的缓存机制
Hibernate / Ibatis / MyBatis 之间的区别
Spring mvc 与 Struts mvc 的区别
Spring Boot 的 starter 原理,自己实现一个 starter
负载均衡:Feign、Spring Cloud Loadbalance
服务配置:Spring Cloud Config
服务限流与熔断:Hystrix
服务链路追踪:Dapper
服务网关、安全、消息
[ ] → JBoss
[ ] → tomcat
[ ] → jetty
[ ] → Weblogic
[ ] → git & svn
[ ] → maven & gradle
[ ] → Intellij IDEA 常用插件:Maven Helper 、FindBugs-IDEA、阿里巴巴代码规约检测、GsonFormat
Lombok plugin、.ignore、Mybatis plugin
lambda 表达式、Stream API、时间 API
[ ] → Java 9 Jigsaw、Jshell、Reactive Streams
[ ] → Java 10 局部变量类型推断、G1 的并行 Full GC、ThreadLocal 握手机制
[ ] → Java 11 ZGC、Epsilon、增强 var
[ ] → Spring 5 响应式编程
[ ] → Spring Boot 2.0
[ ] → HTTP/2
[ ] → HTTP/3
[ ] 使用单例、使用 Future 模式、使用线程池
[ ] 选择就绪、减少上下文切换、减少锁粒度、数据压缩、结果缓存
线程 Dump、内存 Dump、gc 情况
[ ] → dump 分析 分析死锁、分析内存泄露
[ ] → dump 分析及获取工具 jstack、jstat、jmap、jhat、Arthas
[ ] → 自己编写各种 outofmemory,stackoverflow 程序 HeapOutOfMemory、 Young OutOfMemory、
MethodArea OutOfMemory、ConstantPool OutOfMemory、
DirectMemory OutOfMemory、Stack OutOfMemory Stack OverFlow
options、管道、后台异步任务
文档:https://alibaba.github.io/arthas/advanced-use.html
[ ] → 常见问题解决思路 内存溢出、线程死锁、类加载冲突
[ ] → 使用工具尝试解决以下问题,并写下总结 当一个 Java 程序响应很慢时如何查找问题
当一个 Java 程序频繁 FullGC 时如何解决问题
如何查看垃圾回收日志
当一个 Java 应用发生 OutOfMemory 时该如何解决
如何判断是否出现死锁
如何判断是否存在内存泄露
使用 Arthas 快速排查 Spring Boot 应用404/401问题
使用 Arthas 排查线上应用日志打满问题
利用 Arthas 排查 Spring Boot 应用 NoSuchMethodError
[ ] → 编译与反编译
[ ] → Java 代码的编译与反编译
[ ] → Java 的反编译工具 javap 、jad 、CRF
[ ] → 即时编译器
[ ] → 编译过程 词法分析,语法分析(LL 算法,递归下降算法,LR 算法) 语义分析,运行时环境,中间代码,代码生成,代码优化
→ Linux 的常用命令 → 进程间通信 → 进程同步 生产者消费者问题、哲学家就餐问题、读者写者问题
→ 缓冲区溢出 → 分段和分页 → 虚拟内存与主存 → 虚拟内存管理 → 换页算法
[ ] → MySQL 执行引擎
[ ] → MySQL 执行计划 如何查看执行计划,如何根据执行计划进行 SQL 优化
[ ] → 索引 Hash 索引、B 树索引(B+树、和B树、R树)
普通索引、唯一索引
覆盖索引、最左前缀原则、索引下推
[ ] → SQL 优化
[ ] → 数据库事务和隔离级别 事务的隔离级别、事务能不能实现锁的功能
[ ] → 数据库锁 行锁、表锁、使用数据库锁实现乐观锁、
[ ] → 连接 内连接,左连接,右连接
[ ] → 数据库主备搭建
[ ] → binlog
[ ] → redolog
[ ] → 内存数据库 h2
[ ] → 分库分表
[ ] → 读写分离
[ ] → 常用的 NoSql 数据库 redis、memcached
[ ] → 分别使用数据库锁、NoSql 实现分布式锁
[ ] → 性能调优
[ ] → 数据库连接池
栈、队列、链表、数组、哈希表、
栈和队列的相同和不同之处
栈通常采用的两种存储结构
B 树、B+ 树、R 树、多路树、红黑树
[ ] → 堆 大根堆、小根堆
[ ] → 图 有向图、无向图、拓扑
[ ] → 排序算法 稳定的排序:冒泡排序、插入排序、鸡尾酒排序、桶排序、计数排序、归并排序、原地归并排序、二叉排序树排序、鸽巢排序、基数排序、侏儒排序、图书馆排序、块排序
不稳定的排序:选择排序、希尔排序、Clover 排序算法、梳排序、堆排序、平滑排序、快速排序、内省排序、耐心排序
各种排序算法和时间复杂度
基本概念、常见用法
[ ] → Solr,Lucene,ElasticSearch 在 linux 上部署 solr,solrcloud,新增、删除、查询索引
[ ] → Storm,流式计算,了解 Spark,S4 在 linux 上部署 storm,用 zookeeper 做协调,运行 storm hello world,local 和 remote 模式运行调试 storm topology。
[ ] → Hadoop,离线计算 HDFS、MapReduce
[ ] → 分布式日志收集 flume,kafka,logstash
[ ] → 数据挖掘,mahout
XSS 的防御
[ ] → CSRF
[ ] → 注入攻击 SQL 注入、XML 注入、CRLF 注入
[ ] → 文件上传漏洞
[ ] → 加密与解密 对称加密、非对称加密、哈希算法、加盐哈希算法
MD5,SHA1、DES、AES、RSA、DSA
彩虹表
memcached 为什么可以导致 DDos 攻击、什么是反射型 DDoS
如何通过 Hash 碰撞进行 DOS 攻击
[ ] 数据一致性、服务治理、服务降级
[ ] → 分布式事务 2PC、3PC、CAP、BASE、 可靠消息最终一致性、最大努力通知、TCC
[ ] → Dubbo 服务注册、服务发现,服务治理
http://dubbo.apache.org/zh-cn/
mycat、otter、HBase
[ ] → 分布式文件系统 mfs、fastdfs
[ ] → 分布式缓存 缓存一致性、缓存命中率、缓存冗余
[ ] → 限流降级 Hystrix、Sentinal
[ ] → 算法 共识算法、Raft 协议、Paxos 算法与 Raft 算法、
拜占庭问题与算法、2PC、3PC
[ ] SOA、康威定律
[ ] → ServiceMesh sidecar
[ ] → Docker & Kubernets
[ ] → Spring Boot
[ ] → Spring Cloud
[ ] → 分库分表
[ ] → CDN 技术
[ ] → 消息队列 ActiveMQ
CPU、内存、磁盘 I/O、网络 I/O 等
[ ] → 监控手段 进程监控、语义监控、机器资源监控、数据波动
[ ] → 监控数据采集 日志、埋点
[ ] → Dapper
[ ] tomcat 负载均衡、Nginx 负载均衡
[ ] 四层负载均衡、七层负载均衡
Raft 协议、Paxos 算法与 Raft 算法、拜占庭问题与算法、消息认证码与数字签名
[ ] → 比特币 挖矿、共识机制、闪电网络、侧链、热点问题、分叉
[ ] → 以太坊
[ ] → 超级账本
[ ] 数学基础、机器学习、人工神经网络、深度学习、应用场景。
[ ] → 常用框架 TensorFlow、DeepLearning4J
Groovy、Python、Go、NodeJs、Swift、Rust
面向对象-行为化:
面向对象是把整个需求按照特点、功能划分,将这些存在共性的部分封装成对象,创建了对象不是为了完成某一个步骤,而是描述某个事物在解决问题的步骤中的行为。
面向过程-步骤化:
面向过程就是分析出实现需求所需要的步骤,通过函数一步一步实现这些步骤,接着一次调用即可。
1、面向过程
优点:性能上它是优于面向对象的,因为类在调用的时候需要实例化,开销较大。
缺点:不宜维护、复用和扩展。
用途:单片机、嵌入式开发、Linux/Unix等对性能要求较高的地方
2、面向对象
优点:易维护、易复用、易扩展、优于面向对象有封装、继承、多态的特性,可以设计出低耦合的系统,使系统更加易于维护。
性能:性能比面向过程低
3、低耦合:简单的理解就是说,模块与模块之间尽可能的独立,两者之间的关系尽可能简单,尽量使其独立的完成一些子功能,这避免了牵一发而动全身的问题。
面向对象的思想是如何在Java中体现的呢?就是通过类和对象。
类是一组相关的属性和行为的集合。是一个抽象的概念。
对象是该类事务的具体表现形式。具体存在的个体。
成员变量是事物的属性。
成员方法是事物的行为。
类就是对一些具有共性特征,并且行为相似的的个体的描述。
1、在类中的位置不同
成员变量:类中方法外。
局部变量:方法定义中或方法声明上
2、在内存中位置不同
成员变量:在堆中
局部变量:在栈中
3、声明周期不同
成员变量:随着对象的创建也存在,随着对象的消失而消失。
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失。
4、初始化值不同
成员变量:有默认值。
局部变量:没有默认值,必须定义,赋值然后才能使用。
封装就是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别,将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。
继承是面向对象的基本特征之一,继承机制允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
多态指的是同一个行为具有多个不同表现形式或形态的能力。是指一个类实例(对象)的相同方法在不同情形有不同的表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式给予调用。
多态的优点:
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
多态存在的三个必要条件:
- 继承
- 重写(子类继承父类后对父类的方法进行重新定义)
- 父类引用指向子类对象
一个类应该有且只有一个去改变它的理由,这意味着一个类应该只有一项工作。
对象或实体应该对扩展开放,对修改封闭。
在对象X为类型T时q(x)成立,那么当S是是T的子类时,对象y为类型S时,q(y)也应成立。(即对父类的调用同样适用于子类)。
高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象,而不是抽象依赖于实现。
不应该强迫客户端实现一个它用不上的接口,或是说客户端不应该被迫依赖它们不使用的方法,使用多个专门的接口比使用单个接口要好的多。
摘抄自:https://mp.weixin.qq.com/s?__biz=MzI3NzE0NjcwMg==&mid=2650123276&idx=1&sn=5800cc1e60f64591ae4030e2e5e6b61c&chksm=f36bb12dc41c383b4254083be91c38f867113a980774c93c5078b037aa0bafa32df4bca5de74&scene=21#wechat_redirect