笔记
xiaoxiao学Java
这个作者很懒,什么都没留下…
展开
-
redis中zset的zrank与zscore操作时间复杂度的理解
随笔原创 2022-06-12 23:26:32 · 1922 阅读 · 1 评论 -
加权随机算法随笔
开发一个加权随机算法:核心主要有两点,一个是概率补偿,一个是即时更新权重占比 public static <T> Set<T> weightRandomSelect(Map<T, Double> weightMap, int k) { double weightSum = 0; Set<T> result = new HashSet<>(); for (Map.Entry<T, Dou原创 2022-04-13 00:00:23 · 459 阅读 · 0 评论 -
git使用中遇到的问题
1、开发分支使用reset之前版本之后无法push成功<-- 强制推送>git push -f origin <branch name>2、回退分支之前的版本reset,可以先使用git reflog来查到对应的commit id 之后使用git reset --hard <commit id>学习过程中...原创 2022-02-28 18:46:32 · 309 阅读 · 0 评论 -
HashMap的resize()方法回顾
final Node<K,V>[] resize() { Node<K,V>[] oldTab = table; int oldCap = (oldTab == null) ? 0 : oldTab.length; int oldThr = threshold; int newCap, newThr = 0; if (oldCap > 0) { if (oldCap >.原创 2022-02-23 20:22:40 · 90 阅读 · 0 评论 -
大量ip找出出现次数最多的100个的一些理解
我们可以就是借鉴索引这一思想,在磁盘中维护一个B+树索引,然后依次统计每一个数据出现的次数,每一次在内存中遍历到一个数据时都会将他放入到索引中,若是索引中已经存在了,那么就将数量+1,最后我们再维护一个大小为100的小顶堆来找到出现最多的100个。之所以使用索引来存数据是因为我们在遍历到一个数据的时候可以利用索引的快速查找来确定这个数据是否在之前已经出现过了。...原创 2021-12-03 21:48:56 · 345 阅读 · 0 评论 -
对于使用redis中的list来做到公众号推送的一些理解
我们可以假设有一个公众号是A,又111,222,333三个人订阅了它,那么当它发文章的时候我们怎么可以利用redis中的list这一数据结构来做到推送的效果呢?我们可以建立一个list,key就是Aid,value就是订阅它的读者111,222,333。每一个读者也是有一个list的,他们list的内容就是所有推送的文章id,当发布文章的时候,就可以遍历list,像每一个元素的链表中指向一个lpush的指令,将这篇文章添加到读者的list中。以上是自己的一些理解,希望大家指正。...原创 2021-10-06 11:26:26 · 179 阅读 · 0 评论 -
对于为什么线程在io操作时需要阻塞的一些理解
为什么线程在io操作时需要阻塞呢,根本原因应该是CPU的运行速度要远超过一个io的速度,CPU不可能去等待一个要很久才能完成的io操作,所以就是当进行io操作时线程需要进入一个阻塞状态(当然,异步io的话是线程也不去等待io了,当数据准备好的时候来通知线程就好了,此处讨论阻塞io),当数据准备好了之后,才会再次进入一个CPU运行队列执行接下来的操作。为什么io的操作CPU只需要下一个指令,而不是要全程等着呢(这是我的一些理解,仅用于自己笔记,可能会有错误,也希望大家指正)我的理解是CPU就像是我们的大脑,原创 2021-10-01 14:55:44 · 2190 阅读 · 0 评论 -
对于Java的强、软、弱、虚引用的理解
强引用:就是我们new出来的引用对象,只要这个引用还存在对象就不会被gc回收,内存不足会出现oom软引用:软引用平常不会被回收,但是jvm在出现oom之前会回收所有的软引用来空出空间,也就是软引用不会导致oom,因为它在oom之前一定会被回收,应用场景:可以用于高速缓存,如果内存还足够就暂时保留缓存,如果内存不足了就清理删除。弱引用:如果遇到垃圾回收就会被回收,但是由于gc线程的优先级较低,所以弱引用有时也可以存活一段较长时间,ThreadLocal就是应用了弱引用,ThreadLocalMap的key原创 2021-09-26 23:34:17 · 68 阅读 · 0 评论 -
关于Spring解决循环依赖的一些理解
此文仅以文字形式记录自己的一些理解Spring是采用了三级缓存的方式来解决循环依赖的问题的,一级缓存:存储的是已经初始化完成的实例对象二级缓存:实例化了但是还没有属性注入的对象三级缓存:实例化了但是还没有属性注入的对象二级和三级缓存有什么区别呢?其实若是单纯的想要解决循环依赖的问题,我们只需要二级缓存就可以解决了,具体流程如下:比如说A和B相互依赖,我们先对A初始化,在实例化之后,将A放入到三级缓存中,注入属性时发现没有B,那么去对B初始化,b实例化后注入属性去找A,在三级缓存中找到A,完成属性原创 2021-09-20 15:19:24 · 46 阅读 · 0 评论 -
关于ArrayList最大容量的一些理解
直接上源码源码中显示了最大容量时Integer.MAX_VALUE - 8;是不是到此就结束了,显然不是,我们来看看这句源码的注释要分配的最大数组大小。有些虚拟机在数组中保留一些头字。尝试分配较大的数组可能会导致OutOfMemoryError:请求的数组大小超过VM限制意思就是有些虚拟机时需要占用一部分空间来存对象头的(我的理解),Java为了保证不会出现OOM,所以就出现了Integer.MAX_VALUE - 8;但是我么要注意到是有些,所以就有了下面这段代码,我们首先来看grow方法,原创 2021-09-12 15:29:39 · 412 阅读 · 0 评论 -
关于Java泛型擦除的一些理解
泛型擦除:泛型是jdk1.5之后引入的概念,但是为什么可以和之前的版本兼容呢?就是因为采用了泛型擦除的机制,泛型信息只保留在编译阶段,在进入JVM之前,会发生泛型擦除public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>(); list.add(1); try { Method add = list.g原创 2021-09-11 22:30:33 · 104 阅读 · 0 评论 -
关于lamda表达式必须使用局部变量时需要时隐式final的一些理解
lamda表达式是会被编译器编译成一个内部类的,而内部类访问局部变量是必须要求变量不可变的,为什么呢?因为Java是可以支持一个类访问另一个类的成员变量,但是不支持一个类(包括内部类)访问另一个类的局部变量的,那么Java是怎么解决的呢,答案是编译器会将类中的局部变量拷贝出来一个副本,传入到内部类作为成员变量,因此,为了保证数据的一致性,该变量必须是不可变的。这也就解释了lamda必须使用隐式final局部变量了...原创 2021-09-09 21:46:38 · 132 阅读 · 0 评论 -
关于Java中接口能否被继承的理解
接口是Java中一种特殊的抽象类,是常量值和方法定义的集合类的继承Java中类是但继承的,但是可以实现多个接口,相信这个大家都是知道的,不允许类继承多个类的原因是,当两个父类中有同一个方法,那么子类应该继承哪个呢,但是实现多个接口就没有这一问题,因为我们是需要去实现这一方法的。但是jdk1.8之后接口引入了默认方法,那么当两个被实现的接口含有同名的默认方法呢在这里插入代码片`interface A{ default void a(){ System.out.println("原创 2021-09-08 16:43:42 · 757 阅读 · 0 评论 -
关于hashmap头插法和尾插法的理解
头插法的初衷是设计者遵循一个新加进来的元素可能被使用的频率更高,这其实是一个伪命题,因为在hashmap扩容的时候,链表也是会发生颠倒的,因为是先从头节点开始转移掉新的hash表中。头插法还有一个致命的缺点,就是在多线程下会出现循环链的情况,导致死循环具体是怎么死循环的可以理解为因为扩容是会有一个颠倒的机制,所以多线程操作的时候有可能出现线程1让A->B 而线程2让B->A,导致了循环,jdk1.8之后改为尾插法自己的理解,希望指正...原创 2021-09-06 12:00:27 · 6412 阅读 · 0 评论 -
对于接口和抽象类的理解
接口时对行为的一种抽象,而抽象类是对事物的是一种抽象,抽象类是对事物的整体抽象,包括属性、行为等,而接口只是对行为的一种抽象,比如说鸟和飞机都会飞,我们就可以将飞这一行为抽象出来一个接口Fiy,里面可以有一个fly();而鸟抽象为一个类Bird,飞机为Aplane,它们两个都可以去实现Fly接口...原创 2021-09-05 23:23:38 · 50 阅读 · 0 评论 -
关于同步和异步的理解
同步和异步在很多人眼里都是一种只可意会不可言传的思想在我的理解中同步就是一个线程执行一件事它会一直等到有返回结果之后再去执行下一件事异步就是一个线程执行一件事,他将任务提交之后不会等待返回值,而是直接去执行下一件事,当之前的返回值出现的时候再去通知其他的线程,可以提高效率一些自己的理解,希望指正...原创 2021-09-01 17:31:00 · 42 阅读 · 0 评论 -
关于静态变量的访问问题
静态变量可以通过类名点直接访问,也可以通过实例对象访问但是我们一般都建议通过类直接访问,那么是为什么呢?看一下上面一段代码,是不是觉得写的有问题,是一段一定会出现空指针异常的代码,那么结果一定是让你大吃一惊。为什么会出现这种奇怪的现象呢,一个null怎么也能访问到类变量呢?通过字节码指令7我们可以看到,其实在编译期间编译器就已经将代码优化成了类名点访问的形式了...原创 2021-08-31 23:26:57 · 1637 阅读 · 0 评论 -
关于包装类缓存机制的理解
Java基本类型的包装类的大部分都实现了常量池技术。Byte、Short、Integer、Long、这4种包装类默认创建了[-128,127]的相应类型的缓存数据,Character创建了[0,127]范围的缓存数据 Integer i1 = new Integer(20); Integer i2 = 20; System.out.println(i1 == i2);上面这段代码就是一个典型的例子,Integer i2 = 20;就是使用的常量池中的对象,而Int原创 2021-08-31 15:02:34 · 229 阅读 · 0 评论 -
从字节码的角度来浅述i++和++i的区别
public static void main(String[] args) { int i = 10; int j = 20; i = i++; j = ++j; System.out.println(i); System.out.println(j); }上述代码中结果下面我们从字节码来解释这一现象0,2指令的作用是将10添加到局部变量的索引1的位置3,5指令的作用是将20添加到局部变量原创 2021-08-24 23:46:08 · 93 阅读 · 0 评论 -
关于Java多态原理的理解
关于Java多态的理解1、分类可以分为编译时多态和运行时多态编译时多态就是方法的重载,运行时多态就是方法的重写2、关于运行时多态的理解本文主要就是对于运行时多态的理解,运行时多态的基础是方法表,类在加载的时候会在方法区生成一个方法表,方法表中的每一个项都是对应方法的指针,从上至下依次为Object类方法、父类方法、子类方法,如果子类改写了父类的方法,那么子类将替换方法表中和父类方法同名的表项,因此,方法表的偏移量总是固定的。即父类中的方法在父类的方法表和子类的方法表的偏移量一致,在父类中是第几个原创 2021-08-24 21:20:27 · 44 阅读 · 0 评论 -
关于非静态内部类不能创建static变量和方法的理解
内部类可以看作是外部类的普通成员,那么它的加载就只能发生在外部类创建实例时,而Java要求所有的static变量都是要在创建实例前加载完成的,如果我们通过类直接访问static,此时就会出现内部类没有加载而我们却要访问他的成员,自然是不行的,我的理解中之所以static final修饰的基本数据类型是允许在内部类的原因是,这样声明的常量是属于编译时常量的,在外部类加载时就已经进入方法区里的常量池了,所以访问这个变量不需要加载内部类,自然是允许的,但是其他的运行时常量也是不被允许的...原创 2021-08-24 18:34:05 · 216 阅读 · 0 评论