Java 基础
封装
将对象的属性和方法保存起来,不允许外面的程序查看到
封装也可以达到重用的效果,当我们在写代码的时候在多个地方用到,也可以对代码进行封装。如:工具类等
继承
1.子类继承父类的所有非private方法(构造器不可继承,static可继承,可重写,final方法可继承,不可重写)
2.子类可以扩展自己的属性和方法
优缺点
提高耦合,
多态
多态的基础
①必须是在继承的基础上
②父类引用指向子类对象
③重写父类方法
多态的优点
一种对象可以有多种表现形式,解耦,灵活性
抽象
将对象根据我们的需要,抽象出所需要的属性,和方法(行为)封装为对象是为抽象
接口和抽象类的区别
接口只能是抽象方法,抽象类可以有非抽象方法
接口的属性必须是public final ,抽象类可以有private等属性
接口是多个实现,抽象类只能通过extends 单个继承
byte | short | int | long |
float | double | char | boolean |
获取对象的字节码,哈希之后进行比较,克隆之后,再转为字符串,notify,wait,finalize
getClass | hashCode | equest | clone | toString | notify | notifyAll |
wait | finalize |
String类方法
length trim charAt compareTo startWith endWith toString equest subString match replace replaceAll split format valueOf intern toLowerCase toUpperCase concat indexOf lastIndexOf
比较:equest,compareTo,startWith,endWith,concat,matches
替换:replace,replaceFirst,replaceAll
切割:subString,split,trim
查找:indexOf,lastIndexOf,charAt
转换:toLowerCase,toUpperCase,valueOf
其他:getBytes,getChars,length,isEmpty
Java Web
Spring MVC
mvc分发流程
转发与重定向
转发:forward;重定向:redirect
转发和重定向的区别?
- 重定向发生在客户端,转发发生在服务器
- 重定向较转发慢
- 重定向url改变
- 重定向可以发生在不同的服务器职级,转发只能在同一个服务器
- 重定向后,执行重定向后面的代码,转发不执行??
- 重定向两次request请求,转发只有一次
- response.sendRedirect("https://www.baidu.com/");
- request.getRequestDispatcher("/base/aliflow").forward(request, response);
解决get和post乱码
get:tomcat默认编码未ISO-8895-1,设置默认编码为UTF-8,或者是在请求头设置为UTF-8,然后将请求内容重写使用UTF-8编码
post:使用编码过滤器
mvc返回给前端 | |||
ModelAndView | void | String | JSON(使用@ResponseBody) |
mvc注解
过滤器
拦截器
监听器
切面
实现原理
IO
IO记忆:文件对象中的字节数组是为数据,数据的读取是不需要过滤的,可以直接通过缓冲流读取。字符串合并之后可以进行打印。
文件 | FileInputStream |
对象 | ObjectInputStream |
字节数组 | ByteArrayInputStream,可重复使用 |
数据 | DataInputStream |
过滤 | FilterInputStream,对存在的流增加额外的功能,给目标文件增加不存在的行数,增加拷贝功能 |
缓冲 | BufferedInputStream |
字符串 | StringReader |
合并流 | |
RandomAccessFile,可读可写,非io包中的流 | |
打印流 | PrintStream |
字节流 | 字符流 | ||
InputStream | OutputStream | Reader | Writer |
对应接口 | |||
Closeable | Closeable | Closeable | Closeable |
Readable | Flushable | ||
Appendable |
NIO
Channel | Buffer | Selecter |
channel | 用处 |
FileChannel | 文件操作,无法设置为非阻塞状态 |
DatagramChannel | UDP |
SocketChannel | TCP客户端 |
ServerSocketChannel | TCP服务端 |
4类8种基础数据类型,减去Boolean类型,有7种缓冲区 | |||
ByteBuffer | ShortBuffer | Int | Long |
FloatBuffer | Double | CharBuffer |
缓冲区属性 | |
属性 | 描述 |
capacity | 容量,缓冲区大小 |
limit | 数据从缓冲区读出去,limit=数据容量 数据写入缓冲区,limit=capacity |
position | 数据从缓冲区读出去,position为7当前读取到的位置 数据写入缓冲区,初始没有数据时,position=0 |
缓冲区方法 | |
mark | |
flip | 写入缓存模式切换到从缓冲区读出数据模式 |
clear | 清空缓冲区数据 |
compact | 清空已经从缓冲区读取过的数据,并将未读取的数据移到0的位 |
网络编程
网络编程包含的内容 | ||||
HTTP | TCP | UDP | Socket | WebSocket |
七层模式 | 四层模式 |
多线程
线程VS进程
线程是CPU调度的基本单位,进程是内核分配资源的最小单位。一个进程中存在多个线程
什么是线程的上下文?
在单个CPU使用多线程的时候,总是在比较短的时间内进行多个线程的切换。在切换的过程中,要先保存上一个任务的状态,以便下次执行的时候,知道执行到哪里,然后加载任务,从保存到加载的过程为一个上下文。上下文的切换是需要消耗资源的。
线程
创建线程的方式
各自的优缺点
线程的生命周期
在Thread类可以查看到线程的生命周期
新建new,运行running(阻塞block,等待wait,等待超时wait time),死亡terminal
线程池
7个核心要素
核心线程,最大线程数,最大线程存活时间,时间单位(时/分/秒),阻塞队列,拒绝策略,线程工厂。
阻塞队列:Array有界同步队列,Linked无界同步队列,Synchroniz阻塞队列
拒绝策略:拒绝并抛异常,抛弃队列中最早的任务,抛弃当前任务,使用当前线程执行任务
线程池的生命周期
new,showdown,showdownNow,还有一个,terminal,(好像有5个)
原之类
多线程集合框架
锁
synchronize(){}
Lock
AQS
CAS
死锁
活锁
饥饿
互斥 | 抢占并持有 | 不可剥夺 | 循环等待 |
如何解决死锁
1.不允许多个锁使用
2.不允许使用多个资源
3.有限的等待时间
饥饿
活锁
集合
集合名称 | 特性描述 |
List | 接口 |
ArrayList | 由数组组成的链表,查询,修改速度快,删除,增加速度慢 |
LinkedList | 查询,修改速度慢,删除,添加速度快 |
Vector | 与ArrayList类似,底层使用数组实现的链表,synchronized控制操作方法,线程安全 |
Set | 接口 |
HashSet | 底层HashMap实现,使用HashMap的key来存储元素,可以有一个null值 |
TreeSet | 底层TreeMap实现,使用TreeMap的key来存储元素,不允许null值(因为TreeMap会对key进行比较,进而排序,故key不允许为null),根据元素的(默认)自然顺序排序,通过Comparable,Comparator排序 |
集合名称 | 特性描述 |
HashMap | 通过数组+链表实现,在jdk1.8通过数组+链表+红黑树,当元素大于8个时,链表转红黑树,当元素小于6个时,红黑树转链表。在多线程中存在死锁(在扩容时出现),覆盖问题; 允许一个null key,多个null value 哈希碰撞处理,先Hash,如果HashCode一样,则对key进行equals,如果equals也一样,则覆盖,否则使用链表或者时红黑树的形式存储在碰撞的位置 |
TreeMap | 不允许key 为null,可以多个null value 通过key的Comparable,或者时Comparator进行排序 |
LinkendHashMap | 与HashMap类型,但是根据元素的存入顺序,有序。 允许一个null key,多个null value |
Hashtable | 不允许null key,不允许null value,使用synchronizd控制方法,线程安全 与HashMap类型,使用hash进行计算key Hashtable是Dictionary的一个具体实现。都是使用Map.Entry进行存储单个元素 |
数据结构
数组 | 链表 | 堆 | 栈 | 队列 |
哈希表 | 布隆过滤器 | 跳表 | 二叉查找树 | 红黑树 |
B树(B-树) | B+树 | 图 |
名称 | 描述 | 用例 |
数组 | 计算机内存中连续的内存地址 | |
链表 | 计算机中可以不是连续的内存地址,必须有指向下一个节点的指针 | |
栈 | 底层可使用数组/链表实现,必须遵循先进后出原则 | |
队列 | 底层可使用数组/链表实现,必须遵循先进先出原则 | |
哈希表 | 底层数组实现,选中特定的哈希函数,对数据进行哈希,得到的结果则为在数组中存储的位置 | |
布隆过滤器 | 类似一个巨大的Map,使用多个哈希函数对同一个值进行哈希,并存储到Map中,特点:查询到为存在的数据可能存在,查询到不存在的数据必定不存在 | Redis,缓存穿透 |
跳表 | Redis | |
二叉查找树 | ||
红黑树 | jdk1.8 HashMap | |
B树(B-树) | ||
B+树 | 数据库 | |
图 |
一直以为,有很多中数据结构,原来,也就这些。(*^-^*)
算法
如何使数据有序?在插入的时候对数据排序,在查询的时候根据条件排序。
排序算法
冒泡排序
堆排序
快排
插入排序
查找算法
二分查找
动态规划
贪心算法
设计模式
单例模式
多利模式
策略模式
适配器模式
代理模式
模板模式
反射
什么是反射?通过反射,我们可以做什么?
答:
一,反射就是通过字节码获取对象的过程
二,获取构造器,创建对象,设置/获取属性值,调用方法以及获取注解信息。
获取Class的方式
- Class.forName("类的全限定名")
- 对象.getClass
- 类名.class
JVM
类加载过程
加载
链接(验证:文件,元数据,字节码,准备:静态变量赋值,解析:将对象引用转为直接引用
初始化(执行clinit方法
双亲委派机制
从 应用类加载器(appClassLoader)判断是否已经加载,未加载,
扩展类加载器(ExtClassLoader)判断是否已经加载,未加载,
根类加载器(Bootstrap ClassLoader)判断是否已经加载,未加载,判断是否可加载,可则加载,否则
扩展类加载器判断是否可加载
作用
1. 通过委派的方式,可以避免类的重复加载,当父加载器已经加载过某一个类时,子加载器就不会再重新加载这个类。
2. 通过双亲委派的方式,还保证了安全性。因为Bootstrap ClassLoader在加载的时候,只会加载JAVA_HOME中的jar包里面的类,如java.lang.Integer,那么这个类是不会被随意替换的,除非有人跑到你的机器上, 破坏你的JDK。那么,就可以避免有人自定义一个有破坏功能的java.lang.Integer被加载。这样可以有效的防止核心Java API被篡改。
JVM的内存模型
堆
栈
(本地方法栈
(虚拟机栈
方法区
程序计数器
最全JVM面试题_BlogY的博客-CSDN博客_jvm面试题
jvm调优
GC
新生代
老年代
永久代
Full GC
Min GC
过滤器Filter
拦截器Interater
监听器Listener
框架
Spring
AOP(calib代理,动态代理
IOC(反射
DI
Spring的生命周期
Spring的常用注解
Springboot
SpringBoot搭建过程
SpringBoot生命周期
常用注解
SpringMVC
DispatchServlet分发过程
Spring,SpringBoot,SpringMVC的区别?
MyBatis
OAuth2.0
Redis
五种数据结构:String,List,Hash,Set,SortSet
缓存雪崩
缓存穿透
缓存击穿
JWT
Netty
xxl-job
Nacos
Apollo
SpringCloud
AlibabaSpringCloud
Dubbo
RocketMQ
RocketMQ常见面试题_ayu_programer的博客-CSDN博客_rocketmq面试题
数据库
MySQL
MongoDB
工具/插件
软件名称 | 作用 |
Maven | 管理Java依赖包 |
Git | 代码管理工具 |
Tomcat | Web服务器 |
Nginx | 反向代理工具 |
idea | Java开发工具 |
Everything | Window查询文件工具 |
Postman | |
Navicat | MySQL数据库客户端 |
RedisDesktopManager | Window系统Redis可视化客户端 |
GIMP | 图形编译工具 |
Xshell | 日志查看 |
Xftp | Linux文件传输 |
支付宝开放平台助手 | 生成密钥等 |
PowerDesigner | 数据库ER图 |
MonogoDB | |
内网穿透工具 | |
Axure RP | 原型图查看 |
Fiddler | 拦截请求 |
MongoDBCompass | MongoDB图形化工具 |
Notepad++ | 记事本编辑器 |
Snipaste | 截图工具 |
操作系统
Linux
名称 | 描述 |
cd / | 到根目录 |
cd /home | 到当前登录的home目录 |
cd ../ | 到上级目录 |
cd ./xx | 到下级的xx目录 |
ll | 查看当前目录下的文件详情 |
rm | 删除文件 |
mv | 移动文件 |
cp | 复制文件 |
find | 查找目录下的指定文件 |
more | |
tail | 动态查询文件 |
less | 查看文件尾部的多少行 |
tall | 查看文件头部的多少行 |
vim | 编辑文件 |
i | 进入编辑 |
esc | 退出编辑模式 |
!q | 强制退出 |
!qw | 强制写入,并退出 |
书
书名 | 作者 |
Redis设计与实现 | |
Java编程思想 | |
Java并发编程的艺术 | 方腾飞 |
Java并发编程实战 | |
深入理解Java虚拟机:JVM高级特性与最佳实践 | 周志明 |
数据结构(C语音版) | 严蔚敏_吴伟民 |
算法图解 | |
高性能MySQL_第3版(中文) | |
MySQL实战45讲 | |
MySQL技术内幕:InnoDB存储引擎 第2版 | |
深入分析Java Web技术内幕 | |
架构探险分布式服务框架 | 李业兵 |
设计模式:可复用面向对象软件的基础(典藏版) | |
深入理解计算机系统(原书第3版) |
书名 | 作者 |
活着 | 余华 |
三体 | 刘慈欣 |
流浪地球 | 刘慈欣 |
平凡的世界 | 路遥 |
追风筝的人 | |
小狗钱钱 | |
富爸爸穷爸爸 | |
影响力 | |
穷查理宝典 | |
经典问题收集
什么情况下后台线程会被杀死?
在主线程结束的时候,后台线程也会跟着结束,即使没有运行完成
说些什么
控制自己真的非常的难,需然我不喜欢强迫,但是,强迫却使我进步。
在学习时,当大家都花费相同的时间时,专注就显得尤为重要,如何提升自己的专注呢?读或者是说出来,用手写,行动
通过书本学习知识经验,如果不能,那就更多的经历,通过生活,复杂的经历去提升经验,提高自己的内涵。所以要更多的经历各种复杂
我并不介意与他人分享或者教授自己所知道的知识。因为在这之中我也得到提升,知识得到巩固,也许还会知道其他的新的知识
不要等会了才去争取,才去做,不会也上
不要降低自己的期望,即使你降低了,也可能导致他人看不起,然后,降低之后,自己也会不高兴
不是一个人,而是一个团队,要学会求助他人