数组和链表的区别
数组和链表的区别?
不同:
链表是链式的存储结构;数组是顺序的存储结构。
链表通过指针来连接元素与元素,数组则是把所有元素按次序依次存储。
链表的插入删除元素相对数组较为简单,不需要移动元素,且较为容易实现长度扩充,但是寻找某个元素较为困难;数组寻找某个元素较为简单,但插入与删除比较复杂,由于最大长度需要再编程一开始时指定,故当达到最大长度时,扩充长度不如链表方便。
**相同:**两种结构均可实现数据的顺序存储,构造出来的模型呈线性结构。
. hashmap的实现:数组+链表+红黑树
数组+链表:数组寻址容易,插入删除难;链表寻址难,插入删除容易
链表长度超过8,转变为使用红黑树
存put(k,v):首先把(k,v)封装到Node对象;然后调用hashCode()方法计算k的hash值;最后通过哈希算法将hash值转换成数组下标,下标上如果没有元素就把Node添加到该位置,如果下标对应位置有链表,比较链表中每个key的equals()返回,若全为false则添加到链表末尾,若有一个返回true则覆盖
红黑树:
节点要么黑,要么红
根节点为黑
空的(NIL/NULL)的叶子节点为黑
红节点的子节点必须为黑
从一个节点到该节点的子孙节点的所有路劲包含相同数目的黑节点
保证红黑树的方法:变色,旋转(左旋转and右旋转)
. 线程池
又以上介绍我们可以看出,在一个应用程序中,我们需要多次使用线程,也就意味着,我们需要多次创建并销毁线程。而创建并销毁线 程的过程势必会消耗内存。而在Java中,内存资源是及其宝贵的,所以,我们就提出了线程池的概念。
线程池: Java中开辟出了一种管理线程的概念,这个概念叫做线程池,从概念以及应用场景中,我们可以看出,线程池的好处,就是可以方便的管理线程,也可以减少内存的消耗。
那么,我们应该如何创建一个线程池那?Java中已经提供了创建线程池的一个类:Executor
而我们创建时,一般使用它的子类:ThreadPoolExecutor.
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
这是其中最重要的一个构造方法,这个方法决定了创建出来的线程池的各种属性,线程池中的corePoolSize就是线程池中的核心线程数量,这几个核心线程,只是在没有用的时候,也不会被回收,maximumPoolSize就是线程池中可以容纳的最大线程的数量,而keepAliveTime,就是线程池中除了核心线程之外的其他的最长可以保留的时间,因为在线程池中,除了核心线程即使在无任务的情况下也不能被清除,其余的都是有存活时间的,意思就是非核心线程可以保留的最长的空闲时间,而util,就是计算这个时间的一个单位,workQueue,就是等待队列,任务可以储存在任务队列中等待被执行,执行的是FIFIO原则(先进先出)。threadFactory,就是创建线程的线程工厂,最后一个handler,是一种拒绝策略,我们可以在任务满了知乎,拒绝执行某些任务。
- 点赞
- 收藏
- 关注作者
评论(0)