在每次准备之前习惯性的看下基础知识点(奠定基础、复习:避免简单的题目答不对),然后在看比较有难度的技术
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)、集合篇
3、hashtable 与hashmap底层实现(数组+链表+红黑树)一样,但是是线程安全的通过在方法上面加synied实现,与concurrentHashmap相比效率不好,con是可以并发请求的
4、ArrayList内部是数组,vector是线程安全的,内部结构也是数组+synzed
5、HashMap、Hashtable、LinkedHashMap、TreeMap的使用方法及区别
线程安全:Hashtable
非线程安全:HashMap、LinkedHashMap、TreeMap
LinkHashMap保证FIFO即按插入顺序排序
TreeMap保证元素的顺序,支持自定义排序规则
(2)、jvm
1、垃圾回收出现在哪个区:堆和方法区
2、栈溢出
(3)多线程
rantrend
volatile
threadlocal
AQS
线程池