- 博客(282)
- 资源 (6)
- 收藏
- 关注
原创 MySQL访问方法
访问方法(访问类型) Const 通过主键或者唯一二级索引来定位到唯一一条满足条件的数据的访问方法称为const。特别指出,如果主键中有两个列l1和l2,查询条件中只有l1的话访问方法就不是const,因为通过l1并不能确定唯一一条记录。 特别指出,因为要求符合条件的叶子节点只有一个,所以过滤条件一定是等值匹配。 因为唯一二级索引并不规定null值只能有一个,所以select * from single_table where key2 is null(key2为唯一二级索引)的时候,访问
2023-05-14 15:53:27
1060
原创 线程池状态和线程个数
线程池中线程的个数和线程池的状态是由java.util.concurrent.ThreadPoolExecutor#ctl(以下简称ctl)表示,这是一个AtomicInteger成员变量 线程池的状态由ctl的高三位(也就是左边的三位)表示,剩下的二进制位用于表示当前的线程个数,这里需要注意,不同的计算机表示int的长度是不一样的,在64位计算机上是32,在32位计算机上是用16位(也就是说相同的线程池32位计算机中最大的线程数会比64位计算机中的少) 线程池的状态,一共有五种 pri
2021-10-31 10:20:25
516
原创 AQS 获取独占锁
java.util.concurrent.locks.AbstractQueuedLongSynchronizer#acquire 在这个方法里 public final void acquire(long arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt(); } .
2021-04-01 22:19:43
212
原创 ArrayList.add
需要先看一下ArrayList的无参构造方法,可以看到,仅仅是把数据数组设置为一个空数组而已,并没有对表示元素个数的size成员变量进行赋值 /** * Constructs an empty list with an initial capacity of ten. */ public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } 然后.
2021-03-06 16:30:21
310
原创 HashMap.resize() 下 将元素搬到新哈希表去
没有考虑树的情况,只考虑链表的情况 建议先自己看一下resize源码,琢磨之后再来看博客 这个方法中包含了对哈希表的扩容(或者初始化),把原来哈希表中的元素搬到新哈希表中去,把原来链表上的各个元素也搬到新的哈希表去 有个结论,原来的节点,无论是哈希表上的点还是链表上的点,在新哈希表中对应哈希表的下表只能是和原来下表相等或者是原来的下表加上原哈希表的长度 有一个前置知识点,哈希表中,同一个桶中的节点模哈希表的长度得到的余数是相同的,但是这些节点各自的哈希值不一定相同,也就是说,原来同一个桶中的节点,当
2021-03-06 11:08:28
174
原创 HashMap.resize() 上 对容量,阈值的调整
没有考虑树的情况,只考虑链表的情况 建议先自己看一下resize源码,琢磨之后再来看博客 这个方法中包含了对哈希表的扩容(或者初始化),把原来哈希表中的元素搬到新哈希表中去,把原来链表上的各个元素也搬到新的哈希表去Node<K,V>[] oldTab = table;// 拿到原来的哈希表,原来的哈希表长度就是旧容量int oldCap = (oldTab == null) ? 0 : oldTab.length;// 拿到原来的阈值int oldThr = threshold;
2021-03-06 10:14:59
430
原创 HashMap put
主要研究的其实是hahsmap的putVal 先说一下需要理解的点 tab[i = (n - 1) & hash]) 这样子可以算出来hash这个值模tab的长度得到的值,可以用这个的前提是tab的长度是2的N次幂,为什么会这样子呢 因为tab的个数是2的N次幂,所以tab的长度的二进制表示为 100000.... 那么长度减去1得到就是01111111... 因为一个数模一个数字得到的数是0到这个数本身,对4取模应该是0到3,对5取模应该是0到4 为什么是按位与呢?
2021-03-02 19:22:13
92
原创 建造者模式
一步步来哈,现在要造一个房子,需要建地板,墙壁和屋顶,有碧桂园和中铁可以建 首先应该有一个房子类 应该有一个碧桂园建造者类,里边有建地板,墙壁和屋顶共三个方法, 有一个中铁类,也有建地板,墙壁和屋顶共三个方法 那么很自然地就可以想到把方法和IHourse和方法抽出来,放到一个公共的父类中去 于是类图就成了这样子 当要建造一个房子的时候,客户端应该new 一个 具体的建造者,就可以了,调用器build方法就可以了 但是这样子有问题,如果有的用户暂时并不需要建造地板
2021-01-16 15:38:08
103
原创 原型设计模式
什么是原型设计模式:其实说的就是对象的克隆 什么是对象的克隆:就是将内存里的二进制复制一份,由其他引用指向 为什么需要克隆对象,而不是重新new一个呢? 有的对象创建比较麻烦,效率低 保护性拷贝,一个对象多个地方需要用到,并且有可能对对象进行修改,但是我们并不希望这些修改会互相影响 克隆一个对象简单的处理方法就是调用类的构造方法,然后将当前对象的各个属性当做参数传进构造方法里,得到一个各个属性和原来对象一样的对象 当这个类新增或者删去了某个属性的时候,就会很麻烦,
2021-01-16 09:42:34
95
原创 面向对象原则理解
单一职责原则 类层面:一个类只负责一个职责,这是为了避免如果一个类负责多个职责,对其中一个职责的相关代码进行改动,其他职责的代码可能会受到影响。所以,理解类的单一职责原则就是如果对这个类进行改动,那么这个类都会收到影响,这种影响是正常的,无可厚非的。 方法层面:参数对于方法体是纯粹的,不需要额外对方法进行分范围分别处理。 接口隔离原则 场景:类X有一个成员变量A,类Y有一个成员变量A,但是X只需要用到A里的a,b,c方法, Y只需要用到A里的a,d,e方法 做法:应该让A分别实现两个接口D
2021-01-10 23:02:37
104
原创 List 的两种遍历
两种遍历分别指的是java.util.List#replaceAll和java.lang.Iterable#forEach 对于replace来说,参数是一个UnaryOperator,遍历集合的时候,会把元素传给UnaryOperator,然后把返回值set到list中,也就是说这种遍历是会改变原来集合的 default void replaceAll(UnaryOperator<E> operator) { Objects.requireNonNull(opera
2020-12-09 23:16:42
313
原创 为什么有精度问题
首先,计算机中如何存储小数是一个叫做IEEE标准决定的 Java中float占32位,其中第三十一位为符号位 s, 第三十位到第二十三位为指数位,,剩余第二十二位到 第一位为有效数字位,也就是说,一个小数用IEEE浮点标准表示为 理解:因为M表示的是11001这样子的零一序列 M * 2^E 其实就是把M这些数字序列往做或者往右挪动E位 有一句话是: 浮点数只是对小数的粗糙近似,而不是其完全刻画 在任何两个不相等的实数中,存在着无数个两两不等的实数,但是这一点在浮点数中无法体现
2020-09-25 16:24:04
373
原创 装饰者模式
遇到的问题 有一个类 Father, 拥有 一个成员变量 private final StringName 现在有一个Father 对象 father 想要 修改这个father的name, 改不了 装饰者模式可以解决这个问题 可以 写一个类 FatherName public class FatherName extends Father{ private final String name; public FatherName(Strin...
2020-09-25 16:22:46
82
原创 java stream 学习
1、forEach 是一个终端操作 Arrays.stream(arrayOfEmps).forEach(v -> v.setPoint(10)); Arrays.stream(arrayOfEmps).forEach(v-> System.out.println(v.getName()));2、collect 是说将处理完的数据按照某...
2020-04-20 19:04:12
224
原创 effecitve java 6 过期引用
看这个出栈操作,看上去好像没有什么毛病,用书中提供的完整代码进行运行也没有什么问题 private Object[] elements;private int size = 0;public Object pop(){ if(0 == size){ throw new EmptyStackException(); } return element[-...
2020-04-16 22:49:55
150
原创 effecitve java 5 当你应该重用现有对象的时候,不要创建新对象
通过例子来看重用对象的好处 String类型 当写了这样子的代码 String test = new String("123"); 的时候,实际上创建的不是一个对象,而是两个,可以由String的源码来印证,这个构造方法传入的就是一个String对象,然后把这个String的值复制了一遍,返回这个复制后的String public String(String original) ...
2020-04-11 16:49:33
131
原创 effecitve java 4 singleton 2
在java中的工具类是不希望被实例化的,像java.lang.Math 或者 java.util.Arrays 不可以故意将一个类设计成抽象类来说明他不可以被实例化,这样子会诱导使用者觉得它是用来继承的,但是继承的子类又是可以实例化的。 好的做法是将构造器私有化,这样子话一来这个类不可以直接实例化,二来这个类也不可以被继承 public class StrongAbilityTest {...
2020-04-11 15:08:29
124
原创 effecitve java 3 singleton 1
要保证单例,那么就必须将构造器私有化,然后提供静态变量或者静态方法供客户端访问。 使用静态变量实现单例,这个静态变量应该是用final修饰的,保证他不会指向其他新创建的对象,他应该是静态的原因是因为这个类只有这一个对象,所以除了通过类找到它之外没有其他的手段可以访问到这个对象,穿插的知识点是:如果想要防御客户端通过反射执行构造方法获得对象的话,可以在构造方法里加判断,抛出异常 packag...
2020-04-11 14:35:59
108
原创 effecitve java 2 构建器
当一个类的参数有很多个的时候,有比较好构建方法 比如这个类有四个参数,可以使用几个构造器,其中一个参数的构造器调用两个参数的构造器,两个参数的构造器调用三个参数的构造器,三个的调用四个的,这种方式叫做重叠构造器 package constructors.builder;public class NutritionFacts { private final int serving...
2020-04-06 21:41:57
95
原创 effecitve java 1 静态工厂
什么是静态工厂的作用类似构造器 public static Boolean valueOf(boolean b){ return b ? Boolean.TRUE : Boolean.FALSE;} 与构造器相比,使用静态工厂有以下好处 静态工厂可以有名字,但是构造器是没有自己的名字的,他的名字只能和类名相同,就像BigInteger.problePrime方法一样。...
2020-04-06 15:29:19
123
原创 redis单线程为什么速度快
1、基本概念:一块2.gGHz的CPU,一秒可以处理2.6*10^9 条命令,一条指令就是0.38ns,切换一次线程耗时2000ns,切换线程开销是大的。2、那为什么有多线程:硬盘存取时间远远大于内存。当cpu在等待硬盘的时候,它可以先去做别的事情,比如等硬盘要一个小时,保存现场需要十五分钟,那就还有剩下的四十五分钟可以利用,不用cpu一直在等硬盘。3、redis特性:redis是基于内存的...
2020-03-30 09:54:19
111
原创 lite-spring 学习总结(一)
第一部分是关于读取配置文件,生成相应的对象 主要的接口其职责如下 BeanFactory: 主要的方法是 getBean,可以根据bean的id去创建实例对象 BeanDefiinition:这个接口主要用来保存reader类从配置文件中读取数后存放数据的地方,可以看成一个VO BeanDefiinitionRegistry:用来管理BeanDefinition们,可以想象它的实现类中...
2020-01-18 09:52:13
290
原创 mysql 面试题
题目: 给出表1,要得到表2的内容 表1: 表2:答案: SELECT deptName, COUNT(gender = 1) AS '男',COUNT(gender = 2) AS '女' FROM deptGROUP BY deptName 索引 CREATE INDEX idx_temp ON dept(deptName,ge...
2019-12-23 18:31:28
86
原创 动态规划题目:最大子序和
题目描述给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释:连续子数组[4,-1,2,1] 的和最大,为6。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/maximum-subarray...
2019-12-19 12:55:49
124
原创 9_17 AOP,Shiro, Spring启动原理了解总结
AOP: 首先是因为加上了 @EnableAspectJAutoProxy , 他会给容器导入一个 AnnotationAwareAspectJAutoProxyCreator, 这是一个后置处理器,在Spring容器启动创建剩下的bean的时候,会给相应的后置处理器一个机会去创建代理对象, 而AnnotationAwareAspectJAutoProxyCreator,就是可以拦截bean初...
2019-09-17 14:10:39
189
原创 9_16 shiro 认证和授权原理
认证 Subject 调用 login 方法,传入一个 UsernamePasswordToken(封装有账号密码) Subject 有一个 叫DelegatingSubject 的实现类,这个子类有一个 SecurityManager 类型的成员变量, DelegatingSubject 的 login 调用的就是 SecurityManager 的login方法 public vo...
2019-09-16 00:07:29
121
原创 9_14 前几天复习总结
Boolean赋值问题 下面的程序段是正确的,程序的执行流程是将 flag 赋值为 true 再去看 if 后的括号中的结果是true 还是 false, 在经过赋值之后括号中就是 true 了,所以the flag is true会被打印出来。 public static void main(String []args){ ...
2019-09-14 19:16:27
110
原创 9_7 接口类应该如何定义
这里通过反编译软件来看接口中的成员成员变量和方法是如何定义的 这是源代码 这是使用反编译软件进行反编译后得到的结果...
2019-09-07 18:31:40
150
原创 9_4 ArrayList和Vector的区别
ArrayList 和 Vector 都是存储有序的(底层都是真数组) 可以用下标取出值 允许重复的元素和空元素 public class BasicKoneledge{ public static void main(String []args){ ArrayList<Intger> integerArrayList = new ArrayList&l...
2019-09-04 19:09:13
119
原创 9_2 java 集合基础小结 Collection
数组和集合的区别: 数据的长度是不可变的,而集合的长度是可变的。 数组中既可以存储基本类型,也可以存储引用类型,而集合中只可以存储引用类型的,但向集合中存进基本类型的时候,会被自动装箱成引用类型,如 int 会被转转换成 Integer 因为需要有一个“容器”可以管理,有了集合(当然数组的长度是不可变的,如果还继续使用数组的话,那么工作的内容就会变成具体业务开发变成怎么组织这些对象数组),但...
2019-09-03 10:26:04
65
原创 9_2 导出mysql 所有数据
1、首先进入mysql 安装目录下的 bin目录2、mysqldump -uroot -proot --all-databases >/tmp/all.sql
2019-09-02 23:21:56
89
原创 9_1 ArrayList 初始化 (elementData.getClass() != Object[].class)
第一个知识点, 数组也有自己.class [ 表示维度, Lxxx表示数组的元素类型 package 集合类.ArrayList类;import java.util.ArrayList;import java.util.Arrays;public class Test { public static void main(String[] args) { S...
2019-09-02 00:21:34
2637
1
原创 9_1 String a = "a" 和 String a = new String("a");
首先指明 java 虚拟机中存在一个叫 字符串常量池 的东西, 这个常量池的数据结构是一张表,里边的每个 String 对象都会有个引用,所以常量池中的String 对象是不会被回收的。 java 中 "xxx" 都是字符串对象, 没有字面量这种东西的,每次要用到 "xxx" 的时候,都会去字符串常量池里边看有没有 value 数组是 {'x', 'x', 'x'} 的字符串对象,没有就创建一个...
2019-09-01 23:56:52
740
原创 9_1 类加载和类初始化
先看题目 package 子类静态方法不会执行;class Father{ static String fatherString = "abc"; static{ System.out.println("father static "); }}class Son extends Father{ static{ Sys...
2019-09-01 12:23:40
170
原创 8_31 String, StringBuilder, StringBuilder
String 中String 是存在于 堆中的一张表,这张表中存的是很多String 对象! 对象! 对象! 不是字面量!! 然后这这张表中的每个对象都有一个引用指向他们,所以他们不会被回收。 String 中维护一个 private final char[] value; 这就引出了另外一个问题,为什么说String是不可变的,因为iJava中的对象不可变是说基本变量的值不可变,引用类型的...
2019-08-31 23:01:56
74
原创 8_31 Math 的 round 方法
Math.ceil() 向上取整 Math.floor() 向下取整 Math.round(x) == Math.floor(x + 0.5) ;
2019-08-31 22:40:58
95
原创 8_31 两个对象的 hashcode 一样, 这两个对象使用 equals 返回值为一定 true吗?
不对, 反例如下 String 类的hashCode 方法如下 public int hashCode(){ int h = hash; if(h == 0 && value.length()){ char val[] = value; for(int i = 0; i < value.length; i++){ ...
2019-08-31 22:37:07
131
原创 8_31 == 和 equals 的区别
== 比较的是两个引用 是否引用同一片内存。 在 Object 类中,equals 方法是这样的 public boolean equals(Object obj){ return (this == obj);} 就是当我们的类没有重写 equals方法的时候,equals 和 == 的作用是一样的 java 中 String 类重写了 equals 方法 ...
2019-08-31 22:22:14
115
java实现的LSB顺序隐写
2019-07-06
jpcap 比较完成抓包示例.rar
2019-05-31
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人