自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 收藏
  • 关注

原创 HashMap存入一个键值对的中间发生了什么(浅读源码)

然后进入putValue方法,其中第一个参数是hash,进入hash()方法获得hash值,这里的hash()是每个类型不一样的,Integer的和String的都分别有各自的规则,Integer的就是对值进行与一个数异或,String的没考究。大概可以理解为,Map的方法中更多是针对键值对是,是整体的宏观的。Entry的方法则更多是单独针对键或者值的,比如getKey就是拿到一个key,getValue就是拿到一个value,他们都是独立的,没有方法是针对键值对进行操作的。也可以自定义为127内的数。

2023-02-26 11:08:46 508 1

原创 Spring Boot中使用@Autowired装配接口是怎么回事?

而上面展示的Spring Boot中使用@Autowired注解然后看似构建了一个”接口对象“,实际上只是Spring Boot内部隐藏了实现接口并创建匿名内部类的过程和样子,只留给你一个表象。UserMapper是一个接口,在另一个类中好像直接使用@Autowired装配了一个UserMapper对象?根据我对的Java基础知识的了解,接口和抽象类都只是描述了一个轮廓、实现,不能直接作为一个对象去实例化使用的,都需要具体的类去继承和实现。本质上也没有接口对象,倒是有实现接口的匿名内部类。

2023-02-19 17:21:19 1365

原创 初识Cookie和Session

即第一次验证登录成功后,服务器给浏览器一个Set-Cookie,然后浏览器根据这个Set-Cookie的内容设置好Cookie。出于安全考虑,浏览器不让网页直接操作文件系统,而Cookie就是一个折中的方案,可以让网页暂存一些数据在本地,不能存复杂的对象,只能存字符串。客户端发送HTTP请求都会带上之前存储的Cookie信息(在HTTP的Header的Cookie中),让服务器去分析之前干了啥。来源:服务器将想进行存储的信息,通过字符串键值对的方式放到HTTP响应的Set-Cookie中。

2023-02-18 23:10:56 380

原创 HTTP基础知识

HTTP是个应用层协议,是HTTP客户端和HTTP服务器之间的交互数据格式。所以这里有个实例:在浏览网页的时候,浏览器会向服务器发送一个HTTP请求,告诉服务器我想访问什么..然后服务器会根据请求计算出HTTP响应(一般不止一个)让浏览器接收,里面包括了CSS、JS、HTML等信息。通过浏览器的开发者工具Network栏可以监视到相关的http信息。

2023-02-18 21:59:20 727

原创 MyBatis无法通过getGenerateKeys获得自增主键的问题

设置了属性的自增后想通过getGenerateKeys获得MySQL对应表单中自增主键id,检查了类、映射器、xml都没有发现问题,但是进行单元测试的时候始终无法获得自增的id。debug发现执行完最后一局sout代码后,articleInfo对象的id已经是改变了的!但是打印不出相应的结果,所以问题并不出在配置上,而是出现在getId上。这意味着方法还没开始我就先打印了...确实是个比较愚蠢的问题。我遇到这个问题的法伤原因比较蠢,查阅了网上相关经验都没有能够解决。文章类代码如下,设置了几个属性。

2023-02-13 11:23:44 556

原创 环境变量导致spring.profiles.active设置不生效问题

我的根配置文件中并没有修改server.port,然后在prod中设置了新的prod,并且使用spring.profiles.active选择了prod环境,按道理服务器开启的端口应该是prod中设置的端口。大家假如遇到了相同问题,可以先看看日志中是否显示profile is active: "default",假如是的话可以检查一下启动文件的环境变量,可能可以解决问题。最终在控制台的日志中发现,active的profile始终被设置成了default,也就是8080端口。看看这个经验能否帮助到你。

2023-02-12 16:50:48 3046

原创 【JavaEE】如何开始基础的Servlet编程(基于Tomcat服务器)

知道了如何借助Tomcat开始进行最简单的Servlet编程后,我们就可以进一步完善功能制作一个基础的网站了。在此之前我们先了解一下Servlet的声明周期。

2023-01-24 18:33:27 1232

原创 【JavaEE】如何开始最简单的Servlet编程(基于Tomcat服务器)

Servlet是个接口,实现这个接口的类可以用来响应请求。

2023-01-18 11:24:58 573

原创 【JavaSE】String相关知识

两个字符串常量池对象,两个String对象,一个StringBuilder对象(字符串相加是通过StringBuilder的append实现的),一个String对象(字符串相加结束后,由StringBuilder的toString返回一个String对象)。String的值是不可变的,使用“+”或者“=”的方法尝试改变String的值并不是在原本的基础上修改,而是赋值给了新的字符串常量引用。a、b都指向同一个常量池对象“a”,使用“==”比较的时候比较引用对象的地址都是“a”所在的堆地址。

2023-01-11 22:12:06 364

原创 白话初识UDP协议

注:对服务器而言,传入PORT就是告诉Socket从这个端口接收数据。对客户端而言,不需要告诉Socket从哪里接收数据,但是需要告诉Socket把数据送去哪个端口,所以把SocketAddress给写入了packet中,由packet去告诉Socket往哪个端口送数据。因为有了16bits的UDP长度限制,所以就是限制了数据的内容不能超过16bits,也就是64KB的大小,假如有更大的数据就只能拆成多个数据报来传输,这个过程可能会出现数据丢失等问题。所以发送数据的大小受限是UDP协议的一个缺点。

2022-12-29 19:51:20 302 9

原创 【JavaEE】网络初识

而一个进程能同时打开的文件有限(文献描述符表有上限),所以对于会创建很多的socket,就需要对不再使用的socket进行关闭,防止持续消耗文件描述符表。客户端:读取用户请求 -> 创建数据报并将请求写入 -> 创建数据报套接字并将数据报传给服务器 -> 通过数据报套接字从客户端获取响应的数据报 -> 解析响应 -> 反馈给用户。服务器:创建数据报套接字并获取来自客户端的数据报 -> 解析数据报并处理相关请求 -> 将处理结果打包进数据报 -> 通过数据报套接字传回给客户端。无连接反之,如发短信。

2022-12-21 09:41:26 221

原创 Java线程

NEW (初始): 创建线程后, 还没开始工作运行, 就是NEW状态RUNNABLE (运行): 运行中, 就是RUNNABLE (又可分成正在运行和即将开始运行)TIMED_WAITING (超时等待)WAITING (等待)BLOCKED (阻塞): 都表示排队等待TERMINATED (终止): 表示工作完成运行结束图中的箭头清晰的表示了几种可以来回切换的状态, 如WAITING和RUNNABLE之间可以通过wait和notify等切换没有双向箭头的就表示不能来回切换!!比如RUNNABLE和TERM

2022-12-03 14:24:16 87

原创 设计模式之单例模式

但是"懒汉模式就不一样了", 首先上面这种写法, 一方面是有获取比较的过程, 一方面是有创建实例的过程(既涉及读也涉及写), 这一波操作都不是原子的, 所以可能会在多个线程同时调用getter方法时候出现冲突, 导致创建多个实例, 破坏了单例模式的规则.在一个线程调用getter的时候, 直接对类对象加锁, 就不会发生两个线程同时实例化的结果, 这样确实保证了线程安全. 但是也出现了新的问题, 就是导致调用getter的时候都需要进行一次加锁开锁的操作.就创建好了单例的实例, 就是"饿汉模式"的例子.

2022-12-02 19:04:30 84

原创 JavaEE基础

结果是run后面的sout语句一直没有被执行, 因为直接调用run没有创建新线程, 只是在main线程里执行了run方法, run方法又是一个死循环, 相当于run语句没有执行不会结束, 所以sout不会被执行.所以说每个线程创建并开启(start方法 == 启动线程)后都会自动调用run方法, 这个run方法可以是Runnable方法里的也可以是Thread类里的. 所以说lambda表达式默认是在重写run方法?, 之后的run语句都是在新线程中执行, 不影响main线程后面的语句执行.

2022-12-02 11:08:16 186

原创 Java线程池

因为实际开发中我们面对的任务是多样的, 比如有的可能是CPU密集(频繁在CPU中运算), 有的是IO密集(频繁从外部硬件中读写数据), 就拿这两种情况来说, 假如是CPU密集的, 线程数目比较要紧, 但是线程也是有上限的. 假如是IO密集的, 线程数目对任务的操作影响就小很多, 因为IO操作不大会设计CPU运算, 线程数再多可能也没什么区别.threadFactory是用于描述线程如何创建的, 这个对象负责创建线程, 程序员也可以自己去定义线程创建的策略。这个比较要紧, 里面包含的是。答案是无法直接确定!

2022-11-29 22:37:37 122

原创 内存可见性问题 \ volatile关键字 \ JMM的工作内存

硬件的速度比较: CPU( > 缓存) > 内存 > 硬盘. 每个层级都差了3~4个数量级. 所以假设有一个程序需要频繁地在内存中读取数据, 但是这个数据本身又没有改变, 就相当于重复读取内存的相同数据, 导致效率很低. 编译器可能会自动优化成将该数据暂时保存在CPU中防止重复内存读取, 加快执行效率. 但是此时假如中间穿插了一个修改内存中该数据的操作, 就会导致与CPU中的数据有出入, 导致程序执行出错. 如解决方法: 使用volatile关键字, 告诉编译器这里不要进行优化, 数据可能会随时改动.

2022-11-15 16:08:09 146

原创 MySQL基础

因为AVG需要算的是男的并且salary > 10000的, 需要再group by 前就筛选好参与聚合查询的数据,而非先group by depart 然后再having.使用group by进行聚合查询时候可以使用条件where也可以使用having, 两者的区别是一个是分组前过滤, 一个是分组后过滤。特点: 对查询字符用的比较多, 查询数字的话用between...and或者比较符会高效的多。, 依赖通配符. '%'可以表示任意个字符, '_'可以表示一个任意字符.后相加, 若强转失败就会报错。

2022-11-07 13:12:23 219

原创 Java常见线程安全问题的产生及对应解决方法

我们使用多线程通常是为了提高程序执行效率, 充分调度处理器性能. 但是由于多线程的种种特性,使得假如使用不当可能会导致程序执行结果偏离我们的预期, 这就是线程不安全. 下面就列举一些常见的问题产生原因和解决办法.

2022-10-29 22:23:27 185

原创 牛客_手套问题

对非含0列: 求和看哪一行的和更小, 和更小的一行除了数目最小的全拿, 比如下面的情况就是, left数组的非零列和较小, 那么对left数组就拿6和4(最坏拿取情况), 对最小的数2就只拿一个,. right就只拿一个就行, 因为left保证了每个颜色都有, 所以right随便拿一个都一定能与left配对成功.对含0列: 非0值直接纳入结果, 原因是。, 相当于是最坏情况.

2022-10-27 00:03:02 125

原创 【Java数据结构】排序算法

我们来看看希尔排序和直接插入排序在十万个有序数据和十万个无序数据条件下的效率对比:输出如下:可以看到数据无序时候,两者差距非常明显,而数据有序时,虽然希尔排序也很快,但是直接插入排序更胜一筹。可以对应实际情况综合考虑使用。

2022-10-26 14:02:23 166

原创 Thread类的基本使用

Thread表示线程, 也是Java中自带的一个类, 主要用于开辟新线程。

2022-10-26 13:59:25 281

原创 【Java数据结构】泛型

同样是钱,所以把钱的属性赋给美元和人民币都不会有错误,所以可以赋值。而读取(get)数据时候,有可能会有赋值操作,如get人民币对象赋值给钱,就会导致向上转型,会出错。(第一种使用泛型的方法)是什么道理?因为写入数据需要知道具体的类是什么,比如同样是钱,美元不能直接赋值给人民币。如,表示T一定是Number的子类。通配符的上界不能写入数据(不能set),只能读取数据(只能get)基本类型直接用== >

2022-10-24 10:42:45 323

原创 【Java】图书管理系统

2.这里的this什么意思?this表示调用该方法的对象,调用该方法的对象是一个User,User有实现接口吗?方法不能存在于数组中,如果想使用数组的不同下标去调用不同的方法,只能定义一个类,然后对方法进行继承重写。注意:同时又字符串和其他数据类型输入的时候,最好字符串先输入,不然可能会出现其他类型输入完后的回车被字符串输入函数读取,导致字符串没法正常输入的情况。3.iOperation数组的内容也是在具体的User中才初始化的,所以可以。假如是,这样就可以直接通过数组的形式,调用子类重写的work方法。

2022-10-24 10:41:12 101

原创 【Java语法】基础查漏补缺

形参确实传的是原来的地址,但是nums = Arrays.copyOf之后相当于引用改变了指向,而原来指向的那一块空间还是没有改变, 但是我改变了指向不就好了吗?原来的nums是在main函数的栈帧中的, 并且指向堆中的一块空间, 改变引用的指向后, 指向了一块有完整元素的堆空间, 好像没什么问题啊。第三步:是传入的obj是否是比较对象类的子类,是的话进行强制转换(向下转型),然后再比较对象。9.子类继承了父类的属性,自己也有新的属性,然后使用父类的构造方法初始化的时候会出现问题.

2022-10-24 10:40:35 640

原创 【JavaSE】接口

实现了Comparable接口,并且重写了compareTo方法后,类就能纳入Arrays.sort()的比较范围。接口的成员属性都是默认用publicstaticfinal修饰的是常量。接口同样不能实例化,所以不存在静态代码块、实例代码块、构造方法。重写compareTo方法,Comparable接口的成员方法默认都是publicabstract修饰的。接口的方法可以有内容,有内容时候要用default修饰。接口implements的类也可以发生向上转型。Comparable接口。.........

2022-10-24 10:40:14 78

原创 【Java】继承和多态

特别的,对protected访问权限,不同包的子类进行成员访问时,也是通过super.,因为本质上也是访问父类。一个类的两个方法,有相同的名称,不相同的方法签名,则称为重载。写子类的构造方法时 一点要先用super()调用父类的构造方法(写在第一行) 再进行子类构造方法的编写。将实例化的子类对象赋值给父类的引用后,引用子类重写的方法,就会形成动态绑定。不能在静态的方法中使用super,因为super和this一样,是依赖对象的。同名时候使用this,调用的是子类的成员(和内外部类相同有自己优先的原则)

2022-10-24 10:39:04 73

原创 【Java】异常

Error和Exception的区别在于,Error是JVM不可处理的,属于严重问题,如StackOverflowError、OutOfMemoryError。自定义的异常是一个类,将自定义的类继承exception方法,然后加上构造方法等就可以调用父类的各种方法如printStackTrace。catch是接收try执行时候抛出的异常,接收到了就执行catch里的代码。catch中的一条语句抛出异常后,catch中之后的语句不会被执行。编译异常,是必须处理的(需要用throws声明)

2022-10-24 10:38:44 50

原创 Java字符串相关问题

这里没有重写的toString方法, 相当于括号里只进行的是字符串相加操作, 所以先要得到所有加数, 所以先调用了test.add方法, 所以finally语句块优先执行了, 而非直接先打印"和是:"

2022-10-24 10:29:18 87

原创 笔试强训做题笔记

2.假如不是, 那后面的catch中写的是前面的exception的父类exception, 那后面还会被catch吗。虽然他们不需要额外的空间复杂度, 但是也需要将所有的数据放进去,内存小不就放不进去了?可以的,因为static不依赖对象,所以即使子类没有指向对象,也可以引用父类的static方法。D选项,虽然method看似重载, 多了一个abstract, 重载抽象方法是被允许的吗?修饰interface里的方法:不能是final,private,protected。这个方法的区间是左闭右开的!

2022-10-24 09:58:12 326

原创 笔试编程题

一个left从前找素数, 一个right从后找素数, 找到以后left和right就相加看看是否等于偶数n, 相等就记录下当前的left和right值, 然后left和right都+=2, 知道left >= right;3.上下同为1, 若还是使用异或, 结果变成0,与期望不相符合, 想办法弥补了这点就好了. 研究发现, 1+1的结果应该是10,相当于按位与后左移一位。把每个点都当作是一个出发点, 若该点坐标为(m,n), 该点出发的方案数是(m-1,n)的方案数和(m,n-1)的方案数的和.

2022-10-24 09:40:23 316

原创 克隆Gitee在线仓库到本地并连接IDEA的方法

然后就Clone成功了, 随后的add. commit. push操作都可以正常实现。假如要输入密码就输入Gitee的账号密码即可。, 选择存放目录, 点击Clone。获取创建好的线上仓库URL。

2022-10-23 19:27:55 1115

原创 线程和进程

多个CPU核心同时一起运行多个进程就是并发执行, 一个CPU核心快速轮流运行多个进程就是并发执行, 而并发编程的含义其实是并发执行和并行执行都有的, 只是统称并发。统计每个进程再CPU上执行了多久, 衡量参数是执行的指令条数. 对执行的少的(进程优先级低的)进程多分配, 防止其完全不被执行。. 因为要被执行的进程很多, 所以CPU肯定需要切换进程, 这过程中就有对数据的读档和存档操作, 操作的就是上下文。. 有的用来存放数据, 有的用来维护运行状态, 有的用来存指令, 和给进程分配的内存空间息息相关。

2022-10-23 11:25:23 321

原创 【Java】类和对象

对上面这个代码,在identify1方法的执行中,出现了形参和成员变量同名的情况,这个时候调用方法,会不清楚到底是谁赋值给谁。成员变量是被赋有初始值的,一般是null,0,'\u0000'(Unicode字符的0),false,看成员变量的类型。对于private的成员变量,初始化方法有两种,一种是直接就地初始化,一种是通过构造方法初始化(Alt+Insert->Constructor)。this其实是调用了下面的构造方法,没有下面的就没法用this,那this的存在意义是什么...............

2022-07-25 18:07:41 104

原创 【Java】方法、数组

fun方法的传值是引用变量arr,执行时也是对arr进行操作,为什么最后输出的数据没有改变?表示的是引用变量arr1指向了引用变量arr指向的对象。中真实地址的哈希值,所以打印简单变量得到的是简单变量的值而直接打印引用变量得到的是地址。常用的有五块内存,Java虚拟机栈、本地方法栈、堆、方法区、程序计数器。在多线程的环境下,每个线程的本地方法栈、程序计数器和方法区都是。引用变量的初值应该是null,代表不指向任何对象,不能是0。中,引用变量也存储再栈帧中,但是引用变量存储的内容是引用指向的对象在。.....

2022-07-24 12:11:34 78

原创 【JavaSE】运算符

结果直接输出false,而没有报错说1/0运算错误,是因为3

2022-07-23 10:35:21 623

原创 【C语言】文件操作

每一个文件的内容不尽相同,但是类型是有限个的,所以系统声明了一个FILE的结构体变量,通过特定函数读写文件时候,数据文件里的一些信息会被存储到FILE结构体当中,该结构体我我们通常用一个结构体指针去维护。若之前没有要打开的文件,"w"会新建一个,若之前就存在了要打开的文件(名),"w"操作会把之前的文件的内容直接清空。若是"rb"就是打开二进制文件进行只读,"rb+"就是对二进制文件进行读写,以此类推。函数参数一个是被打开的文件名,一个是文件的使用方式。文件的顺序读写和文件使用方式一样需要依赖一些函数。..

2022-07-17 10:49:06 606

原创 【C语言】动态内存管理

动态内存分配存在的原因:节省内存空间内存空间布局如图

2022-07-10 11:21:27 233

原创 【C语言】结构体 / 枚举 / 联合

# 结构体初阶结构体声明struct tag{ member-list;}variable-list; //分号不能丢tag = 标签membe-list = 成员列表variable-list = 变量列表struct Man{ int age = 0; char Name[20] = {0}; int dicksize = 0;}Justin, Bieber;int main(){ struct Man Justin;

2022-07-10 10:21:29 156

原创 【C语言】试题

①统计单词的平均长度输入:若干个单词,每个单词的前后都有若干个空格隔开输出:单词的平均长度,保留到小数点后两位解题思路如下:第一步:解决空格+单词共同输入的问题;既然每个单词都可能前后有若干空格如何判断输入停止?用gets()进行输入即可,gets()表示的是一行的输入,遇到回车就结束第二步:解决计算单词个数问题;用多重判断条件就好了,前面是空格后面不是空格单词数+1int main() { char arr[1000] = { 0 }; int i = 0; gets(

2022-04-26 23:45:08 1743

原创 一些题目的非常规解法

①给定一个非空整数数组 每个元素都出现两次 找出那个只出现一次的数方法:把数组所有元素按位异或 最终的结果就是只出现一次的数原理:按位异或满足交换律(证明就是数学问题了) public static int check (int[] arr) { int ret = 0; for (int i = 0; i < arr.length; i++) { ret ^= arr[i]; } return

2022-04-15 16:29:51 179

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除