一、Java语言的运行机制
Java是编译型语言也是解释型语言
Java运行过程是:
- 源文件(.java文件)经过Java编译器编译成字节码文件(.class文件)
- 运行的时候就会走到jvm虚拟机,他会把字节码文件这个类放到类装载器里面,这时候就会把类加载到jvm里面了
- 加载进来之后就会有个字节码校验器(这个就是看你代码写的对不对,不对就会告诉你出问题了)
- 代码没问题就会通过一个解释器解释给操作系统
二、使用IDEA开发
1、什么是IDE
集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。所有具备这一特性的软件或者软件套(组)都可以叫集成开发环境。
2、什么是IDEA
是jetbrains(杰特宾丝)是捷克的一家公司的一款IDE
3、优化
优化可以看我另外三个用idea的文章,也可以百度搜idea优化
三、标识符
四、逻辑运算符位运算符
逻辑运算符:
&& 和 || 都有这个短路功能
位运算符
与(&)、非(~)、或(|)、异或(^)
& 比较二进制,如果同位上都是1则算出来的二进制这个位置上是1,否则都位0
| 比较二进制,如果同位上有一个是1那么则算出来的二进制同位是1
单个二进制,就是跟二进制完全相反
常见面试题:
<<(左移) >>(右移)
<<相当于 *2
>>相当于 /2
五、数据类型
除了基本数据类型之外的都叫引用数据类型,比如String、Integer…
什么是字节
拓展
整数拓展:
浮点数拓展:
浮点数表现得字长是有限的,也是离散的,舍入误差,大约数,最好完全避免使用浮点数比较,可以用BigDecimal 数学工具类
字符拓展:
可以把char强制转换成int,所有的字符本质还是数字
编码问题:Unicode可以处理各种语言的文字 2字节 字符长度0-65536
他还有一张表比如 97 = a ;65 = A;
他这些东西可以使用unicode编码通过转译表示
char c3 = ‘\u0061’ \u代表给他转译
转义字符:还有很多
布尔值扩展:
六、类型转换
强制类型转换、自动类型转换
计算的时候容易出现的问题
七、 九九乘法表
八、可变参数
本质是一个数组
调用方法:
可以用可变长参数去调用
也可以用一个同类型的数组去调用
排序求最大值
九、递归
递归:A方法调用A方法!就是自己调用自己
StackOverflowError栈溢出异常
递归简介:
递归头:什么时候不调用自己
递归体:什么时候调用自己
上面那个类就是没有递归头
阶乘概念
测试:
到f(1)就有一个值1,然后一步一步返回给上一步方法
边界条件:到最后一个数的时候会执行到底 这里是f(1)
前阶段:自上而下一层一层的调到最下层的这个阶段f(3)——>f(2)——>f(1)
返回阶段:n*(n-1)
Java都是使用栈机制的,相当于是一个罐子,最下面是一个main方法,然后每调用一个方法就会在里面压一层东西,一个方法结束了然后那一层的东西就结束了,main方法执行完了栈里面就空了他就不跑程序了。
加入这个栈里面就无限在往里面压东西他就空间不行了,对于一些嵌套层次比较深的算法,递归就会显得力不从心了,物理上就会造成这个内存崩溃,最后就崩了
所以能不用递归就不用递归,一般我们可以通过一些方法代替,但是有些递归执行的比较快的话就用递归,前提是基数比较小的情况下,如果刚刚那种f(10000)就不要用了,反而会影响性能
十、内存分析(一):
先基本了解一下Java的内存,不是很底层
首先声明一个数组这个数组并不存在于堆中,只有一个引用变量存在栈中,当new的时候在堆中才会开辟一片空间去存这个数组(这个数组才算真正产生)赋值的时候里面才有值,没有赋值就是个默认元素。
异常:数组下标越界ArrayIndexOutOfBoundsException异常,比如一个数组只开辟了10个空间大小,而你用下标10想去调用第11个数组的时候会产生
数组的四个基本特点
1、长度是确定的,一旦被创建,它的大小就是不可改变的(扩容的话就要创建一个新的数组,后面会学一些集合框架底层就是数组可以扩容)
2、元素必须是相同类型,不允许出现混合类型
3、数组中的元素可以是任何数据类型,包括基本类型和引用类型
4、数组变量数组引用类型,数组也可以看成是对象,每个元素相当于该对象的成员变量,Java中对象是在堆中的,因此数组无论保存原始类型还是引用类型,数组对象本身是在堆中的
十一、Arrays类
直接打印一个数组对象会出现一个hashcode
- toString方法和sort方法
- fill方法
不写区间就默认全部元素被填充
十二、冒泡排序
总共有八大排序,冒泡排序是最出名的之一
冒泡排序代码:两层循环,外层冒泡轮数,里层依次比较
举例说明:要排序数组:int[] arr={6,3,8,2,9,1};
第一趟排序:
第一次排序:6和3比较,6大于3,交换位置: 3 6 8 2 9 1
第二次排序:6和8比较,6小于8,不交换位置:3 6 8 2 9 1
第三次排序:8和2比较,8大于2,交换位置: 3 6 2 8 9 1
第四次排序:8和9比较,8小于9,不交换位置:3 6 2 8 9 1
第五次排序:9和1比较:9大于1,交换位置: 3 6 2 8 1 9
第一趟总共进行了5次比较, 排序结果: 3 6 2 8 1 9
第二趟排序:
第一次排序:3和6比较,3小于6,不交换位置:3 6 2 8 1 9
第二次排序:6和2比较,6大于2,交换位置: 3 2 6 8 1 9
第三次排序:6和8比较,6大于8,不交换位置:3 2 6 8 1 9
第四次排序:8和1比较,8大于1,交换位置: 3 2 6 1 8 9
第二趟总共进行了4次比较, 排序结果: 3 2 6 1 8 9
第三趟排序:
第一次排序:3和2比较,3大于2,交换位置: 2 3 6 1 8 9
第二次排序:3和6比较,3小于6,不交换位置:2 3 6 1 8 9
第三次排序:6和1比较,6大于1,交换位置: 2 3 1 6 8 9
第二趟总共进行了3次比较, 排序结果: 2 3 1 6 8 9
第四趟排序:
第一次排序:2和3比较,2小于3,不交换位置:2 3 1 6 8 9
第二次排序:3和1比较,3大于1,交换位置: 2 1 3 6 8 9
第二趟总共进行了2次比较, 排序结果: 2 1 3 6 8 9
第五趟排序:
第一次排序:2和1比较,2大于1,交换位置: 1 2 3 6 8 9
第二趟总共进行了1次比较, 排序结果: 1 2 3 6 8 9
最终结果:1 2 3 6 8 9
public static void mppx(int arr[]){
//临时变量
int temp = 0;
//判断我们要排序多少趟
for (int i = 0; i < arr.length - 1; i++) {
//判断一趟比较多少次
for (int j = 0; j < arr.length -1 -i; j++) {
if(arr[j]>arr[j+1]){
temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
}
十三、类与对象的创建
面向对象编程的本质就是:以类的方式组织代码,以对象的形式组织(封装)数据
类有属性和方法
类是抽象的需要实例化出来
类通过new实例化出来后会返回一个自己的对象
对象是一个类具体的实例
我们在使用new关键字创建对象的时候,除了分配内存空间之外,还会对创建好的对象进行默认的初始化以及对类中构造器的调用。
构造器
使用new关键字,必须要有构造器,因为他本质是在调用构造器
一个类即使什么都不写也会存在一个方法(无参构造)
构造器要求:与类名相同并且没有返回值
构造器的作用:
实例化初始值
new本质在调用构造方法
注意点:有参构造:一旦定义了有参构造,无参就必须显示定义(不然无参构造就不存在)
十四、内存分析(二创建对象内存分析)
堆中实例化出来的对象会默认初始化属性的,dog之所以变了是因为默认初始化属性之后又改变了
小结类与对象
十五、内部类
1、成员内部类
2、静态内部类
但是如果给内部类加上static变成静态内部类之后id就拿不到了,因为加了static会比id更早实例化,除非把上面那个id也改成static
还有一种比较特殊的内部类:(不算在内部类中)
这个也叫做内部类但是他是相当于在这个大的Java文件里面写了两个类,这个只能算public类下面多了一个类,并且这个类不能修饰成public的
一个Java类中可以有多个class,但是只有一个叫public class
3、局部内部类(跟局部变量一样,在方法中定义的变量)
4、匿名内部类