自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 重写了equals()真的就一定要重写hashCode()吗?

目录1、结论2、使用哈希表相关容器存储自定义对象时,为什么重写了equals()就一定要重写hashCode()?为什么重写了equals()就一定要重写hashCode()?其实这个问题之前自己也没有完全想清楚,反正八股文嘛,背就完了呗!但是随着工作的这两年以来,不断丰富的人生阅历以及不断增加的代码量,让我对很多事物的认知也悄悄地发生一些改变,作为一个自认为有点追求的人,自己拿来恰饭的东西还是要尽量做到知其然并知其所以然。首先先来看看万物之祖Object类中的equals()和hashC

2021-07-29 16:44:35 432

原创 使用SimpleDateFormat进行日期格式转换时遇到的问题

最近写代码的时候,使用了SimpleDateFormat对Date进行格式转换,刚开始我是这样写的:SimpleDateFormat sdf = new SimpleDateFormat("HH:MM:SS");这样写乍一看似乎没有什么毛病,但是实质上隐藏了很大的问题。仔细看一看构造参数中的"HH:MM:SS",当时我并不知道H、M、S的大小写分别代表了不同的意思,所以导致时间格式并没有...

2019-08-02 16:27:23 5028

原创 通过Spring Cloud Gateway转发WebSocket实现消息推送

一、总体方案流程先上总体流程图吧,(我没有用visio来画图,而是用了网上的一个工具Process On,所以图看上去不是那么正规。不用visio主要还是因为visio用的太菜了,有机会还是要多练习一下使用visio画图)。主要起了四个工程,一个是模拟用户服务的工程user-service(模拟两个服务就通过两个不同的端口来模拟); 一个是Spring Cloud Gateway...

2019-06-24 23:25:44 70453 30

原创 Git的学习和使用(一:基础概念部分)

前言今天是五一假期的第一天,突然想起来应该对最近工作中遇到的一个非常让我头痛的问题进行一下深入的学习和探索。这个问题是什么呢?就是git的使用。虽然以前自己做项目的时候也用过git,但是那时候对git的使用很浅,只要是push successfully就完事了,没有注意到git有那么多的使用细节。现在参与到团队开发中以后,我发现个人开发和团队开发是完全不一样的,相较于单人开发项目时的随意和松散...

2019-05-01 11:13:22 328 1

原创 排序算法总结

1、冒泡排序1.1、冒泡排序的基本思想从无序队列的头部开始(当然也可以从尾部开始,两两比较,将最小的数交换到队首),从前往后,将相邻的两个数进行两两比较,根据大小交换位置,将最大的数交换到无序数列的队尾,从而成为有序数列的一部分。下一次继续这个过程,直到将无序数列变成有序数列。如下图所示,每次都把最大的数浮动到队列的末尾:1.2、java代码实现package Bubbl...

2019-02-17 21:26:14 253 2

原创 MySql学习笔记

 目录1、常见的MySql引擎1.1、什么是MySql引擎?1.2、存储引擎的作用是什么?1.3、为什么要合理选择数据库存储引擎?1.4、InnoDB引擎(Version5.1以后的默认存储引擎)1.5、MyIsam引擎(Version5.1以前的默认存储引擎)1.6、InnoDB引擎和MyIsam引擎的对比2、事务2.1、什么是MySql事务?2.2、...

2019-02-14 12:53:56 361

原创 常见的几种Java设计模式

目录1、什么是设计模式?设计模式有什么用?2、设计模式应该遵循的面向对象设计原则3、设计模式的六大原则4、设计模式的四种类型(包括J2EE设计模式)5、几种常见的设计模式5.1、工厂模式5.2、抽象工厂模式5.3、单例模式5.4、适配器模式5.5、装饰器模式5.6、代理模式5.7、策略模式5.8、观察者模式1、什么是设计模式?设计模式有什么用...

2019-02-05 21:14:49 1210

原创 码出高效读书笔记:ConcurrentHashMap

考虑到线程并发安全性,ConcurrentHashMap是比HashMap更加推荐的一种哈希式集合。JDK8对ConcurrentHashMap进行了脱胎换骨的改造,使用了大量的lock-free技术来减轻因锁的竞争而对性能造成的影响,涉及了volatile、CAS、锁、链表、红黑树等众多知识点。CAS:Compare And Swap,它是解决轻微冲突的多线程并发场景下使用锁造成性能损耗的一...

2019-02-01 11:47:52 240

原创 线程池类ThreadPoolExecutor解析

1、使用线程池的好处线程使应用能够更加充分合理地协调利用CPU、内存、网络、I/O等系统资源。线程的创建需要开辟虚拟机栈、程序计数器、本地方法栈等线程私有的内存空间。在线程销毁时需要回收这些资源。频繁地创建和销毁线程会浪费大量的系统资源,增加并发编程风险。另外,在服务器负载过大的时候,如何让新线程等待或者友好地拒绝服务?这都是线程自身无法解决的。所以需要通过线程池协调多个线程,并实现类似主次线...

2019-01-25 18:37:23 435 3

原创 码出高效读书笔记:线程同步

1、什么是同步Q1:什么是原子性操作?A1:众所周知在物理世界中,原子是最小的粒子,是不可分割的。所谓原子性操作就是指不可分割的一系列操作指令,在执行完毕之前不会被其他操作中断,要么全部执行,要么全部不执行。举个例子,i++就不是原子性操作,因为它分为三步:取i的值、i+1、赋值,即ILOAD---->IINC---->ISTORE。而i=1就是最简单的原子性操作。回归正题...

2019-01-23 11:40:40 192

原创 线程安全和锁

1、进程与线程的概念先来复习一下操作系统中所讲的进程、线程这两个概念:进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。 线程:是进程的一个执行单元,是进程内可调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。2、并发与并行的概念并发:指的是某个时间段内,多任务交替处理的能力。在某段执行时间内,每个CPU不可能...

2019-01-22 18:28:09 1227 2

原创 HashMap详解

更正一下:之前对于hashmap初始容量这一块的知识,我在理解上出了问题,初始容量应该指的是哈希表中能存放的元素的数量,而并非是hashmap实例创建时哈希表中数组的长度。目录1、HashMap简介1.1、HashMap的继承关系1.2、HashMap的数据结构2、HashMap源码分析(使用的是JDK1.7版本的源码)2.1、HashMap的四种构造函数2.2、Has...

2019-01-18 11:08:09 513

原创 码出高效读书笔记:树

1、树(tree)树是一种常用的数据结构,它是一个由有限节点组成的一个具有层次关系的集合,数据就存在树的这些节点中。最顶层只有一个节点,称为“根节点”(root)。在分支处有一个节点,指向多个方向,如果某节点下方没有任何分叉的话,就是叶子节点。从某节点出发,到叶子节点为止,最长简单路径上边的条数,称为该节点的高度。 从根节点出发,到某节点边的条数,称为该节点的深度。如下图所示的树,根节...

2019-01-16 13:10:22 270

原创 码出高效读书笔记:Comparable与Comparator、hashCode与equals

1、Comparable和ComparatorJava中两个对象相比较的方法通常用在元素排序里,常用的两个接口分别是Comparable和Comparator。前者Comparable是自己和自己比,可以看作是自营性质的比较器。从词根上分析,Comparable以-able结尾,表示它有自身具备某种能力的性质,表明Comparable对象本身是可以与同类型进行比较的,它的比较方法是comp...

2019-01-15 19:38:17 368

原创 码出高效读书笔记:集合与泛型

集合与泛型的联合使用,可以把泛型的功能发挥到极致,很多程序员不清楚List、List<Object>、List<?>三者的区别,更加不能区分<? extends T>与<? super T>的使用场景。List<?>是一个泛型,在没有赋值之前,表示它可以接受任何类型的集合赋值,赋值之后就不能再随便往里添加元素了,下面的代码很好地说明了...

2019-01-14 17:33:41 452

原创 ArrayList源码分析

1、ArrayList简介ArrayList是基于数组实现的List类。 ArrayList是容量可以改变的非线程安全集合,当多个线程访问同一个ArrayList时,程序需要手动控制保证该集合的同步性。 ArrayList的特点是遍历速度快,插入和删除操作速度慢。2、ArrayList源码分析package Test;import java.util.*;public cl...

2019-01-14 12:06:31 132

原创 码出高效读书笔记:数据结构概要

1、数据结构1.1数据结构定义数据结构是指逻辑意义上的数据组织方式及其相应的处理方式。逻辑意义:比如说,二叉树在磁盘中的存储真的是树形排列的吗?并非如此,树的存储可能是基于物理上的顺序存储方式,可以理解为一个格子一个格子连续地放,设想有7个节点的二叉树,第一个格子放根节点,第二个格子放左子树的根节点;并且根据引用知道左叶子在后续的哪个格子里;第三个格子放右子树根节点,依此类推。此外,树...

2019-01-13 11:17:15 130

原创 码出高效读书笔记:异常与日志

1、区分throws和throw(1)throws定义一个方法时,可以用throws关键字声明,使用throws关键字声明的方法表示此方法不处理异常,而交给方法调用处进行处理。 throws关键字格式:public 返回值类型 方法名称(参数列表,,,)throws 异常类{}。 请看下面一段代码:package Test;public class iTest { ...

2019-01-09 11:48:53 335

原创 码出高效读书笔记:类的加载过程

1、什么是机器码和字节码?Java是如何实现一次编译,到处执行的?Q1:什么是机器码?A1:在计算机的世界中,0和1是计算仅能识别的信号,经过0和1的不同组合产生了数字上的操作,同时通过不同的组合也产生了各种字符。同样,可以通过不同的组合产生不同的机器指令。在不同的时代,不同的厂商,机器指令组成的集合是不同的。但毕竟CPU是底层基础硬件,指令集通常以扩展兼容的方式向前不断演进。而机器码是离...

2019-01-08 13:19:15 246

原创 码出高效读书笔记:基本数据类型、包装类型及字符串

1、基本数据类型基本数据类型是指不可再分的原子数据类型,内存中直接存储此类型的值,通过内存地址即可直接访问到数据,并且此内存区域只能存放这种类型的值。一般来说Java有8中数据类型,分别为byte、char、short、int、long、float、double、boolean,但是码出高效中多给出了一种基本数据类型,即refvar,这是一种面向对象世界中的引用变量,也叫作引用句柄。前...

2019-01-06 11:47:55 547

原创 码出高效学习笔记:泛型

1、泛型能够解决的问题Q:什么是泛型?泛型有什么用?A:泛型的本质是类型参数化,解决不确定具体对象类型的问题。在面向对象编程语言中,允许程序员在强类型校验下定义某些可变部分,以达到代码复用的目的。PS:泛型其实就是一种编写代码时的语法检查,可以避免类型强制转换带来的风险。Java在引入泛型前,表示可变类型,往往存在类型安全的风险。举一个生活中的例子:微波炉最主要的功能是加热食物,即...

2019-01-05 17:16:32 229

原创 码出高效读书笔记:Override和Overload

1、Override(覆写)如果父类定义的方法达不到子类的期望,那么子类可以重新实现方法覆盖父类的实现。因为有些子类是延迟加载的,甚至是网络加载的,所以最终的实现需要在运行期判断,这就是所谓的动态绑定。动态绑定是多态性得以实现的重要因素,元空间有一个方法表保存着每个可以实例化类的方法信息,JVM可以通过方法表快速地激活实例方法。如果某个类覆写了父类的某个方法,则方法表中的方法指向引用会指向...

2019-01-05 10:38:40 230

原创 码出高效读书笔记:重新总结类的构造方法及静态代码块

构造方法是方法名与类名相同的特殊方法,在新建对象时调用,可以通过不同的构造方法对对象进行不同的初始化创建,构造方法的特征如下:构造方法名称必须与类名相同 构造方法没有返回值类型,即使是void也不能有。它返回对象的地址,并赋值给引用变量。 构造方法不能被继承,不能被覆写,不能被直接调用。调用的途径有三种,一是通过new关键字,二是在子类的构造方法中通过super调用父类的构造方法,三是通过...

2019-01-03 16:06:55 125

原创 码出高效读书笔记:Java对象序列化

Q:什么是序列化?A:内存中的数据对象只有转换为二进制流才能进行数据持久化和网络传输。将数据对象转换成二进制流的过程被称为对象的序列化(Serialization)。反之,将二进制流恢复为数据对象的过程称为反序列化(Deserialization)。常见的序列化方式有以下三种:(1)Java原生序列化。Java类通过实现Serialization接口来实现该类对象的序列化,这个接口非常...

2019-01-03 13:54:18 141

原创 码出高效读书笔记:重新思考接口和抽象类以及内部类

1、接口和抽象类正如面向对象四大特征:抽象、继承、封装、多态所述,定义类的过程就是抽象和封装的过程。而接口和抽象类则是对实体类进行更高层次的抽象,仅定义公共行为和特征。两者的共同点是都不能被实例化,但可以通过定义引用变量指向实例对象。下表示接口和抽象类的语法区别: 语法维度 抽象类 接口 定义关键字 abstract interface 子类继承或实...

2019-01-02 12:01:00 168

原创 码出高效读书笔记:SQL注入

Q1:什么是SQL注入?A1:SQL注入是注入式攻击中的常见类型,SQL注入式攻击是未将代码与数据进行严格的隔离,导致在读取用户数据的时候,错误地将数据作为代码的一部分执行,从而导致一些安全问题。典型的SQL注入的例子是当对SQL语句进行字符串拼接操作时,直接使用未加转义的用户输入内容作为变量。例如:var testCondition; //测试内容变量te...

2018-12-30 16:22:54 160

原创 什么是TCP粘包?怎么解决这个问题

在socket网络编程中,都是端到端通信,由客户端端口+服务端端口+客户端IP+服务端IP+传输协议组成的五元组可以明确的标识一条连接。在TCP的socket编程中,发送端和接收端都有成对的socket。发送端为了将多个发往接收端的包,更加高效的的发给接收端,于是采用了优化算法(Nagle算法),将多次间隔较小、数据量较小的数据,合并成一个数据量大的数据块,然后进行封包。那么这样一来,接收端就必须...

2018-12-29 17:47:58 77068 23

原创 码出高效读书笔记:TCP/IP

1.网络协议TCP/IP中文译名为传输控制协议/因特网互联协议。这个大家族里的其他知名协议还有HTTP、HTTPS、FTP、SMTP、UDP、ARP、IEEE802.x等。TCP/IP是当前流行的网络传输协议框架,从严格意义上来讲它是一个协议族,因为TCP和IP协议是其中最为核心的协议,所以就将该协议族成为TCP/IP。这个协议族是一个四层模型,包括:Application(应用层)、...

2018-12-28 17:04:39 249

原创 深入理解Java虚拟机第三章读书笔记:内存分配与回收策略

Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存 回收分配给对象的内存对象的内存分配,从大体上讲,就是在堆内存中进行分配,对象主要是分配在新生代的Eden区上,如果启动了本地线程分配缓冲(TLAB),则将按线程优先在TLAB上分配。少数情况也会直接分配在老年代中,分配的规则不是百分之百固定的,细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中...

2018-12-14 20:27:55 183

原创 深入理解Java虚拟机第三章读书笔记:HotSpot虚拟机中的各个垃圾收集器

1.前言垃圾收集算法是内存回收的方法论,那么垃圾收集器就是垃圾回收的具体实现。书中提到的HotSpot虚拟机所实现的所有垃圾收集器如图所示,有连线的两个垃圾收集器表示这两种垃圾收集器可以搭配使用,垃圾收集器所处的区域表明它适用的区域,图中横线上方是新生代区域,下方是老年代区域在垃圾收集器的上下文语境中,并发和并行的解释如下:并行:多条垃圾收集线程同时工作,但是用户线程还处在停滞等待...

2018-12-10 21:58:51 104

原创 深入理解Java虚拟机第三章读书笔记:垃圾回收算法

更正之前写这篇笔记的时候我对标记-清除算法的理解好像有些偏差,最近复习笔记的时候发现之前描述的那个过程好像容易造成误解,因为是个人学习笔记,我就不在正文中修改了,方便自己以后回看。我重新总结一下标记-清除算法的过程:如果对象通过可达性分析后发现没有与GC Roots相连的引用链,那么它会被进行第一次标记,并且进行一次筛选(筛选的条件是有没有必要执行finalize()方法,这一部分下文...

2018-12-06 18:02:19 107

原创 深入理解Java虚拟机第二章读书笔记:HotSpot虚拟机在Java堆上的对象分配

1.对象的创建Step1:检查虚拟机在遇到一个new指令时,先检查这个指令的参数是否能在常量池中定位到一个类的符号引用。然后进行类加载检查。(涉及到类的加载机制)Step2:为对象分配内存空间在进行完类加载检查以后,开始为对象分配内存空间,大致有如下两种分配方式:指针碰撞(要求堆中的内存绝对规整),Serial、ParNew等带Compact过程的收集器 空闲列表(适用于堆中...

2018-12-05 14:45:29 127

原创 深入理解Java虚拟机第二章读书笔记:Java内存模型

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分成若干个不同的数据区域。这些区域都有自己的用途,以及创建和销毁的时间。有的会随着虚拟机进程的启动而存在,有的区域则依赖用户进程的启动和结束而建立或销毁。Java虚拟机所管理的内存区域主要有以下几个运行时数据区域。1.程序计数器(线程私有内存)程序计数器是每个线程都有的一个内存区域。学过操作系统的都知道,一个CPU在同一时刻只能执...

2018-12-04 17:17:47 169

原创 数据结构复习笔记(基本概念)

1.数据元素、数据项、数据对象、数据集合的概念1.1数据元素数据元素是组成数据、有一定意义的基本单位,在计算机中被当做整体来处理。也被称为记录在人类中,数据元素就是人。在禽类中,数据元素就是猪、牛、马、羊等牲畜。1.2数据项数据项是数据结构中不可分割的最小单位。人有眼睛、鼻子、嘴巴、耳朵等器官,那么眼睛、鼻子、嘴巴、耳朵等器官就是人这个数据元素的数据项,由这些数据项组成了数...

2018-11-30 09:50:42 1107

原创 UEFI模式下安装Win10和Ubuntu18.04(同一磁盘下)

2019/4/9号更新关于UEFI模式下双系统卸载ubuntu的问题:请使用Hasleo EasyUEFI进行卸载!!!不要使用其他工具,直接在Hasleo EasyUEFI中将ubuntu启动引导删除即可,重启后将原本分配给ubuntu的磁盘空间格式化再分配到其他盘就行。更新在安装完成后要记得在grub文件中把前面添加的acpi_osi=nomodeset参数去掉,并更新一下g...

2018-11-22 15:46:06 1452

原创 教你如何将磁盘中黑色的未分配空间变成绿色的可用空间

在黑色的未分配空间上建立新的卷 使用分区助手或者DiskGenius将新建立的卷从主分区转换成逻辑分区 在磁盘管理中删除这个卷,然后就会变成绿色的空用空间...

2018-11-20 20:46:09 23138 2

原创 JAVA基础回顾(二:集合框架)

1.为什么要使用集合1.在开发中我们经常要集中保存多个数据,可以使用数组,但是使用数组的前提是我们必须知道我们要保存的数据的数量,数组     的长度一旦被定义就不可以再做改变2.java集合相当于是一个长度可以变化的数组,是用于保存动态增长的数据的一个很好的选择3.java集合因为是用来保存数据的,所以我们也称集合类为容器类,所有的集合类都位于java.util包下4.后来为了处理多线...

2018-10-08 21:11:38 136

原创 JAVA基础回顾(一)

1.面向对象和面向过程的区别面向过程:优点:性能要高于面向对象,面向对象中的类在调用的时候需要实例化,中间需要加载的资源比较多(单片机、嵌入式开发、linux一般使用面向过程的思想进行开发)缺点:不易维护,不易复用,不易扩展面向对象:优点:易于维护,易于复用,易于扩展,因为封装、继承、多态等特性的存在,所以能够设计出耦合度很低的系统,并使系统更加灵活缺点:性能比面向对象低...

2018-10-08 10:25:51 107

原创 在云服务器上部署你的JAVA WEB项目

第一次在阿里云服务器上部署自己的java web项目,从一无所知的小小白到现在略微有一点项目部署经验的小白(hahahaha),这个过程中真的是一路艰辛,各种头疼,各种痛苦。但是,不积小流无以成江海,不积跬步无以至千里,现在每一步看似很难的操作和痛苦的学习过程,都是在为自己通往大神之路打基础做积累。今天就来记录下我在项目部署以来遇到的一些问题。一、购买域名和服务器云服务器提供商有很多,可以...

2018-10-03 20:56:48 1188

原创 通过ajax发送post请求向controller传递参数后,页面无法跳转问题

我的项目之前都是用location.href来向后台传递参数,因为最近在学习ajax,所以将传值方式改成了ajax发送post请求,于是问题便接踵而来,我发现在controller中通过返回ModelAndView对象竟然不能实现页面跳转了,刚开始百思不得其解,现在总算明白这到底是怎么一回事了,也想出了一种解决方法,特此记录下来,方便以后回看不能跳转的原因:ajax实际上是通过XMLHtt...

2018-10-02 12:15:16 7409

空空如也

空空如也

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

TA关注的人

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