自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 2020-10-24

蹭个勋章

2020-10-24 16:15:17 166

原创 ZAB协议简单剖析

ZAB是为Zookeeper专门设计的一种支持崩溃恢复的消息广播协议,ZAB协议只允许有一个主进程可以响应客户端的事务请求并处理,即Leader。当Leader收到客户端的事务请求之后,它会把请求事务转化为事务proposal,Leader会为每个Follower创建一个队列,将该proposal放入响应队列,保证提案的顺序性。之后会在队列中顺序向其他节点广播该提案,Follower收到后会将其以事务的形式写入到本地日志,并向Leader发送反馈ack。Leader会等待其他Follower的回复,当收到一

2020-08-19 10:52:39 298

原创 关于搭建虚拟环境的一系列问题(仅供参考)

看到有同学用Anaconda环境来做实验,我自己也搭了一个。使用jupyter notebook 确实比在终端直接操作方便。但是很头疼的一点就是有可能会出现Anaconda自带的Python跟原来的Python发生冲突,各种百度、Google搜了好几天才给解决。还有就是最新版的Python 3.8.2也可能有些bug没被修复,导致Pycharm无论执行任何程序都会报一个错误,这可能就是新版软件的一些缺陷吧,用的人少,问题还没被解决。不过慢慢来,总归还是有办法的。在这里总结一下,大家遇到了也好有个参考,如果有

2020-05-18 14:57:15 859

原创 Java集合总结

集合类存放于Java.util包中,主要有3种:set(集)、list(列表包含Queue)和map(映射)。1. Collection:Collection是集合List、Set、Queue的最基本的接口。2. Iterator:迭代器,可以通过迭代器遍历集合中的数据3. Map:是映射表的基础接口接口继承关系和实现:集合框架图:ListJava的List是非常常用的数据类型。List是有序的Collection。Java List一共三个实现类:分别是ArrayList、.

2020-05-13 13:41:33 216

原创 数据库锁

行级锁行级锁是一种排他锁,防止其他事务修改此行;在使用以下语句时,Oracle会自动应用行级锁:1. INSERT、UPDATE、DELETE、SELECT … FOR UPDATE [OF columns] [WAIT n | NOWAIT];2. SELECT … FOR UPDATE语句允许用户一次锁定多条记录进行更新3. 使用COMMIT或ROLLBACK语句释放锁。表级锁表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNO

2020-05-12 19:09:06 144

原创 Java反射机制概念(运行状态中知道类所有的属性和方法)

在Java中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。反射的应用场合:首先说一下编译时类型和运行时类型 :在Java程序中许多对象在运行是都会出现两种类型:编译时类型和运行时类型。 编译时的类型由声明对象时实用的类型来决定,运行时的类型由实际赋值给对象的类型决定 。如: Person p=new Student(); 其中编译时类型为Person

2020-05-12 17:39:08 887

原创 Java 中 static 关键字(改)

1、static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。2、static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的

2020-05-12 14:45:30 122

原创 JAVA内部类

Java类中不仅可以定义变量和方法,还可以定义类,这样定义在类内部的类就被称为内部类。根据定义的方式不同,内部类分为静态内部类,成员内部类,局部内部类,匿名内部类四种。静态内部类:定义在类内部的静态类,就是静态内部类。1. 静态内部类可以访问外部类所有的静态变量和方法,即使是private的也一样。2. 静态内部类和一般类一致,可以定义静态变量、方法,构造方法等。3. 其它类使用静态内部类需要使用“外部类.静态内部类”方式,如下所示:Out.Inner inner = new Out.Inne

2020-05-12 11:37:26 124

原创 Java枚举

当一个变量只有几种固定可能的取值时,例如一个人的性别只能是“男”或者“女”,一周的星期只能是 7 天中的一个等。就可以将它定义为枚举类型。枚举的用法:1、枚举常量2、在switch中使用枚举3、向枚举中添加方法4、使用@Override注解覆盖枚举的方法5、使用枚举实现接口6、使用接口组织枚举...

2020-05-12 11:26:47 120

原创 sleep() 与 wait() 的区别

1. sleep()方法是属于Thread类中的。而wait()方法,则是属于Object类中的。2. wait()和sleep()都是让出CPU占有权,让其它线程能够得到运行,不同的地方在于wait()可以通过notify()或者notifyAll()主动唤醒或者wait()等待一定的时间自动恢复运行,而sleep方法只能在等待一定的时间后自动恢复运行,但是他的监控状态依然保持着。3. 在调用sleep()方法的过程中,线程不会释放对象锁。 而当调用wait()方法的时候,线程会放弃对象锁,进入等

2020-05-12 11:05:38 169

原创 数据的分区分表

分库分表有垂直切分和水平切分两种。垂直切分(按照功能模块)将表按照功能模块、关系密切程度划分出来,部署到不同的库上。例如,我们会建立定义数据库workDB、商品数据库payDB、用户数据库userDB、日志数据库logDB等,分别用于存储项目数据定义表、商品定义表、用户数据表、日志数据表等。水平切分(按照规则划分存储)当一个表中的数据量过大时,我们可以把该表的数据按照某种规则,例如userID散列,进行划分,然后存储到多个结构相同的表,和不同的库上。...

2020-05-12 10:51:52 241

原创 Java 中 finally 中的代码一定会被执行吗?

至少有两种情况下finally语句是不会被执行的:1、try语句没有被执行到,如在try语句之前return就返回了,这样finally语句就不会执行。 这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。2、在try块 或者 catch块中有System.exit(0)这样的语句。 System.exit(0)是终止Java虚拟机JVM的,虚拟机停止运行之后,finally语句也不会被执行到。1、在try catch块里有return...

2020-05-12 10:34:10 1133

原创 HashSet 和 HashMap 区别

如果你看过 HashSet 源码的话就应该知道:HashSet 底层就是基于 HashMap 实现的。(HashSet 的源码非常非常少,因为除了 clone() 方法、writeObject()方法、readObject()方法是 HashSet 自己不得不实现之外,其他方法都是直接调用 HashMap 中的方法。)...

2020-05-11 13:48:44 274

原创 HTTP长连接、短连接

在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:Connection:keep-alive在使用长连接的情况下,当一个网页打开完

2020-05-11 13:33:31 145

原创 在浏览器中输入url地址 ->> 显示主页的过程

总体来说分为以下几个过程:1. DNS解析2. TCP连接3. 发送HTTP请求4. 服务器处理请求并返回HTTP报文5. 浏览器解析渲染页面6. 连接结束具体可以参考下面这篇文章:https://segmentfault.com/a/1190000006879700...

2020-05-11 13:31:21 675

原创 集合框架底层数据结构总结

Collection1. ListArraylist: Object数组 Vector: Object数组 LinkedList: 双向链表(JDK1.6之前为循环链表,JDK1.7取消了循环)2. SetHashSet(无序,唯一): 基于 HashMap 实现的,底层采用 HashMap 来保存元素 LinkedHashSet: LinkedHashSet 继承与 HashSet,并且其内部是通过 LinkedHashMap 来实现的。有点类似LinkedHashMap 其内部是基于 .

2020-05-11 08:46:14 249

原创 ConcurrentHashMap线程安全的具体实现方式/底层具体实现

JDK1.7首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问。ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成。Segment 实现了 ReentrantLock,所以 Segment 是一种可重入锁,扮演锁的角色。HashEntry 用于存储键值对数据。一个 ConcurrentHashMap 里包含一个 Segment 数组。Segment 的结构和HashMap类

2020-05-11 08:41:02 572

原创 ConcurrentHashMap 和 Hashtable 的区别

ConcurrentHashMap 和 Hashtable 的区别主要体现在实现线程安全的方式上不同。底层数据结构:①JDK1.7的 ConcurrentHashMap 底层采用 分段的数组+链表 实现,JDK1.8 采用的数据结构跟HashMap1.8的结构一样,数组+链表/红黑二叉树。②Hashtable 和 JDK1.8 之前的 HashMap 的底层数据结构类似都是采用 数组+链表 的形式,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的;实现线程安全的方式(重要):

2020-05-11 08:36:36 174 1

原创 HashMap 的长度为什么是2的幂次方

为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀。Hash 值的范围值设定为-2147483648(2的31次方)到2147483647(2的31次方减一),前后加起来大概40亿的映射空间,只要哈希函数映射得比较均匀松散,一般应用是很难出现碰撞的。但问题是一个40亿长度的数组,内存是放不下的。所以这个散列值是不能直接拿来用的。用之前还要先做对数组的长度取模运算,得到的余数才能用来要存放的位置也就是对应的数组下标。这个数组下标的计算方法是“ (n - 1) & hash ”

2020-05-10 18:27:09 504

原创 HashMap JDK1.7(1.8之前) 和 JDK1.8对比

1、JDK1.7采用了数组+链表的数据结构,JDK1.8采用了数组+链表/红黑树的数据结构2、JDK1.8对HashMap的hash函数做出了优化,JDK 1.8 的 hash 方法 相比于 JDK 1.7 hash 方法更加简化,但是原理不变。3、JDK1.7对Hash数组扩容的时候采用的是头插法,JDK1.8之后采用的是尾插法。...

2020-05-10 18:20:00 175

原创 ArrayList 与 Vector 区别

Vector类的所有方法都是同步的,所以多个线程可以安全地访问一个Vector对象,但是一个线程访问Vector的话,要在同步操作上耗费大量的时间。Arraylist不是同步的,所以在不需要保证线程安全时时建议使用Arraylist。...

2020-05-10 18:12:37 96

原创 Arraylist 与 LinkedList 异同

1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;2. 底层数据结构: Arraylist 底层使用的是Object数组;LinkedList 底层使用的是双向链表数据结构(JDK1.6之前为循环链表,JDK1.7取消了循环。注意双向链表和双向循环链表的区别);3. 插入和删除是否受元素位置的影响: ① ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 比如:执行add(E e) 方法的时候, ArrayLi

2020-05-10 18:05:44 126

原创 获取用键盘输入常用的的两种方法

方法1:通过 ScannerScanner input = new Scanner(System.in);String s = input.nextLine();input.close();方法2:通过 BufferedReaderBufferedReader input = new BufferedReader(new InputStreamReader(System.in));String s = input.readLine();

2020-05-10 17:54:13 259

原创 Java 中的异常处理

Java异常类层次结构图:在 Java 中,所有的异常都有一个共同的祖先java.lang包中的 Throwable类。Throwable 有两个重要的子类:Exception(异常) 和 Error(错误) ,二者都是 Java 异常处理的重要子类,各自都包含大量子类。Error(错误): 是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineErro

2020-05-10 17:52:18 121

原创 关于 final 关键字的一些总结

final关键字主要用在三个地方:变量、方法、类。1. 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改; 如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。2. 当用final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法。3. 使用final方法的原因有两个。 第一个原因是把方法锁定,以防任何继承类修改它的含义; 第二个原因是为了提高效率。在早期的Java实现版本中,会将...

2020-05-10 17:45:07 194

原创 == 与 equals 的区别

== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (

2020-05-10 17:41:55 137

原创 自动装箱与自动拆箱

自动装箱:将一个基本数据类型的变量赋值给相应封装类的变量。自动拆箱:将一个封装类的变量赋值给相应基本数据类型的变量。八种基本数据类型以及它们的封装类:int - Integershort - Shortfloat - Floatdouble - Doublelong - Longboolean - Booleanbyte - Bytechar - Character...

2020-05-10 15:05:00 104

原创 String 和 StringBuffer、StringBuilder 的区别是什么?String 为什 么是不可变的?

可变性String 类中使用 final 关键字修饰的字符数组保存字符串, private final char value[] ,所以 String 对象是不可变的。而StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串char[]value 但是没有用 final 关键字修饰,所以这两种对象都是可变的。线程安全性String 中的对象是不可变的,也就可以理

2020-05-10 14:48:29 153

原创 死锁

死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。产生原因(竞争不可剥夺资源、竞争临时资源、进程推进顺序不当引起死锁):1、竞争资源引起进程死锁当系统中供多个进程共享的资源如打印机、公用队列的等,其数目不足以满足诸进程的需要时,会...

2020-04-06 11:38:36 212 2

原创 TCP和UDP的区别?有TCP为什么还要有UDP?

有TCP为什么还要有UDP?UDP有时比TCP更有优势。UDP以其简单、传输快的优势,在越来越多场景下取代了TCP,如实时游戏。(1)网速的提升给UDP的稳定性提供可靠网络保障,丢包率很低,如果使用应用层重传,能够确保传输的可靠性。(2)TCP为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,建立了繁琐的握手过程,由于TCP内置于系统协议栈中,极难对其进行改进。采用TCP,一...

2020-04-06 11:38:27 2050

原创 计算机网络体系结构

OSI七层参考模型7层模型主要包括:1. 物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的模数转换与数模转换)。这一层的数据叫做比特。2. 数据链路层:主要将从物理层接收的数据进行MAC地址(网卡的地址)的封装与解封装。常把这一层的数据叫做帧。在...

2020-04-06 11:38:16 217

原创 TCP的三次握手与四次挥手

TCP三次握手过程1、主机A通过向主机B 发送一个含有同步序列号标志位的数据段(SYN)给主机B ,向主机B 请求建立连接,通过这个数据段,主机A告诉主机B 两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我。2、主机B 收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事:我已经收到你的请求了,你可以传输数据了;...

2020-04-06 11:38:02 121

原创 CAP

CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。一致性(C):1. 在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)可用性(A):2. 在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求...

2020-04-06 11:37:54 231

原创 数据库并发策略

并发控制一般采用三种方法,分别是乐观锁和悲观锁以及时间戳。乐观锁乐观锁认为一个用户读数据的时候,别人不会去写自己所读的数据;悲观锁就刚好相反,觉得自己读数据库的时候,别人可能刚好在写自己刚读的数据,其实就是持一种比较保守的态度;时间戳就是不加锁,通过时间戳来控制并发出现的问题。悲观锁悲观锁就是在读取数据的时候,为了不让别人修改自己读取的数据,就会先对自己读取的数据加锁,只有自己把数...

2020-04-06 11:37:39 775

原创 数据库三范式

第一范式(1st NF -列都是不可再分)第一范式的目标是确保每列的原子性:如果每列都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式(1NF)第二范式(2nd NF-每个表只描述一件事情)首先满足第一范式,并且表中非主键列不存在对主键的部分依赖。 第二范式要求每个表只描述一件事情。第三范式(3rd NF- 不存在对非主键列的传递依赖)第三范式定义是...

2020-04-04 09:25:57 146

原创 数据库索引

索引(Index)是帮助MySQL高效获取数据的数据结构。之所以要建立索引,其实就是为了构建一种数据结构,可以在上面应用一种高效的查询算法,最终提高数据的查询速度。常见的查询算法有:顺序查找,二分查找,二叉排序树查找,哈希散列法,分块查找,平衡多路搜索树,B树(B-tree)。不同的存储引擎实现索引的原理是不一样的:1、MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存...

2020-04-04 09:25:42 85

原创 数据库存储引擎

数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。存储引擎主要有: 1. MyIsam , 2. InnoDB, 3. Memory, 4. Archive, 5. Federated ...

2020-04-04 09:25:29 129

原创 数据库事务,事务的隔离级别

事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作,这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行 。事务是一个不可分割的工作逻辑单元。事务必须具备以下四个属性,简称ACID 属性:原子性(Atomicity)1. 事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行。一致性(Consistency)2. 当事务完成时,数据...

2020-04-04 09:24:46 134

原创 Spring Boot 原理

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。其特点如下:1. 创建独立的Spring应用程序2. 嵌...

2020-04-04 09:23:52 164

原创 Spring 核心组件

2020-04-04 09:23:37 129

空空如也

空空如也

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

TA关注的人

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