自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Always`的博客

从前不回头,往后不将就!

  • 博客(47)
  • 资源 (1)
  • 收藏
  • 关注

原创 红黑树增删查详解

1.红黑树增删查相关操作1.介绍​ 由于AVL树虽然查询快,但是插入删除的时候需要不断的操作来维持自身平衡,导致性能下降。而红黑树(R-B Tree)是黑色平衡的,在操作的时候只需维持黑色平衡即可(当然还有其他的特性)。红黑树是由2-3-4树变换而来,如果需要了解红黑树详细的操作流程,需要对2-3-4树有一定的了解。红黑树在JDK1.8中的HashMap、ConcurrentHashMap、TreeMap等,以及Linux内核.…2.特性1.根节点为黑色。2.所有节点非黑即红。3.红

2020-12-16 00:16:13 989

原创 HashMap 1.7源码解析

HashMap 1.7源码解析1.介绍1.描述​ HashMap在我们平常开发中使用非常广泛,本文就从JDK1.7 分析HashMap相关源码(后续再加上1.8). 在JDK1.7中HashMap底层是由数组+链表实现的,每次在插入数据的时候,会根据key来计算对应的Hash.使用各种位操作将Hash值转换成对应的数组下标,根据下标来找到数组(Entry)对应位置.如果当前位置对应的Entry对象不为空,则以头插的方式将数据插入到链表中.如果为空的话,直接将数据插入到Entry数组中.

2020-10-23 03:53:27 1302

原创 docker编译jdk8

docker编译jdk8

2022-10-30 18:43:25 845 1

原创 BeanFactoryPostProcessor执行时机

1.介绍BeanFactoryPostProcessor BeanFactory后置处理器官方解释允许自定义修改应用程序上下文的Bean定义,以适应上下文基础Bean工厂的Bean属性值。 应用程序上下文可以在其Bean定义中自动检测BeanFactoryPostProcessor Bean,并在创建任何其他Bean之前应用它们。 对于面向系统管理员的自定义配置文件很有用,这些文件覆盖了在应用程序上下文中配置的Bean属性。 请参阅PropertyResourceConfigurer及其具体实现,以

2021-04-01 15:24:04 1196 2

原创 Spring循环依赖源码debug详解

1.什么是循环依赖在Spring里,指两个或多个bean互相依赖。比如有两个Bean(A,B),A中注入B,B中注入A,这样就形成了循环依赖。Spring默认是支持循环依赖的,本文我们就从Spring源码层面对循环依赖进行分析。2.环境构建1.spring环境本文是以Spring5.1.x源码环境构建的,或者找一个spring环境的项目,在项目的test下测试。也可以创建一个项目在其中引入spring的核心依赖.spring-core:依赖注入IOC与ID的最基本实现spring-beans:

2021-03-14 11:48:41 683 2

原创 synchronized和ReentrantLock,实现生产消费模式

1.介绍生产消费模式实质上考察的是,多线程情况下的 等待唤醒机制 ,文中用 synchronized 和 ReentrantLock 分别进行实现。2.具体实现1.描述生产者:生产者向容器(lists)中put数据,直到容器到达指定容量,生产者将会等待,并唤醒消费者。消费者:消费者向容器(lists)中get数据,直到容器容量为空,消费者将会等待,并唤醒生产者。2.接口public interface ProCon<T> { /** * 生产 *

2021-03-09 22:01:42 198

原创 AbstractQueuedSynchronizer源码解析

从ReentrantLock对AQS源码分析介绍AQS全称:AbstractQueuedSynchronizer,从字面意思翻译为 抽象同步队列 。AQS的是在Java层面提供线程的同步机制。AbstractQueuedSynchronizer是一个抽象类,它里面提供了一些锁的基础实现,并且还定义了一些抽象方法为子类实现提供了模板。线程同步工具CountDownLatch、CyclicBarrier、Semaphore等是基于AQS的实现。基本概念在AQS中维护者一个CLH(Craig, Landi

2021-02-05 16:55:40 268

原创 从操作系统以及Java层面对线程状态的分析

线程的几种状态线程的状态到底有几种,往上众说纷纭。有的说5中,也有的说六种。今天我们以操作系统和java的层面来了解下线程的几种状态。操作系统操作系统多线程有五种状态【初始状态】 仅仅在语言层面创建了线程【可运行状态】 已经准备就绪,准备CPU的调度。【运行状态】获取了CPU时间片,正在运行。时间片用完后,会导致线程上下文切换。线程会重新去竞争时间片,变为【可运行状态】。【阻塞状态】 如果线程调用了阻塞API,例如,BIO读写文件。此时线程不会用到CPU资源,进入阻塞状态。当阻塞操作结束后

2021-01-30 17:44:00 175

原创 通过AQS实现一个简单的锁

通过AbstractQueuedSynchronizer实现一个简单的锁介绍仿照ReentrantLock,实现一个简单的自定义锁,包含加锁、解锁。了解AbstractQueuedSynchronizer中一些基本概念实现Lock接口Lock接口中定义了一些基本操作锁的方法lock() 获取锁,获取失败就进入阻塞队列lockInterruptibly() 获取可打断锁tryLock() 尝试获取锁,获取不到就返回falsetryLock(long time, TimeUnit un

2021-01-28 16:23:25 296

原创 自己实现一个简单的线程池

自己实现一个简单的线程池介绍当使用多线程的时候频繁的创建销毁线程是比较耗费系统资源,这个时候就需要使用线程池来管理减少资源的开销。在某站学习过后,决定自己也写一个简单的线程池,来加深印象。线程池中肯定需要有一个等待队列,里面存入相关的任务。然后每次从里面取出任务执行,继续往队列里添加任务。在这个过程中可能任务处理的时间比较长,存或取这个过程就需要添加超时时间,不然一直会阻塞等待。任务队列基础属性/** * 任务队列 */private final Deque<T> queue

2021-01-25 00:20:43 871 2

原创 HashMap-JDK1.7&1.8对比

HashMap-JDK1.7&1.8区别在上两篇对HashMap在JDK1.7与1.8原源码进行了分析,了解了HashMap中的实现原理。在阅读源码的时候,看了底层的设计和操作以及思想无不佩服HashMap的作者Doug Lea,JUC也是出自他之手。本片我们来对比HashMap在1.7与1.8的差异性1.JDK1.7 HashMap1.1 数据结构数组+链表,类型都为Entry1.2 扩容1.2.1 扩容条件(size >= threshold) && (nu

2021-01-23 19:16:33 336

原创 史上最全HashMap(JDK1.8)详解

HashMap1.8源码解析1.介绍之前写了一篇HashMap 1.7源码解析,本片将对HashMap1.8进行分析。后续再写一篇1.7和1.8中HashMap的区别,之前1.7中出现的一些代码我就不赘述了。HashMap1.8是由:数组(Node)+链表(Node)+红黑树(TreeNode) 组成,而且TreeNode继承与Node ,如下图所示。2.源码解析​ 一般我们在使用HashMap的时候,最好给一个默认的初始化容量,也就是调的**HashMap(int initialC

2021-01-14 17:13:52 996

原创 mybatis多对一映射关系

        有时候在对数据库操作的时候,需要用到表之间的关系。多对一,一对多。一对一,多对多。今天我们来使用mybatis实现多对一。首先创建两张表depe(部门表),emp(员工表)CREATE TABLE `dept` ( `deptno` int(11) NOT NULL AUTO_INCREMENT, `deptname` varchar(255) NOT NULL,...

2018-07-26 22:43:09 481

原创 Oracle建表空间,用户,授权以及建表

       Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的 适应高吞吐量的数据库解决方案。下面就简单的介绍一下oracle...

2018-07-16 23:59:49 297

原创 ajax实现图片上传及回显

       ajax可以使网页实现异步更新。这意味这可以在不重新加载整个网页的情况下,对网页的某个部分进行更新。今天使用ajax上传图片,并且将图片的路径以json格式返回到界面,达到回选的效果。1.需要的工具包图片上传commons-iocommons-fileuploadAlibaba提供的fastjsonfastjosn表单提交的jquery插件jquery.form.js2.编写前端代码...

2018-07-12 22:53:17 5091 3

原创 IDEA中mybatis-generator插件的使用

       mybatis-generator插件可自动生成实体类和mapper还有xml配置文件。在IDEA中只需修改插件中的generatorConfig.xml文件,然后运行配置文件就可以得到说需要的类,接口,xml文件。1.创建Maven(webapp)项目2.在pom.xml中加入包,以及插件mysql-connector的坐标 &lt;!-- https://mvnrepos...

2018-07-08 22:19:31 8020 1

原创 Servlet中数据传到JSP页面使用el表达式${}无法显示问题

       当我使用mybatis从数据库查询数据,通过servlet返回到界面,出现了两种错误。首先看我的servlet和jsp页面。Servlet代码 List&lt;Student&gt; students = studentService.queryStu();//作用:查询学生信息 通过service层调用dao层的接口 for(Student stu...

2018-07-02 23:08:21 9238 10

原创 IDEA创建Maven WEB项目

Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司项目采用 M...

2018-06-30 14:40:40 322

原创 Java环境搭建

1.首先在oracle官网下载jdk2.将下载好的jdk直接安装即可,安装过程中直接下一步即可。3.默认安装后,在C:\Program Files\Java应该会显示jdk(Java 语言的软件开发工具包)和jre(Java运行环境)的版本,jdk中包含jre。4.右击我的电脑 -&gt;属性-&gt;高级系统设置-&gt;环境变量5.添加环境变量 JAVA_HOME,将jdk的安装路径C:\Pr...

2018-06-30 12:17:03 208

原创 PageBean分页工具类

       在开发中有时需要将数据库中的数据显示到页面中,数据中的数据又比较多,使用一页是显示不了的。此时需要在数据库中分页查询,然后分页显示在页面中。如果使用一个通用的分页工具类,只需在创建该类时传入每页显示的行数,总行数(数据库中的数据总行数),以及当前页码。就可以求出总页数,并且对传入的页码数进行判断。PageBean分页工具类package com.book.Until;import...

2018-06-24 18:40:20 3759

原创 Tomcat环境搭建

       Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技...

2018-06-09 17:21:29 341

原创 反射实现动态代理

代理模式代理模式的定义:为其他对象提供一种代理以控制这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用应一个对象,需要实现相同的接口,而代理对象可以在客户端和目标对象之间起到中介的作用。就好比销售。代理商是受别人的委托,帮助委托人销售指定的商品。而这件商品原本是委托人,而不是代理商的。Java中的开闭原则:对拓展是开放的,修改是封闭的,不得修改源代码。当我们对一个类进行拓展时,这时就需要...

2018-05-22 22:32:18 405

原创 log4j日志记录及单元测试

日志记录工具log4jLog4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代...

2018-05-21 23:52:17 2390

原创 XML添加节点换行和缩进问题

问题当我们向XML文件中新增节点时,可能会遇到新增节点写在了一行,或者分行后没有缩进。这样会影响XML文件的美观性,以及我们可阅读性。今天我们用DOM解决以上问题,假设有一个XML文件:Book.xml,以下就是我们要达到的效果。&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;books&gt; &lt;book id="1"&gt; ..

2018-05-20 15:54:50 13824

原创 DOM4J创建XML文件和追加元素节点

在使用DOM4J时需要导入dom4j.jar包,然后使用其中的一些方法对XML文件进行操作。首先我们创建一个XML文件Student.xml&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;Students&gt; &lt;student id="1"&gt; &lt;name&gt;WH&lt;/name&

2018-05-17 23:41:46 11578 1

翻译 IO流中的设计模式

JavaIO流设计到的设计策略和设计模式Java的IO流库提供了一种链接(Chaining)机制,可以将一个流处理器跟另一个流处理器首位相连,以其中之一的输出作为另一个的输入而形成一个流管道链接。比如,常见的new DataInputStream(new FileInputStream(file))就是把FileInputStream流当作DataInputStream流的管道链接。其次,对于Ja...

2018-05-16 15:38:25 2062

翻译 IO字节流和字符流

字节流和字符流的区别计算机中的一切最终都是以二进制字节形式存在的(计算机的最小存储单位就是字节),对于我们经常操作的字符串,在写入时其实是先得到对应的字节,然后将字节写入到输出流,在读取时其实是先读到的是字节,然后将字节直接使用或者转换为字符给我们使用。由于对于字节和字符两种操作的需求比较广泛,所以Java专门提供了字符流与字节流相关的IO类。对于程序运行的底层设备来说永远都只接受字节数据,所以当...

2018-05-15 18:58:51 238

原创 反射了解泛型集合的本质

泛型包括泛型集合,泛型类。类似于模板,一种规范。泛型的好处:单易用,消除强制类型转换,保证类型安全。泛型集合中只能存储同一类型的元素,遍历等操作时,不需要强制类型转换。我们要做的操作就是使用反射在泛型集合中添加不同的元素,了解泛型的本质。首先我们创建一个测试类package Reflect;import java.lang.reflect.Method;import java.util.Ar...

2018-05-14 22:44:34 252

原创 通过反射得到类中的方法,并调用。

简介一般创建对象时,我们需要直接new类的对对象,这种编程方式称为硬编码(代码写死了),为了后期程序的可扩展,开发中通常采用实例内的完整限定名(包名.类名),通过反射加载字符串指定的类,并通过反射创建对象,得到类中的基本信息。得到类中的方法1.创建一个类Studentspackage Reflect;public class Students { public Students() {...

2018-05-13 16:04:11 2133

原创 反射:还原一个类的基本信息

简述反射是在运行时而非编译时动态获取类型的信息(接口信息,成员信息,方法信息,构造方法信息等)然后依据这些动态获取到的信息创建对象,访问修改成员,调用方法等。反射可以在运行时判断任意一个对象所属的类,任意一个类的成员变量和方法,调用任何一个类的方法,构造任意一个类的对象;生成动态代理。可通过Class.forName(“类名”)方法可以访问返回一个指定类名的类对象,因为在java里面任何一个cla...

2018-05-02 23:40:27 367

原创 使用DOM4J解析XML文件

简介XML可扩展标记语言,是一种数据交换格式,与操作系统和编程语言的开发平台无关,实现不同系统之间的数据交换。XML在不同的编程语言中都是一样的,只是实现的语法不同。XML在格式上和HTML有点相似,HTML中的标签是语法规定好的,而XML中的标签可以由开发者自己定义,只要不违反语法规则即可。XML有四种解析方式:DOM解析,SAX解析,JDOM解析,DOM4J解析。今天我们简单的来了解一下DOM...

2018-04-27 15:31:30 528

原创 多线程之等待唤醒机制

简介什么叫做等待唤醒机制呢?举一个栗子,请看下图:当我们开启两条线程时,一条线程专门输入数据,另条取数据。并且要实现,输入一个数据过后,另一方取出一个数据。在多线程的情况下,当输入线程抢到CPU的执行权后,下一次还有可能是输入线程抢到CPU的执行权,就达不到我们想过要的效果。因此,我们需要输入线程执行一次过后,就让它等待,并叫醒输出线程。然后让输出线程执行,执行一次后等待,并且叫醒输入线程。就这样...

2018-04-26 16:00:18 1586

原创 使用UDP发送消息

1.简介在osi(七层网络架构:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层)中,TCP和UDP属于同一层即传输层,IP属于网络层。TCP在传输时,需要建立稳定可靠的连接(三次握手和四次挥手)。UDP则不需要,只需指定数据报所发送的地址和端口即可。TCP/UDP各有优缺点。TCP比较稳定,但是效率低(建立连接的过程中比较耗时)。UDP不稳定(没有稳定连接可能会丢包),但是效率比较高。...

2018-04-25 16:29:28 3021

原创 TCP文件传输

网络协议里面有个FTP(文件传输协议),专门用于传输文件。但今天我们用Socke直接实现客户端与服务器端的文件传输,只需要在上次的Socke通讯中稍作改变,就可以达到文件传输的目的。步骤1.创建服务器端package FileSocket;import java.io.*;import java.net.ServerSocket;import java.net.Socket;publi...

2018-04-24 16:20:27 1678

原创 HashMap中,4种遍历方式。

在HashMap中,有一个明显的特征。在存储的时候,会有一个键值对的关系。键和值存在着一一对应(映射)的关系。而HashMap中的键相当与Set,无序不可重复。因此,在遍历的时候可以用Set集合得到HashMap中的键,然后通过Set集合得到迭代器,最后用迭代器遍历。遍历方式1.直接用for循环遍历 public static void print_for(HashMap&lt;Intege...

2018-04-23 13:21:17 2418

原创 TCP+多线程,让发送消息和接收消息各占一条线程

在上次Socket通讯 使用Socket实现简单的聊天功能 中。客户端和服务器只有一方可以发送消息,另一方则只能等待(接收消息),而且不能连续发送消息。因为发送消息和接受消息共有一条线程,需要来回的切换。这时我们就要专门为发送消息和接受消息各创建一个线程,就可以一次性发送多条消息。步骤1.创建一个发送消息Send类package ThreadSocket;import java.io.IOEx...

2018-04-22 18:01:43 9547 11

原创 线程同步下的死锁机制

死锁比如说有两个线程T1和T2,在线程同步的情况下,有两个锁L1和L2。当T1线程持有L1锁,想去访问L2锁住的资源。当T2线程持有L2锁,想去访问L1下面的资源。这个时候T1和T2线程就会彼此僵持着,两个线程都不肯让步,等待彼此释放资源(开锁),就这样无限等待中。。。手写死锁程序创建两个锁对象public class Lock { public static Object lock1=n...

2018-04-21 15:58:29 294

原创 使用TCP实现简单的聊天功能

简介当我们在网上进行数据传输的时候,首先需要建立稳定的连接(针对于TCP),然后通过Socket(套接字)将数据以流的方式输入输出,让双方的数据进行交互。而对于UDP,只需要知道对方的地址即可,不需要进行稳定的连接。TCP比较稳定,效率低。UDP效率比较高,但不稳定。用TCP实现简单聊天功能创建一个客户端和一个服务器端,模拟通讯创建一个服务器端package Socket;import jav...

2018-04-20 16:19:37 5371 1

原创 PrintWriter和PrintStream用法

简介PrintWriter和PrintStream是两个打印流,当我们需要对数据进行输出时,一般用的会比较多。比如说Socket通信,数据通过Socket流入流出,在流出的时候可能会用到PrintWriter。在选择这两个流的时候,如果需要对字符操作用PrintWriter,字节操作则用PrintStream。使用当我们用PrintWriter时,需要指定文件名,或者自定义一个字节输出流或字符输出...

2018-04-19 16:22:08 1247

原创 实现多线程的两种方式

简述在程序中,靠一个线程执行任务是比较缓慢的。有时,我们需要开启多线程,并发处理,提高程序的执行效率。进程和线程对于一个应用程序而言就是一个进程,当我们打开任务管理器的时候,可以看见每个运行的程序(进程)详情。线程是进程的最小执行单元,一个进程最起码有一个线程(主线程),可能会有多个线程。实现多线程的两种方式1.直接继承Thread创建一个类继承Thread并重写run方法package MyTh...

2018-04-18 15:37:48 673

SSM+Servlet图书管理系统

里面包含SSM+SSH+Servlet三种类型的图书管理系统。其中SSH可能不怎么完整,可以参考修改。希望能帮到各位新手!

2018-12-01

空空如也

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

TA关注的人

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