HashMap总结
HashMap总结基本原理类1. 数据结构类1.1 HAshMap的结构是什么?JDK1.7是数组+链表
JDK1.8是数组+链表+红黑树
1.2 为什么要使用红黑树,什么时候转化为红黑树?链表过长导致性能问题
在JDK1.8之前,HashMap采用数组加链表的结构。当多个键的哈希值存储到同一个桶中时,这些键值对会以链表的形式存储。
如表链表过长,会严重影响查询,插入和删除的性能,时间复杂度从O(1)到O(n)。
特别是在哈希严重冲突的情况下,链表的性能问题尤为明显。
红黑树的优势
红黑树是一种自平衡的二叉搜索树,它的查询,插入和删除的时间复杂度都是O(logn)。
当链表的长度超过一定的阈值(默认是8),HashMap会将链表转化为红黑树
这种优化在哈希冲突严重的情况下,可以显著提升性能。
链表转红黑树的阈值: 默认是8
红黑树退化为链表的阈值: 默认是6
2. 容量&Hash冲突2.1 什么时候会扩容当当前存储的键值对数量(size)超过了负载因子(load Factory)和 当前数组桶的数量(capacity)的乘积
扩容条件: size > loadFac ...
计算机网络
计算机网络基础TCP/IP有那几层应用层:我们电脑或手机使用的应用软件都是在应用层实现。当两个不同设备的应用需要通信时,就要把数据传输给下一层,也就是传输层。
应用层只需要专注于喂用户提供应用功能,比如HTTP,FTP,DNS,Telnet等
传输层:应用层的数据回传给传输层,传输层是为应用层提供网络支持的。
在传输层有两个协议,分别是TCP和UDP
UDP:只负责发送数据包,不保证能否抵达对方,但它时效性更高,传输效率也高
TCP:全称是控制传输协议,比UDP多了很多特性,比如流量控制、超时重传、拥塞控制等,这些都是为了保证数据数据包能够可靠地传输对方。
应用层需要传输的数据可能会非常大,如果直接传输就不好控制。因此当传输层的数据包大小超过MSS(TCP最大报文长度),就要将数据包分块,这样技师中途有一个分块丢失或损坏了只需要发送损失的分块。我们把这个分块称为一个TCP段。
网络层:网络层负责将数据从一个设备传输到另一个设备,帮助实现应用到应用的通信,而实际的传输功能就交给下一层
网络层最常使用的协议是IP协议,IP协议会将传输层的保温作为数据部分,再加上IP包头组装成IP ...
mysql基础
mysql基础基础使用操作数据库
创建数据库
1CREATE DATABASE [IF NOT EXISTS] 数据库名;
删除数据库
1DROP DATABASE [IF EXIST] 数据库名字;
使用数据库
1use 数据库名;
查看数据库
1show 数据库名;
数据库的列类型数值:
数据类型
描述
大小
tinyint
十分小的数据
1个字节
smallint
较小的数据
2个字节
mediumint
中等大小的数据
3个字节
int
标准的整数
4个字节
bigint
较大的数据
8个字节
float
浮点数
4个字节
double
浮点数
8个字节
decimal
字符串形式的浮点数,一般用于金融计算
字符串
数据类型
描述
大小
char
字符串固定大小
0~255
varchar
可变字符串
0~65535
tinytext
微型文本
2^8-1
text
文本串
2^16-1
时间日期
数据类型
描述
格式
date
日期格式
YYYY-MM-DD
time
时间格式
HH ...
springboot基础详解
springboot基础详解循环依赖什么是循环依赖?AB两个Bean之间相互注入
spring如何解决循环依赖关键是提前暴露未完全创建的Bean
在spring中主要使用了三级缓存来解决循环依赖
一级缓存:用于存储完全实例化完成的Bean
二级缓存:用于存储尚未完全初始化,但已实例化的Bean,用于提前暴露对象,解决循环依赖
三级缓存:用于存储对象工厂,当需要时,可以通过工厂创建早期的Bean
解决步骤:
Spring首先创建Bean实例,并存入三级缓存中
当一个Bean依赖另一个未初始化的Bean时,Spring会从三级缓存中获取Bean的工厂,并生成改Bean的代理对象
代理对象存入二级缓存,解决循环依赖
一旦所有依赖Bean被完全初始化,Bean将转移到一级缓存
解决循环依赖的流程如下:
实例化A对象,并创建ObjectFactory存入三级缓存。
A在初始化时需要B对象,开始B的创建逻辑。
B实例化完成,也创建ObjectFactory存入三级缓存。
B需要注入A,通过三级缓存获取ObjectFactory生成A对象,存入二级缓存。
B通过二级缓存获得A对象后,B创建 ...
java基础详解
java基础详解概念基础框架建立
对象实例在堆内存中
java中堆栈的区别栈:主要存储局部变量和方法的调用信息(如返回地址参数等)。在方法执行期间,局部变量被创建在栈上,并在方法结束时销毁。
堆:用于存储对象实例和数组。每次用new关键字创建对象时,JVM都会在堆上为该对象分配内存空间
面向对象基础构造方法的特点
名称与类名相同
没有返回值
自动执行
不能被重写(override),可以被重载
面向对象的三大特征1.封装:
封装是指把一个对象的状态信息(也就是属性)隐藏在对象内部,不允许外部对象直接访问对象的内部信息
2.继承:
子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有
子类可以拥有自己属性和方法,即子类可以对父类进行扩展
3.多态
表示一个对象具有多种的状态,具体表现为父类的引用指向子类的实例
StringString、StringBuffer、StringBuilder的区别
安全性:
String不可变,也就可以理解为常量,线程安全。
StringBuilder 与 StringBuffer都继承自 Abs ...
java多线程
java多线程多线程基础在计算机中,我们把一个任务称为一个进程,浏览器就是一个进程,视频播放器是另一个进程,类似的,音乐播放器和Word都是进程。
某些进程内部还需要同时执行多个子任务。例如,我们在使用Word时,Word可以让我们一边打字,一边进行拼写检查,同时还可以在后台进行打印,我们把子任务称为线程。
一个Java程序实际上是一个JVM进程,JVM进程用一个主线程来执行main()方法,在main()方法内部,我们又可以启动多个线程。此外,JVM还有负责垃圾回收的其他工作线程
Java多线程编程的特点又在于:
多线程模型是Java程序最基本的并发模型;
后续读写网络、数据库、Web开发等都依赖Java多线程模型。
创建新进程创建一个新线程非常容易,我们需要实例化一个Thread实例,然后调用它的start()方法:
12Thread t = new Thread();t.start(); // 启动新线程
Thread内部有一个run()方法,start()方法会在内部自动调用实例的run()方法
1Thread t = new Thread(new MyRunnable( ...
Elasticsearch
Elasticsearchelasticsearch是一款非常强大的开源搜索引擎,支持的功能非常多,例如:
代码搜索
商品搜索
解决方案搜索
地图搜索
初识Elasticsearch是由elastic公司开发的一套搜索引擎技术,它是elastic技术栈中的一部分。完整的技术栈包括:
Elasticsearch:用于数据存储、计算和搜索
Logstash/Beats:用于数据收集
Kibana:用于数据可视化
整套技术栈被称为ELK,经常用来做日志收集、系统监控和状态分析等等:
整套技术栈的核心就是用来存储、搜索、计算的Elasticsearch,因此我们接下来学习的核心也是Elasticsearch。
我们要安装的内容包含2部分:
elasticsearch:存储、搜索和运算
kibana:图形化展示
首先Elasticsearch不用多说,是提供核心的数据存储、搜索、分析功能的。
然后是Kibana,Elasticsearch对外提供的是Restful风格的API,任何操作都可以通过发送http请求来完成。不过http请求的方式、路径、还有请求参数的格式都有严格 ...
微服务总结
微服务总结知识体系总图:
注册中心微服务本质是多实例部署,服务间的调用需要一个统一的管理
1. 部署Nacos的注册中心首先我们要准备MySQL数据库表,用来存储Nacos的数据(需要去资料里找nacos.sql文件)
表的结构如下:
其次需要更改下载下来的nacos文件夹中的custom.env文件,配置mysql地址
后启动nacos,日访:8848/nacos进入到nacos的控制台,账号密码都是nacos
2.服务注册和发现添加依赖
12345<!--nacos 服务注册发现--><dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
配置
123456spring: application: name: item-service # 服务名称 clo ...
MQ消息队列
MQ消息队列消息Broker,目前常见的实现方案就是消息队列(MessageQueue),简称为MQ.
目比较常见的MQ实现:
ActiveMQ
RabbitMQ
RocketMQ
Kafka
几种常见MQ的对比:
RabbitMQ
ActiveMQ
RocketMQ
Kafka
公司/社区
Rabbit
Apache
阿里
Apache
开发语言
Erlang
Java
Java
Scala&Java
协议支持
AMQP,XMPP,SMTP,STOMP
OpenWire,STOMP,REST,XMPP,AMQP
自定义协议
自定义协议
可用性
高
一般
高
高
单机吞吐量
一般
差
高
非常高
消息延迟
微秒级
毫秒级
毫秒级
毫秒以内
消息可靠性
高
一般
高
一般
追求可用性:Kafka、 RocketMQ 、RabbitMQ
追求可靠性:RabbitMQ、RocketMQ
追求吞吐能力:RocketMQ、Kafka
追求消息低延迟:RabbitMQ、Kafka
RabbitMQ安装我们同样基于Docker来安装Ra ...
JavaSTL
JavaSTLString定义:
1String s1="HelloWorld"
判断字符是否为空:
1System.out.println(s1.isEmpty());// False
获取字符串长度:
1System.out.println(s1.length()); 10
获取字符串中的某个字符:
1System.out.println(s1.charAT(0)); //H
将字符串转化为全大写或全小写:
12System.out.println(s1.toLowerCase()); //helloworldSystem.out.println(s1.toUpperCase()); //HELLOWORLD
去除字符串前后的空格:
1System.out.println(" hell o world ".trim()); //hell o world
比较字符串:
1s2 ="helloWorld";
1System.out.pringln(s1.equals(s2)); ...