疯狂的小鸡

疯狂的小鸡

--爬坑之路

数据结构-表
散列表散列表是普通数组概念的推广。由于对普通数组可以直接寻址,使得能在O(1)时间内访问数组中的任意位置。在散列表中,不是直接把关键字作为数组的下标,而是根据关键字计算出相应的下标。 散列算法使用散列的查找算法分为两步。第一步是用散列函数将被查找的键转化为数组的一个索引。我们需要面对两个或多个键都会散列到相同的索引值的情况。因此,第二步就是一个处理碰撞冲突的过程,由两种经典解决碰撞的方法:拉链法和线性探测法。 散列表是算法在时间和空间上作出权衡的经典例子 如果没有内存限制,我们可以直接将键作为(可能是一个超大的)数组的索引,那么所有查找操作只需要访问内存一次即可完成。但这种情况不会经常...
数据结构概述
概述从概念上来说,数据结构大致可以分为表,树,图这么三大类。 线性表它最常用也最简单,就是n个数据元素的有限序列。从逻辑层次上细分的话,可以分为一般线性表和受限线性表。 一般线性表可以对元素进行自由的增删改查。一般有两种实现方式,一种是使用数组,比如ArrayList。一种是链表,比如LinkedList。当然也有一些变体,例如说循环链表、顺序表等。应用的话最常见的就是做容器了。 受限线性表主要包括栈和队列,受限就是指对结点的操作受限制。例如栈是FILO的, 出栈操作就是返回栈顶元素,而不能指定返回元素。队列就是FIFO的,出队就是出队头的元素。当然也不是绝对,比如双向队列什么的。两者都...
IO vs. NIO
面向流与面向缓冲Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。 阻塞与非阻塞IOJava IO的各种流...
IO-java.nio
NIO概述Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。 Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Selector 构成了核心的API。其它组件,如Pipe和FileLock,只不过是与三个核心组件共同使用的工具类。 ChannelChannel和Java NIO的通道类似流,但又有些不同: 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是...
IO-java.io
IO关注两类对象,一类是数据对象,一类是IO流对象。 数据对象关注数据从哪读,往哪写。对应data source 与 data destination IO流对象是是一系列流动数据,流对象链接这数据对象。IO流简单来说就是Input和Output流,IO流主要是用来处理设备之间的数据传输,Java对于数据的操作都是通过流实现,而java用于操作流的对象都在IO包中。 分类按操作数据分为:字节流和字符流。 如:Reader和InpurStream按流向分:输入流和输出流。如:InputStream和OutputStream IO流常用的基类: InputStream ...
IO-文件系统
从java 7以来,引入了Files类和Path接口。他们两封装了用户对文件的所有可能的操作,相比于java 1的File类来说,使用起来方便很多。但是其实一些本质的操作还是很类似的。主要需要知道的是,Path表示路径可以使文件的路径也可以是目录的路径,Files中所有成员都是静态方法,通过路径实现了对文件的基本操作。 File类File是文件和目录路径名的抽象表示形式,代表文件或者文件夹。 构造方法12345678// 根据parent抽象路径名和child路径名字符串创建一个新File实例File(File parent, String child)// 通过将给定路径名字符串转换为...
JVM-GC垃圾回收机制
如何判定是“垃圾”没有任何引用,就视为垃圾,所以判定方法如下: 方法一:引用计数算法1) 给对象添加计数器—>如果引用—>计数器+12) 引用失效—>计数器-13) 任何时刻计数器为0—对象不能再使用 Java中却没有使用这种算法,因为这种算法很难解决对象之间相互引用的情况 方法二:根搜索法这个算法的基本思想是通过一系列称为“GC Roots”的对象作为起始点,从这些节点向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链(即GC Roots到对象不可达)时,则证明此对象是不可用的。 那么如何选取GCRoots对象呢?在Java语言中,可以作...
JVM-类加载机制
JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化 加载加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的入口。注意这里不一定非得要从一个Class文件获取,这里既可以从ZIP包中读取(比如从jar包和war包中读取),也可以在运行时计算生成(动态代理),也可以由其它文件生成(比如将JSP文件转换成对应的Class类)。 验证这一阶段的主要目的是为了确保Class文件的字节流中包含的信息是否符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。 准备准备阶段是正式为类变量分配内存并设置类变量的初始值...
JVM-happens-before规则
在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。 happens-before原则规则 程序次序规则一段代码在单线程中执行的结果是有序的。注意是执行结果,因为虚拟机、处理器会对指令进行重排序(重排序后面会详细介绍)。虽然重排序了,但是并不会影响程序的执行结果,所以程序最终执行的结果与顺序执行的结果是一致的。故而这个规则只对单线程有效,在多线程环境下无法保证正确性。 锁定规则无论是在单线程环境还是多线程环境,一个锁处于被锁定状态,那么必须先执行unlock操作后面才能进行lock操作。 volatile变量规则vola...
JVM-内存模型JMM
从这张图中很直观的看到,程序计数器,虚拟机栈,native栈是线程私有的,堆是线程共有的,现在详细介绍JVM各个区块。 堆(Heap)是java虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域,该内存区域存放了对象实例及数组(但不是所有的对象实例都在堆中)。其大小通过-Xms(最小值)和-Xmx(最大值)参数设置(最大最小值都要小于1G),前者为启动时申请的最小内存,默认为操作系统物理内存的1/64,后者为JVM可申请的最大内存,默认为物理内存的1/4,默认当空余堆内存小于40%时,JVM会增大堆内存到-Xmx指定的大小,可通过-XX:MinHeapFreeRatio...
avatar
疯狂的小鸡
─=≡Σ(((つ•̀ω•́)つ
FRIENDS