[总结] java复习线路

402 阅读7分钟

在每次准备之前习惯性的看下基础知识点(奠定基础、复习:避免简单的题目答不对),然后在看比较有难度的技术

1、基础知识纵览

2、技术点大纲

3、牛客网算法  

4、力扣算法题 

5、acwing算法

6、入门总结参考 

7、算法题

8、阿里云社区  

9、哔哩哔哩

10、安全社区

11、数据结构演示图

12、github知识总结

13、知识点脑图

一、java特性

1、Java的特性

  • 如果别人问你三种你只需要说:封装、继承、多态。
  • 如果是四种 你只需要把抽象加上:封装、继承、多态、抽象。

抽象:抽象你可以理解为是一种模板,首先呢我们先说说抽象类,抽象类是不能被实例化的,只能用子类对象的实例化来赋给抽象类,也就是说抽象类只能通过多态来实现自己里面的方法,而是子类还必须重写,那么相应的就有抽象方法,抽象方法是没有方法体的,只能被实现的子类重写。所以抽象的天生就是被继承的,上面我说了抽象、多态、继承是息息相关的。这三个特性,使用起来很简单,重要的是在于理解,java的核心思想,只要理解了后面的知识都会很好学的。 

封装:1、隐藏对象的属性和实现细节,仅仅对外公开接口。2、封装其实就是将重复的代码抽出来反复用,这样既加快了开发效率,也增加了代码的可读性。

继承:子类和父类之间的继承关系,子类可以获取到父类的属性和方法。子类不能继承父类的私有方法。

多态:多态是同一个行为具有多个不同表现形式或形态的能力

2、多态

多态就是同一个接口,使用不同的实例而执行不同操作,

多态存在的三个必要条件 :继承 、重写、父类引用指向子类对象:Parent p = new Child() ;

父类引用指向子类,也即向上转型;  向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

多态的实现方式

  • 方式一:重写:
  • 方式二:接口
  • 方式三:抽象类和抽象方法

参考:多态的理解

3、重写与重载

重写:子类定义的方法与父类中的方法有相同的方法名、参数和返回值。

重载:同一类中的多个方法有相同的名字,但方法具有不同的参数(数量或者类型)

二、数据结构

1、数组

无序数组,插入快,但是删除和查找都很慢

2、栈,堆栈

是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据

应用:实现了单词逆序以及分隔符匹配

3、队列:队列又称为先进先出线性表。

队列(单向队列)只能在队尾插入数据,对头删除数据,并且只能访问对头的数据。

而且队列还可以实现循环队列,它基于数组,数组下标可以从数组末端绕回到数组的开始位置。

4、链表

每个链表都包括一个LinikedList对象和许多Node对象,LinkedList对象通常包含头和尾节点的引用,分别指向链表的第一个节点和最后一个节点。而每个节点对象通常包含数据部分data,以及对上一个节点的引用prev和下一个节点的引用next,只有下一个节点的引用称为单向链表,两个都有的称为双向链表。next值为null则说明是链表的结尾,如果想找到某个节点,我们必须从第一个节点开始遍历,不断通过next找到下一个节点,直到找到所需要的。栈和队列都是ADT,可以用数组来实现,也可以用链表实现。

LinkedList类的本质是是一个双向链表

5、递归  && 二分查找  && 快速排序  && 希尔排序

 递归条件:当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

递归的二分查找  
二分查找的数组一定是有序的,
二分查找效率都为O(logN)递归的二分查找和非递归的二分查找效率都为O(logN),递归的二分查找更加简洁,便于理解,但是速度会比非递归的慢。

阶乘、汉诺塔、分治算法、归并排序等都可以用递归来实现,注意:用递归完成的算法用栈都能实现。当我们发现递归的方法效率比较低时,可以考虑用循环或者栈来代替它。

6、各种树

  • 二叉树
  • 红黑树
  • 2-3-4树

7、哈希表

8、堆

数据结构——堆,注意这里的堆和我们Java语言,C++语言等编程语言在内存中的“堆”是不一样的,这里堆是一种树

堆的定义:

  • 它是完全二叉树,除了树的最后一层节点不需要是满的,其它的每一层从左到右都是满的
  • 它通常用数组来实现
  • 堆中的每一个节点的关键字都大于(或等于)这个节点的子节点的关键字。

这里要注意堆和前面说的二叉搜索树的区别,二叉搜索树中所有节点的左子节点关键字都小于右子节点关键字,在二叉搜索树中通过一个简单的算法就可以按序遍历节点。但是在堆中,按序遍历节点是很困难的,如上图所示,堆只有沿着从根节点到叶子节点的每一条路径是降序排列的,指定节点的左边节点或者右边节点,以及上层节点或者下层节点由于不在同一条路径上,他们的关键字可能比指定节点大或者小。所以相对于二叉搜索树,堆是弱序的。

三、基础信息

1、静态:

静态代码块就是一个类在初始化过程中必定会执行的内容

2、类

getClass()在 Object 类中如下,作用是返回对象的运行时类。

public final native Class<?> getClass();
用 native 修饰的方法我们不用考虑,由操作系统帮我们实现,
该方法的作用是返回一个对象的运行时类,通过这个类对象我们可以获取该运行时类的相关属性和方法。
也就是Java中的反射,各种通用的框架都是利用反射来实现的。


@Test
public void testClass(){
    Parent p = new Son();
    System.out.println(p.getClass());
    System.out.println(Parent.class);
}

打印结果:

  

结论:class 是一个类的属性,能获取该类编译时的类对象,而 getClass() 是一个类的方法,它是获取该类运行时的类对象。

四、常见基础知识点。

(1)、集合篇

1、Java HashMap源码分析

2、ConcurrentHashMap分析-整体概述

3、hashtable  与hashmap底层实现(数组+链表+红黑树)一样,但是是线程安全的通过在方法上面加synied实现,与concurrentHashmap相比效率不好,con是可以并发请求的

 HashMap和Hashtable的详细区别

4、ArrayList内部是数组,vector是线程安全的,内部结构也是数组+synzed

5、HashMap、Hashtable、LinkedHashMap、TreeMap的使用方法及区别

线程安全:Hashtable

非线程安全:HashMap、LinkedHashMap、TreeMap

无序:HashMap、Hashtable

有序:LinkedHashMap、TreeMap

LinkHashMap保证FIFO即按插入顺序排序
TreeMap保证元素的顺序,支持自定义排序规则

(2)、jvm

1、垃圾回收出现在哪个区:堆和方法区

2、栈溢出

(3)多线程 

1、死磕Java并发】—- 深入分析CAS

2、Synchronized原理

rantrend

volatile

threadlocal

AQS

线程池