概念:相对于面向过程而言,把世界中的实体都看成是一个对象,,把对象抽象成类,具有一定的属性和方法,有三大基础特征,封装、继承和多态。
概念:当运行的Java程序的时候,JVM(Java虚拟机)会进行类加载,加载是生成的class文件,创建一个Class对象。类加载器主要分为三类。BootClassLoader(启动类加载器)、ExtClassLoader(扩展类加载器)、AppClassLoader(系统类加载器)
加载过程:加载一个class文件的时候,基于双亲委模型来加载;AppClassLoader首先调用ExtClassLoader来加载,ExtClassLoader委托BootClassLoader来加载;当父类无法加载的时候,会让其子类来加载;当所有类都无法加载class文件的时候,引发一个ClassNotFounfException异常,表示无法找到该类文件。
1、封装:利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但是可以通过对外提供的接口来访问该对象。
优点:
2、继承:继承是一种父与子的关系,继承的好处在于将子类共性的东西提取到父类中让子类做更少的事情,因此达到代码的复用性,这样使整个结构更加清晰。Java中只能是单继承的关系,也就是一个子类只能有一个父类但是一个父类可以有多个子类;在Java中所有的类默认父类都是Object;在继承的时候使用extends关键字
3、多态:一个对象具有多种形态的体现,多态的前提就是必须有继承。因为在不同的场合或者业务场景中,子类是可以替换父类完成具体的某种事情。
1、抽象类:当一个类不能具体去描述一个对象的时候,我们认为它是抽象的,因此抽象类是不能用来创建实例来使用的,主要用来继承。
2接口:接口比抽象类更为抽象的一个组件,他主要是用于定义行为的标准。因此接口是用来被实现的,使用implements关键字实现。
概念:存储同一类型数据的容器 ---大小不固定
分类:
List:ArrayList、LinkedList、Vector(过时,了解)
Set:HashSet、TreeSet ---散列集合:不包含重复的元素
概念:双列集合,是集合框架的成员。一个键对应一个值。键是唯一的,值可以重复。
分类:HashMap、HashTable、CourrentHashMap
HashMap是非同步的,HashTable是同步的;需要同步的时候使用ConcurrentHashMap;HashMap允许为NULL,HashTable不允许为NULL。
详细介绍:https://blog.csdn.net/m0_38010471/article/details/86157902
概念:二分查找又称为折半查找,适用于排好序的顺序表。
基本思路:首先将给定的查找值K,与表中的中间位置的元素的关键字进行比较,若相等,则返回该元素的位置;若不等,表明所需查找的元素只能在中间元素的前半部分或者后半部分中;然后在缩小的范围中继续同样的查找,如此反复直到找到为止。
实现方式:递归实现和非递归实现
优缺点:
详细介绍:https://blog.csdn.net/m0_38010471/article/details/85263557
概念:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是CPU调度的最小单位)注:进程是资源分配的最小单位,每个进程至少包含一个线程
线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止
public class MyThread extends Thread{//继承Thread类
public void run(){
//重写run方法
}
}
public class Main {
public static void main(String[] args){
new MyThread().start();//创建并启动线程
}
}
public class MyThread2 implements Runnable {//实现Runnable接口
public void run(){
//重写run方法
}
}
public class Main {
public static void main(String[] args){
//创建并启动线程
MyThread2 myThread=new MyThread2();
Thread thread=new Thread(myThread);
thread().start();
//或者 new Thread(new MyThread2()).start();
}
}
2、启动线程:调用线程的start()方法
①sleep(long millis): 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
②join():指等待t线程终止。
③yield():暂停当前正在执行的线程对象,并执行其他线程。
④setPriority(): 更改线程的优先级。
⑤interrupt():不要以为它是中断某个线程!它只是线线程发送一个中断信号,让线程在无限等待时(如死锁时)能抛出抛出,从而结束线程,但是如果你吃掉了这个异常,那么这个线程还是不会中断的!
线程类的一些常用方法:
sleep(): 强迫一个线程睡眠N毫秒。
isAlive(): 判断一个线程是否存活。
join(): 等待线程终止。
activeCount(): 程序中活跃的线程数。
enumerate(): 枚举程序中的线程。
currentThread(): 得到当前线程。
isDaemon(): 一个线程是否为守护线程。
setDaemon(): 设置一个线程为守护线程。(用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束)
setName(): 为线程设置一个名称。
wait(): 强迫一个线程等待。
notify(): 通知一个线程继续运行。
setPriority(): 设置一个线程的优先级。
概念:指在同一程序中有多个顺序流在执行。在多线程编程中,有可能会出现同时访问同一个资源的情况,这种资源可以是各种类型的的资源:一个变量、一个对象、一个文件、一个数据库表等,而当多个线程同时访问同一个资源的时候,就会存在一个问题。
解决办法:
1、同步代码块-Synchronized关键字
互斥锁:如果对临界资源加上互斥锁,当一个线程在访问该临界资源时,其他线程便只能等待。
2、Lock
CountDownLatch是JDK 5+里面闭锁的一个实现,允许一个或者多个线程等待某个事件的发生。CountDownLatch有一个正数计数器,countDown方法对计数器做减操作,await方法等待计数器达到0。所有await的线程都会阻塞直到计数器为0或者等待线程中断或者超时。
栅栏(CyclicBarrier):栅栏类似于闭锁,它能阻塞一组线程直到某个事件发生。 栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。
1、常用线程池
newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool:创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
2、自定义线程池:
public ThreadPoolExecutor(int corePoolSize,//核心线程数--线程池初始化创建的线程数量
int maximumPoolSize,//最大线程数,线程池中能创建的最大线程数
long keepAliveTime,//线程存活时间
TimeUnit unit,//线程存货时间单位
BlockingQueue workQueue,//一个阻塞队列
ThreadFactory threadFactory//拒绝策略
)
{……}
3、拒绝策略
jdk给我们提供了一些拒绝策略
1.AbortPolicy:直接抛出异常,系统正常工作。(默认的策略)
2.CallerRunsPolicy:只要线程池未关闭,该策略直接在调用者线程中执行,运行当前被丢弃的任务。
3.DiscardOrderstPolicy:丢弃最老的请求,尝试再次提交当前任务。
4.丢弃无法处理的任务,不给于任何处理。
如果需要自定义策略,需要实现RejectedExecutionHandler接口。
特点:
左子树上所有结点的值均小于或等于它的根结点的值。
右子树上所有结点的值均大于或等于它的根结点的值。
.左、右子树也分别为二叉排序树。
B-tree树即B树,B即Balanced,平衡的意思。B-树是一种多路搜索树(并不一定是二叉的)---平衡多叉树
一个m阶的B树具有如下几个特征:
1.根结点至少有两个子女。
2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m
3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m
4.所有的叶子结点都位于同一层。
5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。
优点:
B树比二叉树强的地方就在于,同样的数据,B树更矮胖,以及B树可以达到自平衡结构。
概述:B+ 树是一种树数据结构,是一个n叉排序树,每个节点通常有多个孩子,一棵B+树包含根节点、内部节点和叶子节点。根节点可能是一个叶子节点,也可能是一个包含两个或两个以上孩子节点的节点。
特点:
1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。
概述:红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构
特点:
1.节点是红色或黑色。
2.根节点是黑色。
3.每个叶子节点都是黑色的空节点(NIL节点)。
4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
调整的方式是通过变色和旋转
变色是为了重新符合红黑树的规则,尝试把红色节点变为黑色,或者把黑色节点变为红色。
概念:是一种随机化数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作需要O(log n)平均时间),并且对并发算法友好。
应用:Skip list(跳表)是一种可以代替平衡树的数据结构,默认是按照Key值升序的。Skip list让已排序的数据分布在多层链表中,以0-1随机数决定一个数据的向上攀升与否,通过“空间来换取时间”的一个算法,在每个节点中增加了向前的指针,在插入、删除、查找时可以忽略一些不可能涉及到的结点,从而提高了效率。
跳跃表-原理及Java实现:https://www.cnblogs.com/acfox/p/3688607.html