前言
要学MJ的数据结构,怎奈MJ大神是用JAVA写的,虽然之前自己学过JAVA,但也基本忘完了,学过,没有笔记,忘的干净。网上找了视频课,想学一遍,可并不想3、5年之后,脑子还是一片空白。
学了,不做笔记,还是什么都不会。
学了,做下记录,再翻看笔记,再复习时间就快了很多。
那么,开始学习吧!!!
第一节
绝对路径: 表示该路径是从某个磁盘的盘符下作为出发点的路径
相对路径: 表示该路径从当前所在的路径下作为出发点的路径
举个例子:
绝对路径:中国-北京-朝阳-XX小区-7号楼-1601
相对路径:隔壁邻居
Java的加载与执行
Java程序的运行,包括两个非常重要的阶段:
- 编译阶段
- 运行阶段
编译阶段:
主要任务是检查Java源程序是否符合Java语法
如何符合Java语法,则可以生成字节码文件(xxx.class)
若不符合Java语法,则无法生成字节码文件
字节码文件(.class)不是纯粹的01二进制码。因为,01二进制码可以直接与操作系统进行交互,然而,字节码.class文件是运行在JVM虚拟机上的。
源文件: 程序员写的代码,都是在.java文件里面,该文件被称为源文件
.java通过javac.exe命令进行java编译,然后生成.class字节码文件,字节码文件在虚拟机上运行。
一个.java源文件可以编译出多个.class文件
字节码文件.class,是最终要执行的文件,因此,编译生成.class文件后,就可以删除.class文件(不建议这么做)
.class字节码文件可以被拷贝到其他操作系统上进行运行,这就是Java的跨平台,可移植性
运行阶段:
运行阶段,有个重要的工具/命令 java.exe
假如有个类A.class,那么,执行java A,其过程大致是:
- java.exe命令会启动Java虚拟机JVM,JVM会启动类的加载器classLoader
- classLoader会去硬盘上搜索A.class文件,找到该文件,并将该字节码文件装载到JVM当中
- JVM将.class文件解析成二进制码
- 操作系统执行二进制码
JDK:软件开发包
JRE:runtime environment,运行时环境
JVM:虚拟机
JDK拥有JRE,JRE拥有JVM
让我们尝试写一个小例子:
新建一个HelloWorld.java文件
public class HelloWorld{
public static void main(String[] args)
{
System.out.println("Hello World!!!");
}
}
在当前目录下,使用编译命令:javac HelloWorld.java
,可以生成一个HelloWorld.class字节码文件
使用运行命令:java HelloWorld得到了:
Hello World!!!
注意:java 后面跟的是类名,而不是路径名,也不需要带文件后缀名。
//public公开的
//class表示定义一个类
//HelleoWorld类名
public class HelloWorld{//表示定义一个公开的类,类名叫HelleoWorld
/**
public 公开的
static 静态的
void 空
main 方法名
(String[] args) main方法的形式参数列表
*/
public static void main(String[] args)//定义一个公开的,静态的,主方法。程序的入口
{
System.out.println("Hello World!!!");
}
}
-
一个Java源文件可以定义多个class
-
一个Java源文件中public class不是必须的
-
Java源文件中定义的每一个class,都会对应生成一个.class文件
-
使用public class name{},则该name必须与.java源文件name一致。
换句话说
一个.java源文件中定义public class(公开类)的话,public class 只能有一个,并且public class的类名必须和源文件名一样
例如:
在k.java中有以下代码:
public class H
{
}
编译:javac k.java
报错:
错误: 类H是公共的, 应在名为 H.java 的文件中声明
public class H
^
1 个错误
- 每一个class当中,都可以编写main方法(程序的入口),并且执行main方法
java中都是方法,不叫函数
举个例子:
k.java 中有:
class A
{
public static void main(String[] args){
System.out.println("A");
}
}
class B
{
public static void main(String[] args){
System.out.println("B");
}
}
通过编译命令:javac k.java可以生成A.class B.class
通过运行命令:java A
运行结果:A
举个例子:
k.java 中有:
class B
{
}
通过编译命令:javac k.java可以生成B.class
通过运行命令:java B
运行结果:报错
错误: 在类 B 中找不到 main 方法, 请将 main 方法定义为:
public static void main(String[] args)
也就是说,在命令行窗口,class中必须有main方法。
注意,是命令行窗口,class必须有main方法
第二节
标识符包括:类名、方法名、变量名、接口名、常量名
标识符的命名规则:
一个合法的标识符,只能由 数字、字母、下划线、美元符组成。
- 标示符不能以数字开头
- 标示符不能是关键字
标识符的命名规范:
驼峰命名
类名、接口名:首字母大写,后面每个单词的首字母大写
变量名、方法名:首字母小写,后面每个单词的首字母大写
关于变量的分类:
局部变量:在方法体之内,不赋值会报错
成员变量:在方法体之外,类体之内,不赋值则默认为0
在不同的作用域内,变量名可以相同。
在相同的作用域内,变量名不可以重名。
public class k//类体
{
static int a = 10;
public static void main(String[] args){//方法体
int a = 20;
System.out.println(a);
}
/*
System.out.println("OOO");
k.java:4: 错误: 需要<标识符>
System.out.println("OOO");
^
k.java:4: 错误: 非法的类型开始
System.out.println("OOO");
^
2 个错误
*/
}
数据类型
不同数据类型的数据,占用内存空间的大小不同。
数据类型的作用是:指导JVM给该数据类型的数据分配多大的内存空间
数据类型分为:
- 基本数据类型
- 引用数据类型:类、接口、数组、字符串
基本数据类型包括:四大类、八小种
四大类:
整型:byte、short、int、long
浮点型:float、double
布尔型:boolean
字符型:char
各个类型所占用字节大小:
byte1 short2 int4 long8
float4 double8
boolean1(true\false,默认false)
char2
数字是有正负之分,因此,在01二进制中,有一位专门来表示该数组为正还是负。
该位位于最左边,0代表正数,1代表负数
十进制二进制转换小技巧
问:97转换为二进制是多少?
2的0次方 2的1次方 2的2次方 2的3次方 2的4次方 2的5次方 2的6次方
1 2 4 8 16 32 64
97 = 64 + 32 + 1
因此,十进制97转换为二进制是1100001
7 = 4+2+1 = (二进制)111
17 = 16+1 = (二进制)10001
29 = 16+8+4+1 = 11101
(二进制)11111 = 1+2+4+8+16 = 31
在8种类型中,前7中计算机都好表示,因为数字在二进制与十进制之间可以有规律的转换。
而最后一种:char字符,跟0101之间不好转换。
因此,存在ASCII码,对应字符与0101之间的关系。
’a’ = 97
‘A’ = 65
‘0’ = 48
第三节
System.out.println 具有自动换行功能
System.out.print 没有自动换行功能
println:输出之后换行
十进制前不需要加特殊符,默认就是十进制 10 10
八进制0开头 010 转换为十进制是8
十六进制0x开头0x10 转换为10进制是16
public class k//类体
{
static int a = 10;
public static void main(String[] args){//方法体
int a = 10;
int b = 010;
int c = 0x10;
//默认输出十进制
System.out.println(a+b+c);//16+8+10
}
}
结果:34
计算机的二进制有三种表示形式:原码、反码、补码
计算机在任何时候的存储数据都是 补码
-
在数字为正数的时候:
原码 = 补码 -
在数字为负数的时候:
补码 = 负数的绝对值所对应的二进制码的所有二进制位取反+1
浮点型数据,默认被当做double类型
如果想做float处理,数字后面加上f/F
public class k//类体
{
public static void main(String[] args){//方法体
float b = 5.3;
System.out.println(b);
}
}
错误: 不兼容的类型: 从double转换到float可能会有损失
float b = 5.3;
^
1 个错误
解决方法:
float b = (float)5.3;
float b = 5.3f;或者float b = 5.3F;
基本数据类型之间的相互转换:转换规则
-
八种基本数据类型,除了布尔类型之外,其余七种类型之间都可以相互转换
-
小容量向大容量转换,称为自动类型转换,容量从大到小排序:
byte < short(char) < int < long < float < double注:
浮点型不管占用多少字节,都比整型容量大
char和short可表示的种类数量相同,但是char可以取更大的正整数 -
大容量转小容量,称为强制类型转换,需要加强制类型转换程序才能编译过。但运行期间会损失精度,因此,谨慎使用。
-
当整型字面值没有超过byte、short、char的取值范围,可以直接赋值给byte、short、char类型的变量。例如:byte a = 127;
-
byte、short、char混合运算的时候,各自先转换成int类型再做运算
-
各种数据类型混合运算,先转换成容量最大的那种类型再做运算。
位运算符 异或^
不同为真,相同为假(类比男女,不要搞基- -)
第四节
int i = 10;
i += 10;等同于i = (int)(i + 10)
前面有一个强转操作
关于Java中的+号运算符:
- 加法运算,求和
- 字符串的连接运算符
数字 + 数字 加法运算
+号左右,有一个是字符串,则是字符串连接运算
字符串 + 任意类型 = 字符串 字符串连接运算
控制语句有三种:
选择结构: if if…else… switch
循环结构: for while do…while
控制循环语句: break continue
switch
switch和case后面只能是:int或者string
public class A
{
public static void main(String[] args)
{
double a = 3.0;
switch(a)
{
case 3.0:
System.out.println("3");
//break;
case 4.0:
System.out.println("4");
break;
case 10.0:
System.out.println("10");
break;
default:
break;
}
}
}
A.java:6: 错误: 不兼容的类型: 从double转换到int可能会有损失
switch(a)
^
1 个错误
byte、short、char可以写,因为小类型可以直接转换为大类型int
public class A
{
public static void main(String[] args)
{
int a = 3;
switch(a)
{
case 3:
System.out.println("3");
//break;
case 4:
System.out.println("4");
break;
case 10:
System.out.println("10");
break;
default:
break;
}
}
}
打印结果:
3
4
匹配到3,3没有break,则直接进入4执行,4有break,则程序结束;
如果4也没有break,则进入10执行。
也就是,匹配到3后,就开始找break。就不管是否匹配了。
该现象称为:case穿透现象。
九九乘法表
public class A
{
public static void main(String[] args)
{
for (int i = 1; i<=9; i++) {
for (int j = 1; j<=i ; j++) {
System.out.print(j + "x" + i + "=" + i*j + " ");
}
System.out.println("");
}
}
}
结果:
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
求出1-100所有的素数
什么是素数?
素数,又称为质数,指的只能被1和本身整除的数,例如:1,2,3,5,7…
public class A
{
public static void main(String[] args)
{
for (int i = 1; i<=100; i++) {
boolean isSuShu = true;
for (int j = 2; j<i; j++) {
if (i%j == 0) {
isSuShu = false;
break;
}
}
if (isSuShu) {
System.out.print(i + " ");
}
}
}
}
结果:
1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
升级版:
1-10000的素数,要求每8个换一行输出
......
if (isSuShu)
{
System.out.print(i + " ");
k++;
if (k>=8) {
k = 0;
System.out.println();
}
}
break中断
break使用在switch中,用来终止switch的语句执行
break使用在for while do…while…循环语句中,用来终止循环的执行。
break只会中断最近的循环(而不是每一个循环)
给for循环取别名的用法:
class D
{
public static void main(String[] args)
{
//给for循环起名for1
for1:for (int i = 1; i<=10; i++) {
//给for循环起名for2
for2:for (int j = 1; j<10; j++) {
System.out.println(j + "----");
if (j == 5) {
break for1;//此时,break作用在最外面的for循环
}
}
}
}
}
continue,跳出本次循环,执行下一次循环