自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

向日葵班学霸的博客

我在夜间,张开翅膀,努力飞行。

  • 博客(44)
  • 资源 (3)
  • 收藏
  • 关注

原创 8、合并两个有序的单链表

步骤1、同时遍历两个链表,并取出节点作比较,根据不同的情况生成新的链表2、若有链表为空,则直接遍历另一个链表即可public class CombineLinked { private static Node head1; private static Node tail1; private static Node head2; private stat...

2020-02-26 13:18:07 223

原创 7、删除单链表倒数第n个节点

步骤1、假设链表长度为len,删除倒数第n个节点,那么节点的正数位置为:pos = len-n+12、所以可以用快慢指针,快指针先走n步,然后快慢指针一起移动,直到快指针为null,那么此时,慢指针走的步数为:len-n+1,也就是要删除的节点位置:public class DeleteOneNode { private static Node head; private...

2020-02-25 22:02:09 269

原创 6、通过数组创建单链表,并反转单链表

步骤1、尾部插入法创建链表2、自定义上一个节点、当前节点、下一个节点,遍历反转链表,主要是把当前节点的下一个节点设置为当前节点的上一个节点;public class ReverseLinkd { private static Node head; private static Node tail; public static void main(String[...

2020-02-16 01:20:45 564

原创 5、通过单链表判断数组存储的数据是否为回文

思路:1、通过快慢指针找到链表中间点;2、在快慢指针找中点过程中,通过头部插入法,把慢指针遍历的链表节点反转保存,生成新的链表,并根据链表长度的奇偶性分别处理;3、遍历反转后的链表和原链表,比较并判断是否为回文;public class HuiWen { //定义一个链表,存储需要判断的字符串,节点添加到尾部 private static Node head; ...

2020-02-15 17:12:21 208

原创 Java高并发(六):ReentrantLock

目录LockReentrantLockReentrantReadWriteLockStampedLockReentrantLockReentrantLock实现原理AQSLockJava中的Lock是J.U.C中的一个核心组件,J.U.C(java.util.concurrent)是在并发编程中常用的工具类,里面包含了很多在并发场景中使用的组件,比如线程池、阻塞队列、计时器、同步器、并发集合...

2020-02-06 12:50:42 225

原创 Java高并发(五):synchronized

目录synchronizedsynchronized

2020-01-22 16:16:25 183

原创 Java高并发(四):volatile

目录volatilevolatile如何保证可见性可见性本质硬件层面volatilevolatile主要是为了保证在多处理器下,共享变量的可见性。可见性在单线程的环境下不会出现问题;但是对于多线程,读写位于不同的线程中时,可能会发生线程读取到的数据不是其他线程写入的最新的值。然而volatile可以解决线程的可见性带来的问题volatile如何保证可见性当成员变量被volatil...

2020-01-21 14:24:31 307

原创 Java高并发(三):线程的基本使用和线程的状态

目录线程的应用继承Thread类实现Runnable接口实现Callable线程的生命周期NEWRUNNABLEBLOCKED1、等待阻塞2、同步阻塞3、其他阻塞TIME_WAITINGTERMINATED线程的启动原理线程的应用在Java中,有多种方式来实现多线程,比如继承Thread类,实现Runnable接口,使用ExecutorService、Future、Callable实现带返回...

2020-01-20 16:42:18 97

原创 设计模式十三:观察者模式

目录观察者模式代码示例观察者模式观察者模式(Observer Pattern)定义了对象之间一对多的依赖,让多个观察者对象同时监听一个主题对象,当主题对象发生变化时,它的所有观察者都会受到消息并作出更新,观察者模式属于行为型设计模式。观察者模式有时也被称为发布订阅模式。代码示例以消息通知为例,定义一个主题,也就是被观察者:public class Theme extends O...

2020-01-12 22:53:59 91

原创 设计模式十二:装饰者模式

目录装饰者模式代码示例装饰者模式装饰者模式(Decorator Pattern)是指在不改变原有对象的基础上,将功能附加到对象上,实现对原有对象功能的扩展,比继承更加灵活。装饰者模式属于结构型设计模式。装饰者模式的适用场景:1、用于扩展一个类的功能或给一个类添加附加功能2、动态的给一个类添加功能,同时这些功能可以动态的取消装饰者模式优点:1、比继承更加灵活,可以在不改变原有对象的基...

2020-01-12 21:41:31 103

原创 设计模式十一:适配器模式

目录适配器模式代码示例适配器模式适配器模式(Adapter Pattern)是指将一个类的接口转换为客所期望的另一个接口,使原来不兼容的接口类可以一块工作,属于结构型设计模式。适配器模式适用的业务场景:1、类已经存在,但是它的方法和需求不匹配(方法和结果相似或相同);2、随着产品的维护,由于不同产品或者商家造成功能类似但是接口不同的情况而采取的方案适配器模式优点:1、提高类的透明性...

2020-01-12 20:56:38 109

原创 设计模式十:模板模式

目录模板模式代码示例模板模式模板模式通常又被称为模板方法模式(Template Method Pattern),是指定义一个算法的骨架,并允许子类为一个或多个步骤提供实现。模板模式属于行为型设计模式。模板模式使用场景:一次性实现一个算法不变的部分,并将可变的行为留给子类来实现;子类中公共的行为被提取出来,并集中到一个公共的父类,避免了代码的重复。模板模式优点:提高代码的复用性和扩展性,符...

2020-01-12 17:25:38 160

原创 设计模式九:策略模式

目录策略模式代码示例策略模式策略模式(Strategy Pattern)是指定义了算法家族,分别封装起来,让它们之间可以相互替换。此模式让算法的变化不会影响到使用算法的用户。策略模式可以避免多分支的if…else…和switch语句策略模式的使用场景:一个系统需要动态的从几个算法中选择一种;或者一个系统中有很多类,而他们之间的区别仅仅在于行为不同。策略模式优点:符合开闭原则、避免大量的i...

2020-01-12 16:28:52 143

原创 设计模式八:委派模式

目录委派模式委派模式委派模式(Delegate Pattern)的基本作用就是负责任务的调度和分配,委派模式和代理模式很相似,委派模式可以看做是一种特殊情况下的静态代理的全权代理,但是,代理模式注重的是过程,委派模式注重的是结果,委派模式属于行为型模式。委派模式在Spring中应用十分广泛,比如DispatcherServlet就用到了委派模式,现在以生活中的实际场景为例,比如boss给l...

2020-01-12 14:48:05 119

原创 设计模式七:动态代理

目录动态代理JDK实现方式CGLib实现方式JDK和CGLib动态代理动态代理的思想其实是和静态代理是一致的,不过,动态代理的功能更加强大。随着业务的扩展,动态代理的适应性更强。动态代理有JDK和CGLib两种实现方式,我们分别来看一下:JDK实现方式还是以找对象为例,这次不是定义父母类,而是定义一个专业的婚介(媒婆):public class JDKMeiPo implemen...

2020-01-12 13:53:21 97

原创 设计模式六:静态代理

目录代理模式静态代理代理模式代理模式是指为其他对象提供一种代理,以控制对这个对象的访问,代理对象在客户端和目标对象之间起到了中介的作用,代理模式属于结构型设计模式,起到了对目标对象的保护和增强的作用。静态代理以当前社会状况为例,很多人都到了适婚年龄但是还不找对象,所以父母就展开行动为自己的子女寻找合适的对象,那么这个过程中,父母就可以看作是对子女的一种代理,代码如下:首先定义一个P...

2020-01-12 10:36:30 105

原创 设计模式五:原型模式

目录原型模式浅克隆深克隆原型模式原型模式是指:原型实例制定穿件对象的种类,并且通过拷贝这些原型创建新的对象。原型模式的适用场景:1、类初始化消耗资源较多2、new产生一个对象需要非常繁琐的过程(访问权限、数据准备等)3、构造函数比较复杂4、循环体中产生大量对象时浅克隆先写一个简单的示例,这里通过实现Cloneable的方式,代码如下,先创建一个实体类作为原型:@Gett...

2020-01-12 09:59:12 161

原创 Spring一:通过gradle构建Spring源码

目录1、源码下载:2、gradle3、编译Spring源码4、导入idea5、需要避免的一些坑1、源码下载:源码下载地址Spring5.0.2,下载好后解压,在根目录找到build.gradle文件打开,可以找到这段:可以看到要求的gradle版本是4.3.1。2、gradle输入地址gradle4.3.1,下载好后解压缩配置环境变量,新建GRADLE_HOME系统变量,值为gr...

2020-01-11 22:39:38 502

原创 设计模式四:单例模式

目录概述:1、饿汉式单例1.1、饿汉式单例2、懒汉式单例2.1、懒汉式单例2.2、双重校验锁2.3、静态内部类3、注册式单例3.1、枚举4、反射破坏单例4.1、反射破坏单例5、序列化破坏单例5.1、序列化破坏单例概述:单例模式是指确保任何一个类在任何情况下都绝对只有一个实例对象,拥有私有的构造方法,并提供一个全局访问点,主要适用场景:ServletContext、ServletConfig、...

2020-01-05 18:17:06 133

原创 4、利用数组实现LRU 缓存淘汰策略

常见的策略有三种:先进先出策略 FIFO(First In,First Out)、最少使用策略 LFU(Least Frequently Used)、最近最少使用策略 LRU(Least Recently Used)。使用链表实现LRU算法的方式很多,现在用数组也实现一下,话不多说上代码:public class LRU { private static String[] lruA...

2020-01-03 15:29:37 1378

原创 设计模式三:工厂模式

目录1、简单工厂模式2.工厂方法模式3.抽象工厂方法1、简单工厂模式简单工厂就像它自己的名字一样,逻辑比较简单,类的创建和使用是分开的,我们以生产牛奶为例,首先创建一个牛奶的接口:public interface IMilk { void productMilk();}我们需要苹果味的牛奶,那么就创建一个苹果牛奶的类:public class AppleMilk i...

2020-01-02 22:00:16 109

原创 设计模式二:七大设计原则(下)

目录4.接口隔离原则4.接口隔离原则

2020-01-02 21:10:24 132 1

原创 设计模式一:七大设计原则(上)

为何要有设计模式,其实就是对前人代码经验的一种总结。七大设计原则包括:开闭原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特法则、里氏替换原则、合成复用原则。1、开闭原则开闭原则(Open-Closed Principle,OCP)是指一个软件实体(比如类、模块、函数等)对外界扩展开放,对于自身的修改关闭。顾名思义,开闭针对的是扩展和修改两个行为。重点思想是使用抽象构建框架,使用实现扩...

2020-01-01 23:39:47 168

原创 Java基础七:关于虚拟机的基本知识(二)

怎样确定一个对象为垃圾?判断一个对象是否是垃圾,分为两种方法:引用计数法和可达性分析算法引用计数法:当有一个地方引用它,则计数器加一;引用失效就减一,当计数器为0时,表示不会被使用,那么就是垃圾。这个算法性能其实很高,但是它有一个致命的缺点就是Java里有相互引用,那么这总算法就没法正确判断是否是垃圾。可达性分析算法:以GC Roots的根对象作为起始节点,根据引用关系向下搜索,搜索所走...

2019-12-29 23:30:17 166

原创 Java基础六:关于虚拟机的基本知识(一)

简述JDK、JRE和JVM之间的关系JDK(Java Development Kit),是用于支持Java程序开发的最小环境,基本上Java程序设计语言、Java虚拟机、Java API类库这三部分组成了JDKJRE(Java Runtime Enviroment),是支持Java程序运行的标准环境,Java API类库中的Java SE API自己和Java虚拟机这两部分组成了JREJa...

2019-12-29 23:25:33 310

原创 两个线程交替打印

两个线程交替打印使用ReentrantLock实现两个线程交替打印使用ReentrantLock实现两个线程交替打印package com.study.pattern;import java.util.concurrent.CountDownLatch;import java.util.concurrent.locks.Condition;import java.util.concur...

2019-12-23 14:11:18 405

原创 Java基础五:LinkedList

概述LinkedList是基于双向链表的非线性安全的一种线性的数据存储结构,由于这一特性,LinkedList还可以用作栈、队列或双端队列,LinkedList中的元素可以为空、可以重复同时又是有序的。既然是基于双向链表,那么每个元素都存储了指向前一个或者后一个元素的指针域,所以可以通过任意一个元素,通过向前或者向后寻址的方式去查找到前一个元素或者后一个元素。而且,头部和尾部中也通过指针域来...

2019-12-01 16:15:40 188

原创 Java基础四:ArrayList

概述ArrayList是一个以动态数组为基础实现的非线程安全的集合,ArrayList的元素可以为空、可以重复,同时又是有序的(读取和存放的顺序一致 )。ArrayList继承AbstractList,实现了List、RandomAccess(可以快速访问)、Cloneable(可以被克隆)、java.io.Serializable(支持序列化),下面是源码片段:初始化ArrayLi...

2019-11-23 15:59:52 269

原创 Java基础三:集合概述

集合概述集合新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入集合集合是Java中的一种容器类,它的主要作用是...

2019-11-21 23:31:18 120

原创 日期工具类

提供一个日期工具类,获取各种需要的日期,包括昨天今天、本周第一天本月第一天等,方法上都有注释,以下是示例代码:/** * 日期工具类 */public class DateUtils { /** * 获取今天 * @return String * */ public static String getToday(){ re...

2019-11-19 11:09:21 67

原创 前端转日期格式

后端的日期一般是定义为Date类型的,前端接收到以后,直接在页面显示的话,会出现问题(格式不对),现在就写一个function来转化一下:export function getNowDateTime (dateStr) { // 获取当前日期 var date = new Date(dateStr) var seperator1 = '-' var year = date.getFu...

2019-11-19 11:08:14 309

原创 3、给定一个数组和一个数字,从数组中找到两个元素,这两个元素的和等于给定的数字

给定一个数组和一个数字,从数组中找到两个元素,这两个元素的和等于给定的数字要求返回两个元素的下角标,比如a[1,3,5,7]和数字6,返回index1= 1,index2 = 3public static int[] sum(int nums[],int tarNum){ //首先使用哈希map,存储数组的元素和该元素对应的下角标 HashMap<I...

2019-11-13 23:44:26 599

原创 2、返回无序数组中连续元素的长度

给定一个无序数组,返回连续的元素中最长的长度,比如数组a[7,6,8,1,2,2,5],返回4,并且要求复杂度为O(n)这个时候如果不考虑复杂度,那么就很好解决了,先排序再求长度,考虑到复杂度,就不能排序了,可以使用哈希表来帮助我们完成这个运算,代码如下:public static int getConsecutive(int nums[]){ //首先通过哈希表,把...

2019-11-12 23:41:55 957

原创 1、有序数组中元素只能出现一次

给定一个有序数组,通过代码处理,最后数组中元素最多出现一次,并返回处理后数组的长度,比如[1,1,1,2,2,3,3,3],处理后为:[1,2,3],返回长度为:3class test{ public int arrayLength(int[] arr){ if(arr.length == 0){ return 0; ...

2019-10-31 23:04:33 345

原创 Java高并发(二):Java内存模型(多核CPU)

Java内存模型(JMM:Java memory model): 首先思考这样一个问题:有一个变量M = 2,线程A中执行:M= 3;现在,如何让线程B看到M = 3呢? 对于单线程的程序,无需考虑这样一个问题,因为B是在A执行操作之后才去读取M的值,肯定能看到M = 3,但是对于多线程的程序,线程B读取到的M值可能为2,为什么会出现这种现象呢,我们先分析下操作流程: 1、线程...

2019-10-24 00:20:51 296

原创 Java基础二:异常

异常是指阻止当前方法或作用域继续执行的问题,也就是程序执行中发生的不正常行为(逻辑错误和语法错误不是异常)。 在编程中,发现错误的理想实际是在编译阶段,但是在编译期间并不能找出所有的错误,剩下的问题必须在运行期间解决,这就需要Exception来正确处理这个问题。Java中的异常事件可以分为Error和Exception两类(Error和Exception都继承了Throwable类...

2019-10-16 00:03:57 106

原创 Java基础一:抽象+封装、继承、多态

Java是一门面向对象编程的语言,就是常见的OOP(Object-oriented Programming),不止Java,其他的很多编程语言都是使用的OOP这种编程思想。 抽象:Java提供了抽象机制。抽象就是指程序员把需要解决的问题视为一个对象,并抽取待解决问题的任何概念化构件(人、猫、狗),并表示为程序中的对象。这种抽象的过程,把我们需要解决的问题,变得更加形象和简单。 另外...

2019-10-15 00:05:27 204

原创 基于netty的多人多聊天室

上篇文章已经详细介绍了如何基于netty搭建一个多人单聊天室(https://blog.csdn.net/baidu_37147070/article/details/99131686),那么怎么建一个多人多聊天室呢? 其实,实现的方法并不难,我是借助使用redis来实现的,我们从代码中可以知道,对于每个聊天的channel,是通过ChannelGroup来管理的,也就是每个进来的通道,...

2019-08-18 13:24:40 1656 10

原创 基于netty的多人单聊天室

最近正好公司需要做一个聊天室的功能,所以就选择用netty做一个聊天室,觉得蛮有意思的,netty是一个非常优秀的框架,在之后的文章中会整理出有关netty学习的文章。 项目要求做的是多人多个聊天室,目前大多数项目中需要的是多人多聊天室,我是采用的redis实现的多聊天室,万事都要循序渐进,这篇文章先分享一下多人单聊天室的功能实现,后续的文章中会分享多人多聊天室的功能实现。项目使...

2019-08-11 01:02:45 663

原创 JDK1.8以后的hashmap为什么在链表长度为8的时候变为红黑树

在JDK1.8以及以后的版本中,hashmap的底层结构,由原来单纯的的数组+链表,更改为链表长度为8时,开始由链表转换为红黑树,为何大刀阔斧的对hashmap采取这个改变呢,以及为何链表长度为8才转变为红黑树呢,下面结合源码一起来分析一下。我们都知道,链表的时间复杂度是O(n),红黑树的时间复杂度O(logn),很显然,红黑树的复杂度是优于链表的,既然这么棒,那为什么hashmap为什么...

2019-08-07 22:43:32 24512 43

基于CentOS7静默安装Oracle 11g

centos7安装Oracle,亲测可用,整理成了文档,直接按照步骤操作即可。

2019-06-03

Gson在解析json时依赖的jar包

Gson处理json问题时需要依赖的jar包,已经在资源中上传,直接下载导入即可。

2018-04-12

spring定时任务依赖的jar包

spring 做定时器任务时所依赖的10个jar包,用于实现java定时任务。

2018-04-12

空空如也

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

TA关注的人

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