Java大集结

Java 基础

封装

将对象的属性和方法保存起来,不允许外面的程序查看到

封装也可以达到重用的效果,当我们在写代码的时候在多个地方用到,也可以对代码进行封装。如:工具类等

继承

1.子类继承父类的所有非private方法(构造器不可继承,static可继承,可重写,final方法可继承,不可重写)

2.子类可以扩展自己的属性和方法

优缺点

提高耦合,

多态

多态的基础

①必须是在继承的基础上

②父类引用指向子类对象

③重写父类方法

多态的优点

一种对象可以有多种表现形式,解耦,灵活性

抽象

将对象根据我们的需要,抽象出所需要的属性,和方法(行为)封装为对象是为抽象        

接口和抽象类的区别

接口只能是抽象方法,抽象类可以有非抽象方法

接口的属性必须是public final ,抽象类可以有private等属性

接口是多个实现,抽象类只能通过extends 单个继承

8大数据类型
byteshortintlong
floatdoublecharboolean


获取对象的字节码,哈希之后进行比较,克隆之后,再转为字符串,notify,wait,finalize

Object类方法
getClasshashCodeequestclonetoStringnotifynotifyAll
waitfinalize

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

转发和重定向的区别?

  1. 重定向发生在客户端,转发发生在服务器
  2. 重定向较转发慢
  3. 重定向url改变
  4. 重定向可以发生在不同的服务器职级,转发只能在同一个服务器
  5. 重定向后,执行重定向后面的代码,转发不执行??
  6. 重定向两次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返回给前端
ModelAndViewvoidStringJSON(使用@ResponseBody)

mvc注解

过滤器

拦截器

监听器

切面

实现原理

IO

IO记忆:文件对象中的字节数组是为数据,数据的读取是不需要过滤的,可以直接通过缓冲流读取。字符串合并之后可以进行打印。


文件FileInputStream
对象ObjectInputStream
字节数组ByteArrayInputStream,可重复使用
数据DataInputStream
过滤FilterInputStream,对存在的流增加额外的功能,给目标文件增加不存在的行数,增加拷贝功能
缓冲BufferedInputStream
字符串StringReader
合并流
RandomAccessFile,可读可写,非io包中的流
打印流PrintStream
分类(抽象父类)
字节流字符流
InputStreamOutputStreamReaderWriter
对应接口
CloseableCloseableCloseableCloseable
ReadableFlushable
Appendable

NIO

NIO三大组件
ChannelBufferSelecter
4种渠道类型

channel

用处
FileChannel文件操作,无法设置为非阻塞状态
DatagramChannelUDP
SocketChannelTCP客户端
ServerSocketChannelTCP服务端
缓冲区
4类8种基础数据类型,减去Boolean类型,有7种缓冲区
ByteBufferShortBufferIntLong
FloatBufferDoubleCharBuffer
缓冲区属性/方法
缓冲区属性
属性描述
capacity容量,缓冲区大小
limit

数据从缓冲区读出去,limit=数据容量

数据写入缓冲区,limit=capacity

position

数据从缓冲区读出去,position为7当前读取到的位置

数据写入缓冲区,初始没有数据时,position=0

缓冲区方法
mark
flip写入缓存模式切换到从缓冲区读出数据模式
clear清空缓冲区数据
compact清空已经从缓冲区读取过的数据,并将未读取的数据移到0的位

网络编程

网络编程包含的内容
HTTPTCPUDPSocketWebSocket
七层模式四层模式

多线程

线程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.有限的等待时间

饥饿

活锁

集合

单列集合(Collection为父类)
集合名称特性描述
List接口
ArrayList由数组组成的链表,查询,修改速度快,删除,增加速度慢
LinkedList查询,修改速度慢,删除,添加速度快
Vector与ArrayList类似,底层使用数组实现的链表,synchronized控制操作方法,线程安全
Set接口
HashSet底层HashMap实现,使用HashMap的key来存储元素,可以有一个null值
TreeSet底层TreeMap实现,使用TreeMap的key来存储元素,不允许null值(因为TreeMap会对key进行比较,进而排序,故key不允许为null),根据元素的(默认)自然顺序排序,通过Comparable,Comparator排序
双列集合(Map父类)
集合名称特性描述
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的方式

  1. Class.forName("类的全限定名")
  2. 对象.getClass
  3. 类名.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调优

深度好文: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代码管理工具
TomcatWeb服务器
Nginx反向代理工具
ideaJava开发工具
EverythingWindow查询文件工具
Postman
NavicatMySQL数据库客户端
RedisDesktopManagerWindow系统Redis可视化客户端
GIMP图形编译工具
Xshell日志查看
XftpLinux文件传输
支付宝开放平台助手生成密钥等
PowerDesigner数据库ER图
MonogoDB
内网穿透工具
Axure RP原型图查看
Fiddler拦截请求
MongoDBCompassMongoDB图形化工具
Notepad++记事本编辑器
Snipaste截图工具

操作系统

Linux

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版)
非技术书单
书名作者
活着余华
三体刘慈欣
流浪地球刘慈欣
平凡的世界路遥
追风筝的人
小狗钱钱
富爸爸穷爸爸
影响力
穷查理宝典

经典问题收集

什么情况下后台线程会被杀死?

在主线程结束的时候,后台线程也会跟着结束,即使没有运行完成

说些什么

控制自己真的非常的难,需然我不喜欢强迫,但是,强迫却使我进步。

在学习时,当大家都花费相同的时间时,专注就显得尤为重要,如何提升自己的专注呢?读或者是说出来,用手写,行动

通过书本学习知识经验,如果不能,那就更多的经历,通过生活,复杂的经历去提升经验,提高自己的内涵。所以要更多的经历各种复杂

我并不介意与他人分享或者教授自己所知道的知识。因为在这之中我也得到提升,知识得到巩固,也许还会知道其他的新的知识

不要等会了才去争取,才去做,不会也上

不要降低自己的期望,即使你降低了,也可能导致他人看不起,然后,降低之后,自己也会不高兴

不是一个人,而是一个团队,要学会求助他人

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值