- 博客(42)
- 问答 (4)
- 收藏
- 关注
转载 Java序列化原理解析
Serialization (序列化)是一种将对象以一连串的字节描述的过程;反序列化 deserialization 是一种将这些字节重建成一个对象的过程。 Java 序列化 API 提供一种处理对象序列化的标准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化以及 Java 序列化的算法,我们用一个实例来示范序列化以后的字节是如何描述一个对象的信息的。
2020-10-30 11:50:25 125
原创 Singleton(单例)模式
Singleton(单例)模式概念顾名思义就是该类只有一个实例,并且确保在任何情况下都绝对只有一个实例,并且程序上也要表现出“只存在一个实例”优点只有一个对象,节省内存可以实现避免对资源的多重占用在系统设置全局访问点,优化和共享资源访问实现思路静态化实例对象私有构造方法,禁止使用构造器方法来创建实例提供一个公共静态方法,用来返回唯一实例适用场景需要频繁实例化后销毁的对象创建对象时耗时过多或者耗资源过多,但又经常使用到的对象有状态的工具类对象频繁访问
2020-10-30 10:21:14 94
原创 Java对象的内存布局
Java对象的内存布局在介绍Java对象的内存布局之前先介绍一下Java中哪些数据是以对象的形式创建的Java的数据类型基本数据类型byte、short、int、long、float、double、char、boolean基本数据类型被创建时,在栈上给其划分一块内存,将数值直接存储在栈上引用数据类型类、接口、数组、枚举、注解等引用数据类型在创建时首先要在栈上给其引用分配一块内存,将对象的实例存储在堆内存上,栈上面的引用指向堆内存中对象的地址Java中在内存布局时主要考
2020-10-27 14:50:58 154
原创 TCP保活机制
TCP设有一个保活计时器,服务器每收到一次客户端的请求都会复位这个计时器,时间通常是2小时,若两小时没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75s发送一次,若一连发送了10个探测报文段仍然没有反应,服务器则认为客户端出现了故障,接着就关闭连接。...
2020-10-27 09:19:20 214
原创 Iterator(迭代器)模式
Iterator模式我们在日常开发中避免不了会使用各种容器,容器内存放大量的同类型的对象,比如Java中的ArrayList、LinkedList、HashMap等,这几种的遍历方法都是不一样的。Iterator模式为所有容器提供了一个统一的接口,在屏蔽容器的细节的情况下实现对容器内对象的遍历。
2020-10-26 13:31:28 99
原创 UML类图中符号的含义
UML类图中符号的含义类图中的基本符号由虚线、箭头、实线、空心三角形、空心菱形、实心菱形组成,这些符号的组合构成类图的基本符号实线+箭头表示关联关系关联关系分类自身关联表示自身拥有一个自身的引用单向关联一方拥有另一方的引用,可以调用另一方的公共属性和方法双向关联双方互相拥有对方的引用,可以调用对方的公共属性和方法案例,表示C1具有C2的引用,C1可以调用C2的公共属性和方法虚线+箭头表示依赖关系一个类的实现需要另一个类的协助案例
2020-10-26 11:27:20 5131
原创 MySQL默认阻塞时间
MySQL默认阻塞时间 innodb_lock_wait_timeout 用来控制等待时间(默认50秒); 可以随时调整 innodb_rollback_on_timeout 用来设置是否在等待超时时对进行中地事务进行回滚操作(默认OFF);不可在启动时进行修改 ...
2020-10-26 08:35:39 235
原创 MySQL Explain的使用及各参数介绍
ExplainExplain介绍在执行sql语句前加上explain可以查看这条SQL语句的执行计划,便于调优案例explain select * from XXX where id=X;字段介绍id ,选择标识符SQL执行顺序的标识如果有子查询,那么id的序号会递增,id的值越大越先被查询id如果相同则自上往下顺序执行select_type,查询的类型SIMPLE,简单的select查询,不使用UNION或子查询PRIMARY,子查询中最外层查询,查询
2020-10-26 00:05:24 193
原创 MySQL锁的分类及介绍
MySQL锁分类使用方式乐观锁悲观锁级别共享锁排它锁意向锁间隙锁(Next-Key锁)锁粒度行级锁表级锁页级锁操作DDL锁MDL锁加锁方式自动锁显示锁其他死锁MVCC乐观锁和悲观锁悲观锁(Pessimistic Lock)“悲观”的认为获取锁非常有可能失败的,因此要先确保拿到锁再进行业务操作简单总结:先获取锁再进行业务操作通常使用 select for update操作来实现悲观锁,如果查询条
2020-10-26 00:05:14 183
原创 MySQL事务的理解及使用
MySQL事务事务特性原子性:事务是一个原子操作。在当原子是不可分割的最小元素,其对数据的修改,要么全部成功,要么全部都不成功。一致性:事务开始到结束的实践段内,数据都必须保持一致状态。隔离性:数据库提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。持久性:事务完成后,它对于数据的修改一是永久性的,即使出现系统故障也能够保持。事务常见问题脏读(Dirty Reads)原因:事务A读取了事务B已经修改但尚未提交的数据。若事务B回滚数据,事务A的数据存在不一致性的问题
2020-10-26 00:05:01 115
原创 Innodb和MyISAM的对比
Innodb和MyISAM的对比不同点InnodbMyISAM事务支持不支持外键支持不支持主键必须有可以没有索引聚簇索引非聚簇索引压缩(表格可以被压缩后进行查询操作)不支持支持锁的级别表、页表FULLTEXT索引不支持支持存储文件格式frm、ibdfrm、MYD、MYI...
2020-10-26 00:04:50 62
原创 CA证书、签名、摘要
CA介绍CA本身是受信任的CA给它受信任的申请对象颁发证书CA证书的工作流server在申请证书时,需要提交server的公钥、域名、申请者等信息发送给CA签名算法:首先使用Hash算法计算公开明文信息的摘要,然后使用CA的私钥对信息摘要进行加密,密文即签名摘要:使用Hash算法对明文信息加密的结果就是摘要证书:用于验证服务器或客户端的身份信息,服务器证书内容由上图可知...
2020-10-26 00:04:39 851
原创 TCP三次握手四次挥手及各状态解释
常说的三次握手和四次挥手的意思就是TCP建立连接和断开连接的过程下图为TCP三次握手和四次挥手的过程图状态或符号解释seq(sequence number),序列号,用来标记数据段的顺序,TCP把连接中发送的数据字节都编上一个序号,第一个字节的编号由本地随机产生ack(acknowlege number),确认号,指的是期望接收到下一个字节的编号,因此当前报文段最后一个字节的编号+1即为确认号ACK(acknowledgement),确认,当ACK=1确认号字段才有效,ACK=0确认号无效S
2020-10-26 00:04:14 2322
原创 HTTPS的建立过程
HTTPSSSL/TLS介绍SSL(secure sockets layer)是安全套接层TLS(transport layer security)是SSL的继承者,叫做传输层安全HTTPS就是在HTTP和TCP之间加上一层SSL/TLS加密CA介绍CA本身是受信任的CA给它受信任的申请对象颁发证书CA证书的工作流签名算法:首先使用Hash算法计算公开明文信息的摘要,然后使用CA的私钥对信息摘要进行加密,密文即签名server在申请证书时,需要提交server的公钥、
2020-10-26 00:03:49 209 1
原创 MSL最大报文生存时间默认值
MSL不同系统的默认值Windows : MSL = 2 minlinux(Ubuntu, CentOs) : MSL = 60sUnix : MSL = 30s
2020-10-25 10:02:26 3117
原创 为什么等待2MSL
下面是TCP四次挥手的图介绍一下上图中的主要关键字FIN_WAIT1是主动断开连接方发出关闭请求后的状态,表示主动方(主动断开TCP连接的一方)已经没有信息要发送给被动方CLOSED_WAIT是被动方接收到主动方的关闭请求后返回ACK响应后的状态,此时被动方应该做的是查看自身是否还有数据需要传递给主动方,如果没有则发送关闭请求FIN_WAIT2是主动方向被动方发送关闭请求后接收到响应后的状态LAST_ACK是被动方已经确定没有数据需要传递给主动方后,发送给主动方关闭请求后..
2020-10-25 10:01:14 1006
原创 浏览器输入URL发生了什么(详细解释)
浏览器输入URL发生了什么URL解析DNS域名解析建立TCP链接发送HTTP请求服务器处理请求接收响应结果关闭TCP连接浏览器解析HTML浏览器布局渲染URL解析url地址解析判断输入是否为一个合法的url,如果是合法url则进行url补全(例如,输入baidu.com,则会补全协议http或https;补全端口http默认80,https默认443;有些还会补上www等)url地址编码浏览器会将字符空格、中文、unicode等编码为16进制HSTSHSTS的
2020-10-25 09:58:06 562
原创 TCP和UDP的区别
不同点TCPUDP连接方式基于连接(发送数据前需要先建立连接)无连接(发送数据后无需连接)占用资源较多较少数据传输格式流模式数据报模式数据正确性可以保证不能保证数据顺序可以保证不能保证首部开销最小20字节8字节逻辑通信信道全双工可靠信道、无差错、不丢失、不重复、按序到达不可靠信道,不保证可靠交付、不保证顺序到达交互通信对应关系一对一一对一、一对多、多对一、多对多...
2020-10-25 09:51:27 57
原创 HTTP 1.X HTTP 2.0主要区别
多路复用HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。当然HTTP1.1也可以多建立几个TCP连接,来支持处理更多并发的请求,但是创建TCP连接本身也是有开销的。TCP连接有一个预热和保护的过程,先检查数据是否传送成功,一旦成功过,则慢慢加大传输速度。因此对应瞬时并发的连接,服务器的响应就会变慢。所以最好能使用一个建立好的连接,并且这个连接可以支持瞬时并发的请求。数据压缩HTTP1.1不支持header数据的压缩,HTTP2..
2020-10-25 09:43:16 120
原创 HTTP1.0 HTTP 1.1主要区别
长连接HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接。HTTP是基于TCP/IP协议的,创建一个TCP连接是需要经过三次握手的,有一定的开销,如果每次通讯都要重新建立连接的话,对性能有影响。因此最好能维持一个长连接,可以用个长连接来发多个请求。节约带宽HTTP 1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端如果接受到100,才开始把请求body发送到服.
2020-10-25 09:39:26 144
原创 HTTP和HTTPS的区别
不同点HTTPHTTPS安全性不安全安全信息加密明文密文默认端口80443成本低高(需要购买CA证书)连接无状态的加密传输、身份认证耗电低高响应速度快慢连接缓存高效低效占用资源低高...
2020-10-25 09:38:10 104
原创 301/302/303/307的区别及解释
状态码HTTP版本类别默认是否缓存对POST请求的处理3011.0、1.1永久缓存RFC2616:不能用GET重定向;实现:自动GET重定向3021.0、1.1临时不缓存RFC2616:不能用GET重定向;实现:自动GET重定向3031.1临时不缓存自动GET重定向3071.1临时不缓存不能自动GET重定向301为永久重定向302为临时重定向302在HTTP/1.0时规定,不能将POST请求自动转换为GET请求,但是人们在...
2020-10-25 09:34:33 1234
原创 HTTP状态码
状态码说明1XX临时响应2XX请求成功3XX重定向4XX客户端请求错误5XX服务器错误1XX——临时响应状态码说明100SC_CONTINUE继续请求者应当继续提出请求,服务器返回此代码表示已经收到请求的一部分,正在等待其余部分101SC_SWITCHING_PROTOCOLS切换协议请求者已要求服务器切换协议,服务器已确认并准备切换。HTTP1.12XX——请求成功状态码说明200SC_...
2020-10-25 09:28:28 269
原创 ThreadLocal介绍及源码分析
ThreadLocalThreadLocal介绍ThreadLocal提供给每个线程一个局部变量,它主要可以完成的功能就是线程间的隔离,即保证当前线程只能get到在当前线程set的值,其他线程get不到该线程set的值,该线程也get不到其他线程set的值。ThreadLocal通常是一个类中private static修饰的field下面以一个例子来解释一下ThreadLocal的作用。public class Demo { //初始化一个ThreadLocal实例 priv
2020-10-12 17:23:35 73
原创 CAS存在的问题及解决办法
CAS存在的问题及解决办法CAS原理见CAS介绍及底层原理ABA问题问题介绍:执行一次比较时,地址V对应的值是A,与预期值相同,但是在这期间A已经被其他线程改为B,又被一个线程改回A,那么CAS仍然会更新值。也就是说当你获得对象当前数据后,在准备修改为新值前,对象的值被其他线程连续修改了两次,而经过两次修改后,对象的值又恢复为旧值,这样当前线程无法正确判断这个对象是否修改过。解决办法:JDK1.5可以利用AtomicStampedReference类来解决这个问题,AtomicStamp
2020-10-09 22:11:44 1753 1
原创 volitale关键字及底层原理
Volitale关键字 volatile是一个特征修饰符(type specifier),它是Java虚拟机提供最轻量级的同步机制,volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。Volitale的作用作用一 可见性volitale保证了被它修饰的变量对所有线程的可见性,这里的‘‘可见性’‘是指当一条线程修改了这个变量的值,其他线程是可以立刻得知修改后的新值。接下来从一个案例和JMM角度来分析volitale如何体现可见性的。先写一个
2020-10-09 18:27:16 762
原创 native关键字作用及底层实现
Native关键字在介绍Native关键字之前,首先要知道JNI,接下来先介绍一下JNIJNI(Java Native Interface)java本地接口JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。 从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支
2020-10-09 11:42:36 431
原创 反射(Reflection)
反射(Reflection)java是一种静态语言反射是java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。Class c = Class.forName("java.lang.String")加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以使用通过这个对象看到类的结构。这个对象就像一面镜子,透过这
2020-10-09 09:56:22 332
原创 注解(Annotation)
注解(Annotation)Annotation是从JDK1.5开始引入的新技术Annotation的作用不是程序本身,可以对程序作出解释可以被其他程序(如:编译器)读取Annotation的格式注解是以“@注解名”在代码中存在的,还可以添加一些参数值Annotation在哪里使用?可以附在package,class,method,field,type,parameter,constructor,local_variable等上面,相当于给他们添加了额外的辅助信息,
2020-10-09 09:49:40 90
原创 makedown(typora)快捷键设置
以设置高亮快捷键为例初始高亮是没有快捷键的打开文件->偏好设置通用->高级设置两个配置文件随便打开一个就可以,配置方式相同,我这里以conf.user.json为例,进行如下图配置重启即可选中需要高亮部分,使用刚设置的快捷键ctrl + =即可实现高亮,快捷键也设置完成=即可实现高亮,快捷键也设置完成...
2020-10-09 09:12:41 211
原创 markdown(Typora)打开高亮
打开高亮系统默认是没有高亮的打开偏好设置重启即可需要高亮的部分前后输入两个=即可test两个=即可test
2020-10-09 09:11:14 635
原创 HashMap、TreeMap和HashTable异同及源码分析
Map特点:用于存储任意键值对(Key-Value)键:无序、无下标、不允许重复值:无序、无下标、允许重复方法:Modifier and TypeMethod and Descriptionvoidclear() 从该地图中删除所有的映射(可选操作)。default Vcompute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) 尝试计算指定键的
2020-10-07 16:04:58 119 1
原创 Vector源码分析,Vector与ArrayList的异同点
Vector数组结构实现,查询快、增删慢JDK1.0版本,运行效率慢、线程安全,JDK1.2之后也实现了List接口Vector与ArrayList的共同点都是由数组结构实现的都可以初始化数组长度Vector与ArrayList的区别Vector是线程安全的(synchronized);ArrayList不是线程安全的Vector在创建对象时可以设置容量增量(capacityIncrement)大小,capacityIncrement默认为initialCapacity
2020-10-07 15:58:31 109
原创 HashSet和TreeSet源码分析
Set特点:无序、无下标、元素不可重复方法Modifier and TypeMethod and Descriptionbooleanadd(E e) 如果指定的元素不存在,则将其指定的元素添加(可选操作)。booleanaddAll(Collection<? extends E> c) 将指定集合中的所有元素添加到此集合(如果尚未存在)(可选操作)。voidclear() 从此集合中删除所有元素(可选操作)。booleancon
2020-10-07 15:53:55 65
原创 HashMap源码分析,源码逐行解释(JDK1.8)
HashMapJDK1.2版本,线程不安全,运行效率快;允许使用null作为key和value存储结构:JDK1.8之前(数组+链表);JDK1.8之后(数组+链表+红黑树)源码分析:默认参数参数解释默认值DEFAULT_INITIAL_CAPACITY默认初始容量,必须是2的次幂1<<4MAXIMUM_CAPACITY最大容量1<<30DEFAULT_LOAD_FACTOR默认加载因子0.75fTREEI
2020-10-07 15:50:26 153
原创 Collections工具类方法介绍
Collections工具类JDK1.2注意Collections类里面的Synchronized相关方法Synchronized只对同一个对象的多线程起作用,同一个类不同的对象实例的synchronized方法是不相干扰的方法Modifier and TypeMethod and Descriptionstatic <T> booleanaddAll(Collection<? super T> c, T... elements) 将
2020-10-07 15:36:26 108
原创 LinkedList和ArrayList的区别,LinkedList源码分析带案例
LinkedList双向链表结构实现,增删快,查询慢ArrayList和LinkedList区别ArrayList必须开辟连续空间,LinkedList无需开辟连续空间ArrayList是由数组结构实现的,LinkedList是由双向链表结构实现的ArrayList查询快,增删慢,LinkedList增删快,查询慢源码分析默认参数参数解释默认值size元素个数0first链表第一个节点nulllast链表最后一个节点null
2020-10-07 15:34:32 78
原创 ArrayList源码分析带案例
ArrayList数组结构实现,查询快、增删慢JDK1.2版本加入,运行效率快、线程不安全源码分析默认参数参数解释默认值size当前数据个数0DEFAULT_CAPACITY默认容量10EMPTY_ELEMENTDATA初始数据{}DEFAULTCAPACITY_EMPTY_ELEMENTDATA初始容量及数据容量:0,数据:{}MAX_ARRAY_SIZE最大容量Integer.MAX_VALUE - 8
2020-10-07 15:28:49 70
空空如也
前天获取到的查询结果变成了promise<pending>怎么解决啊
2018-07-18
利用什么技术实现打印类似图中的出库单、单据
2018-07-08
mysql,将两个查询语局结果横向合并
2018-05-21
c语言-为什么注释这样写就会报错,而上面那样写写就不会报错
2018-02-28
TA创建的收藏夹 TA关注的收藏夹
TA关注的人