
Java
Thexin.
不愿付诸行动,却又想登峰造极。
展开
-
读《redis设计与实现》笔记--redis数据结构
redis五大数据结构:string,hash,list,set,zset(有序集合)redis底层数据结构:简单动态字符串(SDS),链表,字典,跳表,整数集合,压缩列表底层数据结构详解:1.简单动态字符串:类似于c的结构体,但是SDS拥有记录已用长度(len)与剩余空间长度(free),当空间不足时会进行扩容。SDS最后会保存一个空字符所以SDS获取字符串长度的时间复杂度为o(1),SDS自动扩容也不会像C一样产生溢出利用未使用空间,SDS拥有空间预分配和惰性空间释放两种优化方法。原创 2021-04-12 00:08:18 · 140 阅读 · 0 评论 -
多线程下实现自增的几种方式
前情回顾:i++操作并不是原子操作,因此多线程下会达不到预期的效果,需要通过加锁或AtomicInteger或LongAdder等方法来实现。i++可以分为三步我们通过实验来观察实现i++操作的方式。下面实验中通过继承Thread实现了多线程错误方法:1.多线程下直接进行自增操作public class byte1 extends Thread{ static int a = 0; @Override public void run() { for(int .原创 2021-04-05 11:32:17 · 2670 阅读 · 2 评论 -
浅析ThreadLocal
线程本地变量每个线程独立拥有,线程存在,ThreadLocal就一直存在。使用场景:spring 事务里面有m方法,m调用了m1,m2,比如m1,m2都去访问数据库如果分别建立两个数据库连接,事务是不支持的,所以用ThreadLocal连接。线程里面有map,存的时候把 threadLocal当key,要存的值当value可以看出threadLocal中map的Entry居然继承了弱引用上面回收时,弱引用被回收之后,map中这条记录的key==null,但是这条记录删原创 2021-04-02 16:07:04 · 107 阅读 · 0 评论 -
Java四种引用
强引用:没有使用时调用System.gc()会回收eg:M m = new M(); m=null;System.gc();软引用:内存不够时就回收作用:一般使用在缓存时,比如把一些图片存储,内存不够时就自动回收弱引用:垃圾回收机制发现就回收作用:一次性使用虚引用:引用了get它的值也是null作用:管理堆外内存os从网卡读数据,jvm从os读,之后jvm如果要从网络上写出数据jsm先给os,再给网卡jvm->os这个复制过程可以省略,NIO提供了堆原创 2021-04-02 15:09:50 · 109 阅读 · 0 评论 -
synchronized与volatile
synchronized实现过程:1.Java代码:synchronized2.字节码层级:monitorenter,monitorexit3.执行过程中自动升级(偏向->自旋->重量级锁)4.cpu汇编层级:lock comxchg上图为双核cpu的内部构造,两个核共享一个三级缓存超线程:一个ALU对应多个PC,一个核里面有两个pc,线程切换时不用存之前线程的数据,直接两个pc记录运行到哪了,切换节约时间。从主存读数据的时候,按块读(局部性原理)这个块叫原创 2021-04-02 10:58:28 · 123 阅读 · 0 评论 -
对象在内存中的存储布局
对象头包含:markword(和锁相关的信息) 8字节class pointer(说明对象属于哪个类),jvm指针八字节,但是默认压缩,所有4个字节对象体包含:instance word实例数据(例如int,这就占四个字节,long就占八个)padding 对齐,整体不能被八整除,就补齐八,为了提高效率查看对象在内存中的情况,先导入classLayout jar包下载地址:https://repo.maven.apache.org/maven2/org/openjdk/jol/.原创 2021-03-31 21:40:41 · 142 阅读 · 0 评论 -
CAS
cas:Compare and Swap,即比较再交换。对CAS的理解,CAS是一种无锁算法,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。CAS(比较并交换)是CPU指令级的操作,只有一步原子操作,所以非常快。而且CAS避免了请求操作系统来裁定锁的问题,不用麻烦操作系统,直接在CPU内部就搞定了。最底层是lock cmpxchg指令,这个cpu做修改的时候不允许其他cpu操作...原创 2021-03-31 21:38:24 · 123 阅读 · 0 评论 -
HashSet源码解析(最好先看HashMap的源码解析)
HashMap的源码解析:https://mp.youkuaiyun.com/console/editor/html/106188425HashSet:Java中的一个集合类,该容器不允许包含重复的数值public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable{ static final long serialVe原创 2020-06-27 16:12:04 · 587 阅读 · 1 评论 -
synchronized和lock的区别
公平锁。syn是非公平锁,无法保证线程按照申请锁的顺序获得锁,而Lock锁提供了可选参数,可以配置成公平锁,也可以配置成非公平锁。通常来说,非公平锁的效率比公平锁要高。可中断锁。一个线程使用syn获取锁,除非该线程成功获取到锁,否则将一直阻塞住。而Lock锁提供了lockInterruptibly()接口,提供了可中断的操作。带超时时间的锁。Lock锁提供了tryLock(long time, TimeUnit unit)带超时时间的获取锁的接口,在等待指定时间后,如果获取不到锁,则放弃获取锁。转载 2020-05-27 20:08:52 · 282 阅读 · 0 评论 -
Spring AOP解析
AOP: Aspect Oriented Programming 面向切面编程。AOP底层实现原理:代理模式什么是代理模式?通过代理控制对象的访问,可以详细访问某个对象的方法,在这个方法调用处理,或调用后处理。既(AOP微实现) ,AOP核心技术面向切面编程。代理模式分为静态代理与动态代理静态代理:什么是静态代理?由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。通过别的类B代.原创 2020-05-25 16:53:55 · 147 阅读 · 0 评论 -
StringBuilder初始化容量以及扩容机制(源码分析)
我们从源码来分析一下StringBuilder的底层原理:/** * Constructs a string builder with no characters in it and an * initial capacity of 16 characters. */ public StringBuilder() { super(16); }定义一个无参的StringBuilder时,初始化容量为16.例如:StringBuild.原创 2020-05-14 14:04:04 · 1484 阅读 · 0 评论 -
ArrayList的容量
ArrayList当容量放不下元素时,容量会自动扩大那么如果把元素移除,容量会自动减小吗?package zhousai;import java.lang.reflect.Field;import java.util.ArrayList;import java.util.List;public class test {public static void main(Strin...原创 2019-11-18 22:15:03 · 242 阅读 · 0 评论 -
序列化,反序列化
今天看ArrayList的源代码,发现了里面的一个关键字transient然后查了一下,发现这个关键字是用来防止序列化的那什么是序列化呢?我又懵逼了为什么需要序列化?在当今的网络社会,我们需要在网络上传输各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都是以二进制序列的形式在网络上传送的,那么发送方就需要将这些数据序列化为字节流后传输,而接收方接到字节流后需要反序列化为相...原创 2019-11-18 21:55:23 · 102 阅读 · 0 评论 -
Java--线程同步
在单线程程序中,每次只做一件事情,后面的事情需要等待前面这件事情完成才可以进行如果是多线程程序,这件事情还没做完就又做另外一件事情,这就可能发生两个线程抢占资源的问题例如:a与b两个人都要去洗手间,洗手间只有一个位置,a还没出来,b就已经进去了,这就很尴尬。。。Java提供了线程同步的机制来防止资源访问的冲突,实际上线程安全问题来源于多个线程同时对同一对象的操作例如:下面的代码是火...原创 2019-10-15 16:24:04 · 98 阅读 · 0 评论 -
文件输入/输出流
package java15;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;public class Demo2 { public static void main(String[] args) { File file = new Fi...原创 2019-10-14 10:23:01 · 125 阅读 · 0 评论 -
Java中文件的创建
File file=new File(“text.txt”)运行这行代码,我们会发现相应的文件夹下无法找到创建的text.txt首先 File 类是对文件系统的映射 并不是硬盘上真实的文件所以 new File("xxx.xxx") 只是在内存中创建File文件映射对象,而并不会在硬盘中创建文件如果需要创建文件需要以下操作:判断映射的文件是否真实存在 file.exists() //...原创 2019-10-14 09:38:15 · 3596 阅读 · 0 评论 -
动态规划--Leetcode746
数组的每个索引做为一个阶梯,第i个阶梯对应着一个非负数的体力花费值cost[i](索引从0开始)。每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。示例1:输入: cost = [10, 15, 20]输出: 15解释: 最低花费是从co...原创 2019-09-27 20:39:30 · 127 阅读 · 0 评论 -
动态规划--Leetcode62--不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?例如,上图是一个7 x 3 的网格。有多少可能的路径?说明:m和 n 的值均不超过 100。示例1:输入: m = 3, n = 2输出: 3解释:从...原创 2019-09-27 21:05:34 · 166 阅读 · 0 评论 -
动态规划--Leetcode63.不同路径二
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。说明:m和 n 的值均不超过 100。示例1:输入:[[...原创 2019-09-29 11:36:07 · 163 阅读 · 0 评论 -
XML
XML有什么用:1.可以用来保存数据2.可以用来做配置文件3.数据传输载体1.文档声明简单声明,version:解析这个xml的时候,使用什么版本的解析器解析<? xml version = "1.0" ?>encoding:解析xml中的文字的时候,使用什么编码来翻译<? xml version = "1.0" encoding = "gbk" ...原创 2019-10-01 20:23:13 · 292 阅读 · 0 评论 -
xml--Schema约束
<?xml version="1.0" encoding="UTF-8"?><!-- xmlns: xml namespace:名称空间/ 命名空间targeNamespace:目标名称空间,下面定义的那些元素都与这个名称空间绑定上elementFormDefault: 元素的格式化情况 --><schema xmlns="http://www.w3.org/...原创 2019-10-02 12:52:17 · 173 阅读 · 0 评论 -
程序架构--BS,CS
程序架构C/S(client/server)QQ 微信 LOL优点:有一部分代码写在客户端,用户体验比较好缺点:服务器更新,客户端也随着更新,占用资源大B/S(browser/server)网页游戏:WebQQ ...优点:客户端只要有浏览器就可以了,占用资源小,不用更新。缺点:用户体验不佳。Web服务器其实服务器就是一台电脑,配置比一般的好Web服务...原创 2019-10-02 13:07:36 · 260 阅读 · 0 评论 -
Java--PATH环境变量
JDK安装成功后,对源程序首先需要进行的就是编译。在DOS环境下输入javac,会出现以下提示:'javac' 不是内部或外部命令,也不是可运行的程序或批处理文件。出现这个问题的原因是:Windows操作系统无法找到javac命令文件让我们先来看Windows操作系统是如何寻找硬盘上某个命令的呢?--首先它会在当前目录下搜索--当前目录如果搜索不到,他会从环境变量path指定...原创 2019-09-06 14:06:31 · 2090 阅读 · 0 评论 -
Java的加载与执行
Java的运行包含两个特别重要的阶段:编译阶段,运行阶段。编译阶段:编译阶段的主要任务是检查Java源程序是否符合Java语法。 符合Java语法则能够生成正常的字节码文件(xxxx.class) 不符合Java语法规则则无法生成字节码文件 字节码文件中不是纯粹的二进制,这种文件无...原创 2019-09-06 12:58:10 · 384 阅读 · 0 评论 -
Java语言的特性
1.简单性。Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用Java。2.面向对象。Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。3.Java语言是分布式的。Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个...原创 2019-09-06 10:46:11 · 535 阅读 · 0 评论 -
java中的foreach
foreach 并不是java中的关键字,是for语句的特殊简化版,在比那里数组,集合时,foreach更加简单快捷,从字面上的意思理解 foreach 也就是 “ for每一个 ”的意思,那么到底怎么使用 foreach语句呢?语法: for(元素类型 元素变量:遍历对象){ 执行的代码}例如:在编辑器中定义了一个整型数组 scores ,保存学生成绩信息,通过 Arrays 类的 s...原创 2018-02-08 18:03:43 · 321 阅读 · 0 评论 -
java 开发环境的搭建
这里主要说的是在windows 环境下怎么配置环境。1.首先安装JDKjava的sdk简称JDK ,去其官方网站下载最近的JDK即可。。http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html点击下载好的exe文件安装即可。2.接下来我们需要配置环境变量xp系统下 右键‘我的电脑’——属...原创 2018-02-07 23:46:15 · 302 阅读 · 0 评论 -
java--自动装箱,拆箱
自动装箱:把基本类型转换为包装类类型自动拆箱:把包装类类型转换为基本类型之前无法自动装箱时:public static void main(String[] args){ int x =100; Integer i1 = new Integer(x); //将基本数据类型包装成对象,装箱 int y = i1.intValue(); //将对象...原创 2019-09-17 17:18:36 · 86 阅读 · 0 评论 -
Java中注释的使用
如何在Java中使用注释在编写程序时,经常需要添加一些注释,用以描述某段代码的作用。一般来说,对于一份规范的程序源代码而言,注释应该占到源代码的 1/3 以上。因此,注释是程序源代码的重要组成部分,一定要加以重视哦!Java 中注释有三种类型:单行注释、多行注释、文档注释运行结果: Hello Imooc!看:被注释的代码块在程序运行时是不会转载 2018-02-06 20:46:54 · 180 阅读 · 0 评论