策略模式--- 1.策略模式:定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。这种经典的策略模式,使得客户端不够简洁,理论上客户端不需要管这个对象怎么创建,只需要调用功能就好了。所以常常和简单工厂模式结合。(1)抽象策略角色: 策略类,通常由一个接口或者抽象类实现。(3)环境角色:持有一个策略类的引用,最终给客户端调用。(2)具体策略角色:包装了相关的算法和行为。定义,代码 摘自 《大话设计模式》场景类,传入你要选择的算法。
简单工厂模式 通过 不同 的 传入参数来实例化不同类的实例对象,即专门创建一个类来实现其它类的实例。抽象类---计算方法 , 这里有一个抽象方法,getResult需要子类自己去实现。优点:使用者不需要考虑调用特定类的内部实现。缺点:当有新的需求时,需要去修改工厂类。简单工厂类---利用多态返回父类引用。被创建的实例通畅具有共同的父类。子类----加法计算。
hashmap的一些坑 1.不存在 下标,key 相同的两个Node,因为在putVal()方法中,当存在key和桶位相同的情况的时候,会进行替换操作。这个疑惑是看replace源码时联系到的,当你删除元素时,我在想如果存在key相同的情况怎么办,但是实际上只会有一个这样的node。3.若在一个桶位的上的链表很长且达到扩容阈值但是没有达到树化条件,即使我的table只有这一个桶位 不为null,我仍然进行扩容操作,为了提高查询效率。2.指向一个变量的引用,若为null,那么在没有更新它之前,不管变量怎么变,这个引用还是null。
磁盘的工作方式 磁道就是磁盘存储数据的介质,磁道上布有一层磁介质通过磁头可以使磁介质的极性转换为操作系统的数据信号。磁道上真正存储数据的部分不是连续的,所以又产生了 扇区 的概念。(从磁盘的角度来看,需要找到所在磁道,然后磁头转到所在扇区)。磁盘分区其实是通过分磁盘柱面实现的,每个磁盘分区都有起始柱面和结束柱面,而分区的容量也可以通过这个来计算的。假如你的东西都在一片连续的区域,就省去了 寻道,旋转时延。将磁盘比喻为一个传送带,传送带上有你想要的东西(即数据)。相关概念:磁头,盘片,盘面,磁道,柱面,扇区等。...
HashMap 的哈希函数 在进行 下一步计算时, (n-1) &hash , 由于数组的长度不会太大,那么高位的数字都被屏蔽了,简单来说,高16位变得对整体哈希没有影响。即我的最终计算的哈希值无高位特征。异或运算能更好的保留各部分的特征,如果采用&运算计算出来的值会向0靠拢,采用|运算计算出来的值会向1靠拢。若为奇数,减一之后,那么二进制数为1个0和一堆0,那么你的key都放在这两个地方.然后 异或 (哈希码右移16位) ,其中是哈希码是32位二进制。异或后得到的32位数字 ,高位仍然保持不变,但是低位融合高位的特征。
i++的问题 3)线程 A 执行完 iadd 并且 putfield ,此时 得到 temp = i+1,得到temp=6 ,并将temp的值传给主存中的i(6),然后线程B的拷贝得到的i失效;但是此时线程B已经执行完了temp= i+1,不需要计算,但是temp(6)仍然是未自增的i+1,再进行 i=temp(6) ,导致少加了一。单一的写操作和读操作 都是原子操作,但是i++不是原子操作,即使加了volatile,也不能保证其原子性。假若两条线程 同时执行 i++ 假设i=5。
如何理解什么是存储引擎? 存储引擎的目的就是 怎么去存储数据,在磁盘中怎么去组织数据,怎么组织数据会让数据查询更加高效,存储更加高效,有更多的吞吐量等。执行器会驱动 存储引擎去工作,但是执行器并不是真正工作,只是调用存储引擎提供的接口。我在客户端输入SQL语句,经过Server层的分析,优化,到达执行器。存储引擎对底层磁盘上的数据库进行了封装。底层数据库是 飞机,存储引擎 是发动机,。
InnoDB体系架构 将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新,合并插入缓冲,UODO页的回收等IO Thread负责IO请求的回调处理当事务提交后,undolog可能不在需要,因此需要 Purge Thread 来回收已经使用并分配的undo页进行 脏页 的刷新操作。
深入理解JVM----垃圾回收算法 在说一下好处:如果不进行对象移动,肯定会产生很多内存碎片,那么当忍无可忍时,我们就只能这么办了,借助OS的非连续内存分配技术,来给我的对象分配内存,那么你的对象内存区域不连续,肯定有一个页表来记录它,这样的话,访存的次数大概率会增加,那么我的应用程序的吞吐量降低了,这是我们不太想看到的。每次只适用其中一块,当这一块的内存用完了,就将存货的对象复制到另一块中。思想:首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,当然也可以反过来,标记存放的对象。基于以上的思想,人们改进了此方法。
计算机网络 0816 区别在于:每个 请求/响应对 是经一个单独的TCP连接发送,还是所有的 请求/响应对 经相同的TCP连接发送。套接字是 应用程序进程 和 传输层协议 之间的接口,其实就是传输层协议给上层应用层提供的一个服务。Web应用 包括:一个应用层协议HTTP,文档格式的标准HTML,Web浏览器,Web服务器。网络层提供了主机之间的逻辑通信,传输层为运行在不同主机上的进程之间提供了逻辑通信。条件GET方法--- 用于更新代理服务器的对象,保证对象是最新被修改过的。同一个主机之间的进程通信 属于OS的范畴。...
计算机网络 0815 分组交换机 目前比较流行的是 路由器 和 链路层交换机,路由器主要用于网络核心中, 链路层交换机 通常用于 接入网。主机/端系统 字面上是狭义的概念,现在但凡是网络设备都属于主机/端系统的范畴。我们所用的端系统就处在网络边缘,处于一种接入与不接入网的状态。将今天的知识点提炼出来,明天复习一下,这本黑书还是有点东西的,没那么好消化。排队时延导致的分组交换机的输出缓存爆满,从而丢包。节点处理时延,排队时延,传输时延,传播时延。电路交换网络中的复用?为什么要有存储的动作呢?分组交换中的时延,丢包,吞吐量问题?..
0815----- 对于编译器来说,他只认识引用,而不去new对象,只直到父类的引用类型是Animal,会去字节码文件中去找Animal的那个方法。运行阶段的时候,实际上在堆内存中创建的是子类的对象,所有调用方法时,真正参与此方法的对象是子类对象,所以运行阶段会动态执行子类的方法。因为编译器只知道a2的类型是Animal,去Animal字节码(class)文件中去找catchMouse(),但是找不到,所以静态绑定失败。理论上我的子类是具有此方法的,但是你发现你无法 "." 出来,这是编译阶段的问题。编译不成功,无法运行。..