java编译过程:文件.java->(java.c)->文件.class
可以通过JVM实现跨平台
JDK包括Jre和JVM,Jre包括JVM
堆:新生代和老年代
新手代包括Eden和s区,Eden填满了去填S1,S1满了去S2,
S2满了去老年代。
一般是1:2,堆空间,新生代能用的是90%,前复制算法,后标记-清理-整理算法。
内部回收问题MinGC,新生代内存不足是触发MinGC,且MinGC会触发MajorGC。
持久代:方法区内放静态常量,类之类的,基本上不会被清理。
类加载
A.java->(用java.c编译)字节码文件A.class->运行阶段(加载,验证,准备,解析,初始化)->电脑能阅读的文件,整体过程
类加载器:启动类继承-----扩展类继承-----系统类继承-----自定义类加载器。
这就是双亲委派模型,先让父类加载器完成。
常用的数据结构:数组,链表,堆,栈,队列,树,图和hash表。
结构:
线性结构:一对一。
树形结构:一对多。
图形结构:多对多。
数组:
随机访问特性:原理内存连续分配。
访问快,但是删除增加慢。
索引的底层是数组。索引和数组的优点是查询速度快,删除增加慢。
链表:有指针域和数据域组成,数据指向下一个指针域。和数组相反优点是查询慢,删除增加快。
栈:就像杯子,先进后出,后进先出。
队列:排队,先进先出,后进后出。
树:
- 1)每个节点有0个或多个子节点;
- 2)没有父节点的节点称为根节点;
- 3)每一个非根节点有且只有一个父节点;
- 4)除了根节点外,每个子节点可以分为多个不相交的子树;
- 5)右子树永远比左子树大,读取顺序从左到右
二叉树:
前中后序:
根的位置:根左右,左根右,左右根。
堆:堆可以看做是一颗用数组实现的二叉树
根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
哈希表:左侧是数组,右侧是链表,key-value,数组指向链表,链表指向链表。