Java核心知识点总结

一、面向对象

概念:相对于面向过程而言,把世界中的实体都看成是一个对象,,把对象抽象成类,具有一定的属性和方法,有三大基础特征,封装、继承和多态。

1、类加载器和加载过程

概念:当运行的Java程序的时候,JVM(Java虚拟机)会进行类加载,加载是生成的class文件,创建一个Class对象。类加载器主要分为三类。BootClassLoader(启动类加载器)、ExtClassLoader(扩展类加载器)、AppClassLoader(系统类加载器)

加载过程:加载一个class文件的时候,基于双亲委模型来加载;AppClassLoader首先调用ExtClassLoader来加载,ExtClassLoader委托BootClassLoader来加载;当父类无法加载的时候,会让其子类来加载;当所有类都无法加载class文件的时候,引发一个ClassNotFounfException异常,表示无法找到该类文件。

2、面向对象的三大特征

1、封装:利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但是可以通过对外提供的接口来访问该对象。

优点:

  • 减少耦合:可以独立地开发、测试、优化、使用、理解和修改
  • 减轻维护的负担:可以更容易被程序员理解,并且在调试的时候可以不影响其他模块
  • 有效地调节性能:可以通过剖析确定哪些模块影响了系统的性能
  • 提高软件的可重用性
  • 降低了构建大型系统的风险:即使整个系统不可用,但是这些独立的模块却有可能是可用的

2、继承:继承是一种父与子的关系,继承的好处在于将子类共性的东西提取到父类中让子类做更少的事情,因此达到代码的复用性,这样使整个结构更加清晰。Java中只能是单继承的关系,也就是一个子类只能有一个父类但是一个父类可以有多个子类;在Java中所有的类默认父类都是Object;在继承的时候使用extends关键字

3、多态:一个对象具有多种形态的体现,多态的前提就是必须有继承。因为在不同的场合或者业务场景中,子类是可以替换父类完成具体的某种事情。

  • 引用多态:父类的引用类型,子类的对象---向上造型   eg:  Animal  animal  =  new  Cat() ;
  •  行为上的多态:通常会在子类中重写父类的方法,来完成具体的功能。编译时看父类,运行时看子类。

3、抽象类和接口

1、抽象类:当一个类不能具体去描述一个对象的时候,我们认为它是抽象的,因此抽象类是不能用来创建实例来使用的,主要用来继承。

  • 抽象类有自己的构造方法和其他具体的方法
  • 抽象类可以有抽象方法,必须使用abstract关键字修饰,这个方法必须由子类来实现
  • 抽象类不能使用new关键字来创建实例
  • 定义抽象类必须使用abstract关键字声明
  • 当一个类中只要有一个抽象方法,这个累就必须是抽象类
  • 抽象类可以定义实例变量、静态变量以及常量
  • 抽象类可以再继承抽象类,也可以继承普通的类

2接口:接口比抽象类更为抽象的一个组件,他主要是用于定义行为的标准。因此接口是用来被实现的,使用implements关键字实现。

  • 接口只能定义常量
  • 接口只能定义抽象方法
  • 皆苦只能继承接口,不能继承普通的类和抽象类
  • 接口是没有构造方法的

二、集合框架

1、集合

概念:存储同一类型数据的容器   ---大小不固定

泛型---在集合中的作用是用于表示元素类型    ---由于泛型的限制,集合中只能存储对象

分类:

List:ArrayList、LinkedList、Vector(过时,了解)

  • ArrayList:底层依靠的是数组来存储的数据,内存空间是连续的,默认初始容量是10,每次扩容是在原来的基础上增加一半,基于右移。增删操作相对复杂,查询操作相对简单,是一个线程不安全的列表。
  • LinkedList:基于节点(Node)来实现的,利用节点来存储数据以及维系链表之间的每一个节点的关系。增删操作相对简单,查询操作相对复杂。是一个线程不安全的列表。
  • Vector,基于数组实现的连续内存的集合,同步的,每次扩容为原来的一倍,默认初始容量是10.是一个线程安全的列表。

Set:HashSet、TreeSet  ---散列集合:不包含重复的元素

  • HashSet:不保证元素的存入顺序,底层是基于HashMap来进行数据的存储。默认初始容量为16,默认加载因子为0.75f。
  • Java核心知识点总结_第1张图片

2、映射-Map

概念:双列集合,是集合框架的成员。一个键对应一个值。键是唯一的,值可以重复。

分类:HashMap、HashTable、CourrentHashMap

  • HashMap和HashTable的区别

HashMap是非同步的,HashTable是同步的;需要同步的时候使用ConcurrentHashMap;HashMap允许为NULL,HashTable不允许为NULL。

Java核心知识点总结_第2张图片

  • ConcurrentHashMap---异步式线程安全的映射

详细介绍:https://blog.csdn.net/m0_38010471/article/details/86157902

三、算法

1、二分查找

概念:二分查找又称为折半查找,适用于排好序的顺序表。

基本思路:首先将给定的查找值K,与表中的中间位置的元素的关键字进行比较,若相等,则返回该元素的位置;若不等,表明所需查找的元素只能在中间元素的前半部分或者后半部分中;然后在缩小的范围中继续同样的查找,如此反复直到找到为止。

实现方式:递归实现和非递归实现

  • 非递归实现:

Java核心知识点总结_第3张图片

  • 递归实现:

Java核心知识点总结_第4张图片

优缺点:

  • 虽然二分查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算。既使采用高效率的排序方法也要花费O(nlgn)的时间。
  •  二分查找只适用顺序存储结构。为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。因此,二分查找特别适用于那种一经建立就很少改动、而又经常需要查找的线性表。
  •  对那些查找少而又经常需要改动的线性表,可采用链表作存储结构,进行顺序查找。链表上无法实现二分查找。

2、排序算法

Java核心知识点总结_第5张图片

详细介绍:https://blog.csdn.net/m0_38010471/article/details/85263557

四、线程

概念:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是CPU调度的最小单位)注:进程是资源分配的最小单位,每个进程至少包含一个线程

线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止

Java核心知识点总结_第6张图片

1、创建线程、启动线程的方式

  1. 创建线程:
  • 继承Thread类创建线程,重写该类的run()方法,该方法的方法体就是线程需要完成的任务,run()方法也称为线程执行体。
public class MyThread extends Thread{//继承Thread类

  public void run(){

  //重写run方法

  }

}

public class Main {

  public static void main(String[] args){

    new MyThread().start();//创建并启动线程

  }

}
  • 实现Runnable接口实现线程
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();

  }

}
  • 使用Callable和Future创建线程
  • 使用线程池例如Excutor框架

 

   2、启动线程:调用线程的start()方法

2、常用函数

①sleep(long millis): 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)

②join():指等待t线程终止。

③yield():暂停当前正在执行的线程对象,并执行其他线程。

④setPriority(): 更改线程的优先级。

⑤interrupt():不要以为它是中断某个线程!它只是线线程发送一个中断信号,让线程在无限等待时(如死锁时)能抛出抛出,从而结束线程,但是如果你吃掉了这个异常,那么这个线程还是不会中断的!

线程类的一些常用方法: 

  sleep(): 强迫一个线程睡眠N毫秒。 
  isAlive(): 判断一个线程是否存活。 
  join(): 等待线程终止。 
  activeCount(): 程序中活跃的线程数。 
  enumerate(): 枚举程序中的线程。 
    currentThread(): 得到当前线程。 
  isDaemon(): 一个线程是否为守护线程。 
  setDaemon(): 设置一个线程为守护线程。(用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束) 
  setName(): 为线程设置一个名称。 
  wait(): 强迫一个线程等待。 
  notify(): 通知一个线程继续运行。 
  setPriority(): 设置一个线程的优先级。

3、多线程及其安全问题

概念:指在同一程序中有多个顺序流在执行。在多线程编程中,有可能会出现同时访问同一个资源的情况,这种资源可以是各种类型的的资源:一个变量、一个对象、一个文件、一个数据库表等,而当多个线程同时访问同一个资源的时候,就会存在一个问题。

解决办法:

1、同步代码块-Synchronized关键字

互斥锁:如果对临界资源加上互斥锁,当一个线程在访问该临界资源时,其他线程便只能等待。

2、Lock

  • 闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态。

CountDownLatch是JDK 5+里面闭锁的一个实现,允许一个或者多个线程等待某个事件的发生。CountDownLatch有一个正数计数器,countDown方法对计数器做减操作,await方法等待计数器达到0。所有await的线程都会阻塞直到计数器为0或者等待线程中断或者超时。

  • 栅栏(CyclicBarrier):栅栏类似于闭锁,它能阻塞一组线程直到某个事件发生。 栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。

4、线程池

    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接口。
 

五、数据结构

1、二叉查找树(BST):

特点:

  • 左子树上所有结点的值均小于或等于它的根结点的值。

  • 右子树上所有结点的值均大于或等于它的根结点的值。

  • .左、右子树也分别为二叉排序树。

Java核心知识点总结_第7张图片

 

2、B-tree:

B-tree树即B树,B即Balanced,平衡的意思。B-树是一种多路搜索树(并不一定是二叉的)---平衡多叉树

一个m阶的B树具有如下几个特征:

Java核心知识点总结_第8张图片

1.根结点至少有两个子女。

2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m

3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m

4.所有的叶子结点都位于同一层。

5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。

优点:

B树比二叉树强的地方就在于,同样的数据,B树更矮胖,以及B树可以达到自平衡结构。

3、B+tree

概述:B+ 树是一种树数据结构,是一个n叉排序树,每个节点通常有多个孩子,一棵B+树包含根节点、内部节点和叶子节点。根节点可能是一个叶子节点,也可能是一个包含两个或两个以上孩子节点的节点。

Java核心知识点总结_第9张图片

特点:

  • 1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。

  • 所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。

    3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。

4、红黑树

概述:红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构

特点:

1.节点是红色或黑色。

2.根节点是黑色。

3.每个叶子节点都是黑色的空节点(NIL节点)。

4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

Java核心知识点总结_第10张图片

红黑树的变色与旋转

调整的方式是通过变色和旋转

变色是为了重新符合红黑树的规则,尝试把红色节点变为黑色,或者把黑色节点变为红色。

5、跳跃表

概念:是一种随机化数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作需要O(log n)平均时间),并且对并发算法友好。

应用:Skip list(跳表)是一种可以代替平衡树的数据结构,默认是按照Key值升序的。Skip list让已排序的数据分布在多层链表中,以0-1随机数决定一个数据的向上攀升与否,通过“空间来换取时间”的一个算法,在每个节点中增加了向前的指针,在插入、删除、查找时可以忽略一些不可能涉及到的结点,从而提高了效率。
 

跳跃表-原理及Java实现:https://www.cnblogs.com/acfox/p/3688607.html

 

你可能感兴趣的:(JAVA)