3 FLUNGGG

尚未进行身份认证

我要认证

记录学习笔记和某些问题的解决。 主要是java,计算机理论基础等方面知识。 欢迎指错。

等级
TA的排名 5w+

HashMap源码详解

前言HashMap 是基于哈希表对 Map 接口的实现,增删改查的时间复杂度都可以看成是O(1)(平均地),性能很高,但是内存的消耗也很高。存储的是键值对,允许存储 key 为 null 和 value 为 null,但是一个 HashMap 中只有一个 key 为 null,可以有多个 value 为 null。哈希表有哈希函数,而且可能存在哈希碰撞/哈希冲突的问题。哈希函数:一种算法,可以让 key 映射到哈希表中的存储位置。哈希冲突:哈希表会让 key 通过一个哈希函数映射到哈希表中的某个位置

2020-08-26 22:28:03

[剑指 Offer] 35. 复杂链表的复制

题目leetcode 剑指 Offer 35. 复杂链表的复制提供的Node:static class Node { int val; Node next; Node random; public Node(int val) { this.val = val; this.next = null; this.random = null; }}题解解法一:用hashMap很简单,key为原节点,value

2020-08-13 21:50:59

SpringBoot集成ElasticSearch出现的异常

1. 异常在使用springboot2.2.8+elasticsearch6.8.10时,测试时报错:Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'elasticsearchClient' defined in class path resource [org/springframework/boot/autoconfigure/data/elastic

2020-08-08 20:37:05

设计模式:7大原则加例子

文章目录1. 前言2. UML类图2.1 泛化(Generalization)2.2 实现(Realization)2.3 依赖(Dependency)2.4 关联(Association)2.5 组合(Composite)2.6 聚合(Aggregation)3. 其他原则3.1 单一责任原则3.2 接口隔离原则3.3 依赖倒置(倒转)原则3.4 里氏替换原则3.5 开闭原则3.6 迪米特原则3.7 合成复用原则4. 总结5. 设计模式因为疫情回不了校,5月份打算学设计模式,《HeadFirst设计模

2020-08-05 00:06:37

设计模式:装饰者模式

文章目录1. 装饰者模式2. 实现3. Java中的装饰者模式4. 总结1. 装饰者模式装饰器模式(Decorator Pattern)允许向一个现有的对象动态地添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。什么意思呢?比如去吃火锅,我们会先选择一种汤底(假设是鸳鸯锅),然后选择食材(假设是牛肉,生菜)来搭配该汤底。本质上就是一个鸳鸯锅,而牛肉、生菜等食材是用来“装饰”该鸳鸯锅的,或者说这些食材用来扩展鸳鸯锅的功能(除非你是来喝汤的)。装饰器模式由为

2020-08-04 18:04:47

设计模式:适配模式与外观模式

文章目录1. 适配器模式2. 适配器模式的实现2.1 “对象”适配器2.2 “类”适配器3. 适配器模式总结4. 外观模式5. 外观模式的实现6. 外观模式的总结1. 适配器模式该模式容易理解,在现实中有种东西叫转换头,比如插座转换头(把三头插变成二头插的接口等),type转换头等。总之就是把一个接口转换成另一个接口,而适配器模式的作用也是一样,比如已有一个软件系统,现在希望跟一个新的厂商类库搭配使用,但是该新厂商设计的接口跟旧厂商设计的接口不同,如下:有一种方法就是去修改旧厂商的代码使得接口跟新厂

2020-08-04 18:01:46

设计模式:命令模式

1. 命令模式命令模式:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化。比如在餐厅,我们只需要在订单上勾选想吃的,而服务员只需要把这份订单交给厨师,服务员就是中介,他并不需要如何做菜;或者一个遥控器,遥控器不需要知道如何实现灯光的开关命令,只需要知道按“开”的按钮就开灯等。命令模式的组成:接收者、请求者、命令(如果想要扩展,那就定义成接口)。比如上面的餐厅:接收者是厨师、请求者是服务员、命令是订单、顾客是客户端。命令模式的类图:2. 实现假设制作一个简易遥控器,要求对灯光进行开

2020-08-04 17:58:17

模式模式:模板方法

1. 模板方法模板方法:在一个方法中定义一个算法的骨架(步骤),而将一些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。模板方法的类图:2. 实现假设有一家店卖咖啡和茶,对于咖啡的冲泡法有4个步骤:把水煮沸;咖啡滴过过滤器;倒进杯子;加糖。而茶的冲泡法也有4个步骤:把水煮沸;用沸水冲泡茶包;倒进杯子;加柠檬。现在来设计这两个类,从上面的步骤来分析两个类,第一个步骤和第三个步骤是一样的,而第二和第四个步骤是完全不同,如果设计一

2020-08-04 17:56:50

设计模式:观察者模式

1. 观察者模式观察者模式(Observer)是一种对象行为模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。比如关注某博主,当博主发布新文章时,就会通知你;在邮箱中也可以订阅某些文章,文章更新时会发邮件给你等。观察者模式又可称为发布-订阅模式(Publish/Subscribe)。观察者的结构由两部分组成,分别为Subject和Observer,UML图如下:2. 实现想来想去还是拿《HeadFirst设计模式》中观察者章节的气象监测

2020-08-04 17:51:21

设计模式:工厂模式

任何可以生产对象的方法或类,都可以称为工厂。单例模式也是一种工厂。1. 工厂模式(静态工厂模式/简单工厂模式)先来看看下面的例子:汉堡店卖汉堡假设目前有三种种类的汉堡:鸡腿汉堡、牛肉汉堡、鲜虾汉堡。可以使用一个通用接口:public abstract class Burger { String name; void machining() { System.out.println("制作" + this.name + "中"); } void b

2020-08-04 17:49:56

设计模式:策略模式

文章目录1. 引入2. 策略模式3. 实现4. 总结类图是以前画的,不是正规画法,目前在备战秋招没时间以后在该1. 引入先来看看一个例子:飞机大战public class Aircraft { /** * 切换攻击方式 */ public String attackMode(int change) { if(change == 1) { return "双弹攻击"; } else if(change ==

2020-08-04 17:48:19

设计模式:代理模式

文章目录1. 代理模式2. 静态代理3. 动态代理3. Cglib代理3.1 实现4. 代理模式的变体4.1 防火墙代理4.2 缓存代理4.3 远程代理4.4 同步代理1. 代理模式代理模式:为一个对象提供一个替身,以控制对这个对象(被代理)的访问。即通过代理对象访问目标对象。这样的好处是:可以在目标对象实现的基础上,增强额外的功能操作(符合开闭原则)。被代理的对象可以是远程对象、创建开销大的对象、需要安全控制的对象。代理有三种形式:静态代理、动态代理(可称JDK代理或接口代理)、Cglib代理(可

2020-08-04 12:04:30

设计模式:单例模式

文章目录1. 饿汉式2. 懒汉式3. 静态内部类方式4. 枚举形式5. 总结单例模式(Singleton Pattern),就是只有一个实例。如果一个全局使用的类频繁地创建和销毁,就可以考虑使用单例模式。实例只能由类本身来创建,不能被其他方式创建。单例模式的实现方式有很多种。1. 饿汉式我们常用的只创建一个对象的方法就是使用java的静态变量,类加载到内存后,就实例化一个单例,由JVM来保证线程安全。public class Main1 { private final stati

2020-08-04 11:02:40

Java多线程基础

文章目录1. 前言2. 程序,进程,线程3. 创建线程4. 线程的状态5. 线程的停止5.1 stop() 的问题5.2 destroy() 的问题5.3 使用标记来停止线程6. 线程的其他方法6.1 sleep()6.2 yield()6.3 join()6.4 线程名6.5 线程的优先级6.6 守护线程7. 线程同步7.1 引入7.3 同步概念7.3 使用同步7.4 改正例子8 死锁9. Lock锁10. 生产者与消费者11 线程池1. 前言多进程也就是多任务,比如边吃饭边玩手机,看起来好像做了两件

2020-08-04 00:34:54

[Leetcode] 141. 环形链表

题目141. 环形链表解题leetcode给出的方法参数只有ListNode,一开始我一直搞不懂这个pos要怎么接收??思路一:使用哈希表,让每一个节点做key,value记录每一个节点出现的次数。如果有一个节点出现两次说明有环。这里使用HashMap或者HasnSet都可以。 /** * 每次把哈希表中没有的结点添加到哈希表中。 * 如果是环,那么在尾结点的下一个结点肯定在哈希表中,此时就可以说明有环。 * 如果不是环,那么在尾结点的下一个结点就是nul

2020-08-03 22:55:02

[Leetcode] 234. 回文链表

题目:解法一: 还是跟上道题差不多,可以使用数组(可变数组),把链表的节点的值存入数组,然后使用双指针判断,一个从左到中间,另一个从右到中间。 public static boolean isPalindrome(ListNode head) { ArrayList<Integer> list = new ArrayList<>(); // 把链表的值复制到数组中 ListNode cur = head; w

2020-07-28 00:30:39

剑指 Offer 24. 反转链表

题目:暴力解法一:可以利用栈来做,先把每一个Node压入栈,再取出放入另一个新链表。 public ListNode reverseList(ListNode head) { if(head == null) { return null; } // 最好别去破坏原链表 ListNode cur = head; // 压入栈 Stack<ListNode> stack

2020-07-28 00:28:19

JavaWeb总结

文章目录1. JavaWeb 入门1.1 Web应用程序1.2 Web服务器1.3 Tomcat1.4 HTTP2. 什么是Servlet2.1 使用Servlet2.2 Servlet原理2.3 ServletContext2.3.1 共享数据2.3.2 获得初始化参数2.3.3 请求转发2.3.4 读取资源文件2.4 HttpServletResponse2.4.1 下载文件(了解)2.4.2 重定向2.5 HttpServletRequest3. Cookie,Session3.1 会话3.2 保存会

2020-07-15 20:40:28

数据结构:数组

文章目录1. 简介2. 二次封装数组2.1 添加操作2.2 查找操作2.3 修改操作2.4 删除3. 动态数组4. 时间复杂度4.1 普通数组4.2 动态数组1. 简介数组是最基本的数据结构,属于线性表。存储一个固定大小的相同类型元素的顺序集合。最大的优势就是支持随机访问,即知道索引就可以访问。但是数组的长度一旦声明就是固定死的。接下来来使用数组二次封装实现栈,队列。2. 二次封装数组二次封装来实现数组的增删改查。创建一个泛型类,其中有两个成员属性public class Array<

2020-07-02 17:35:12

软件开发搞定操作系统

文章目录1. 前言2. 操作系统的演进3. 操作系统相关概念4. 进程管理4.1 进程4.2 线程4.3 进程状态4.4 同步4.5 Linux进程5. 作业管理5.1 进程调度5.2 死锁6. 存储管理6.1 内存分配与回收6.2 内存回收6.3 内外碎片6.4 存储的管理6.4.1 页式存储管理6.4.2 段式存储管理6.4.3 段页式存储管理6.5 虚拟内存6.6 Linux存储管理6.6....

2020-04-22 12:13:16

查看更多

勋章 我的勋章
  • 签到新秀
    签到新秀
    累计签到获取,不积跬步,无以至千里,继续坚持!
  • 技术圈认证
    技术圈认证
    用户完成年度认证,即可获得
  • 阅读者勋章Lv1
    阅读者勋章Lv1
    授予在CSDN APP累计阅读博文达到3天的你,是你的坚持与努力,使你超越了昨天的自己。
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv4
    勤写标兵Lv4
    授予每个自然周发布9篇以上(包括9篇)原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。
  • 学习力
    学习力
    《原力计划【第二季】》第一期主题勋章 ,第一期活动已经结束啦,小伙伴们可以去参加第二期打卡挑战活动获取更多勋章哦。