32 位 内存最大支持4G (即使pc有8G的内存), 文件有(x86)标识
java版本介绍
javaSE java标准版 (以前简写J2SE) java技术核心和基础
JavaEE,Java企业版(以前简写J2EE)java技术中应⽤应⽤最⼴泛的部分
JavaME,Java微型版(以前简写J2ME),主要⽤于移动设备
jvm>jre>jdk
jvm
java虚拟机,简单看作一个操作系统,java程序会被编译为 .class 的字节码文件,根据字节码指令进行识别并调用上层操作系统
jre
java 运行时环境,运行+编译环境 ,基本内库+jvm
jdk
java 开发工具包 , java开发的核心, jre+jvm+开发工具包
java语言优势 , 一次编译,跨平台(jvm),四处运行
jdk 环境变量 配置
环境变量定义
就是告诉计算机去这个路径下找对应的⽂件
jdk8 环境 配置
系统变量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sJBYdMdk-1658234937349)(C:\Users\22496\AppData\Roaming\Typora\typora-user-images\image-20220706103104224.png)]
CLASSPATH 系统变量下 与JAVA_HOME 同级
变量名 CLASSPATH
变量值 .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2DDsHX12-1658234937349)(C:\Users\22496\AppData\Roaming\Typora\typora-user-images\image-20220706110356599.png)]
path
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V1sECmRw-1658234937350)(C:\Users\22496\AppData\Roaming\Typora\typora-user-images\image-20220706110507961.png)]
检查是否成功
javac
java
java -version
DOS命令
d: 切换盘符
cd 切换目录
mkdir 创建目录
rmdir 只能删除空目录
dir 显示字目录
cls 清屏
exit 退出
java 程度运行流程
完成代码
控制台 GBK编码 ,记事本改编码为ANSI
保存⽂件,通过CMD窗⼝进⼊对应的路径
编译 javac HelloWorld.java
运⾏ java HelloWorld
over!!!
控制台 GBK编码 ,记事本改编码为ANSI,
输入输出print & scanner
println & print
System.out.printfln(“aaaa”); 输出aaaa 并换行
System.out.printfln(); 括号里不写,直接换行, 相当于 \n
System.out.printf(); 输出不换行
转义字符 \
\n 换行
\t 制表符 相当于tab键 4个空格
注释
/** */ 文档注释,生成文档时该注释里的内容会自动生成
变量
数据类型 变量名 = 变量值 ;
变量名 :
数字,字母,下划线组成, 不能以数字开头
不能使用java关键字
alibaba编码规范
8大基本数据类型
byte 1B=8bit(位) -128~~127 正0和负0占两个空间,我们用正0表示
0,为了不浪费10000000(-0),就
short 2B 把负数向后移一位;2^7-1 127
int(默认) 4B
long 8B
double (默认) 8B
float 4B
char 2B
boolean 1bit
5种引用数据类型
类 接口 数组 枚举 标注
变量赋值
整型
byte b = 128; 报错,超出范围
浮点型
float 小数点后7位
double 小数点后15位
float num = 1.2 ; 报错,小数默认为double,高转低失败,丢失精度
数据类型转换
低===》高 自动转换 char–>int 可以,ascll码表
高===》低 强制类型转换 , 丢失精度 int a =(int)double ; float num = 1.2 f/F; long l=123 l/L;
Scanner
import java.util.Scanner; 导包 util
java.lang包 不用到,加载时自动导包
使用步骤:
- 在类上导入 Scanner类, 位于java.util包: import java.util.Scanner;
String/System 不需要导包, 位于java.lang包, 程序自动加载java.lang下的类
-
创建Scanner Scanner input = new Scanner(System.in);
-
调用next相关的方法, 进行输入 input .nextInt() input.nextDouble()
nextInt() 输入一个整型
nextDouble() 输入一个double浮点数
nextBoolean() nextFloat()…
但是: 不能输入char 没有nextChar()
next() 输入字符串 nextLine() 输入字符串
细节:
输入字符串: next() nextLine()
next() 输入有效字符串, 不包含 空格,tab,回车, 遇到空格,tab,回车,都结束输入
但是空格,tab,回车内容 保存到缓存中
nextLine() 输入字符串,包含空格, 但是nextLine() 前面有其他next() nextInt() nextDouble()…
nextLine() 不起作用, 无法输入
解决方案: 1. nextLine() 放在所有的next方法之前
2. nextLine() 不在第一个位置: 使用nextLine() 再加一个nextLine()
运算符
1.算术运算符: + - / * %
2.赋值运算符: =
3.比较运算符: > < >= <= == !=
4.逻辑运算符: &&(与) || (或) ! &(与) | (或)
5.++,-- 运算符
6.位运算: &(与) |(或) ^(异或)
算术运算符
+
: 1) 数值类型 + 加法
2) 字符串与任意的类型 +, 表示拼接, 结果:字符串
/
: 1) 整数/整数 整除(结果取整)
2) 除数或者是被除数是浮点类型, 除法, 结果带小数
%
: 取余 5%2= 1
作用:
判断是否整除
得到某位的数值, 对某个数进行缩小归类
自增
++
: 加1 语法 变量++ ++变量
前加加 ++变量
步骤: 先变量加1 , 后赋值, 整个表达式的值 = 变量的值
>int a = 10;
>
>//++a; //1) a = a+1 a=11 2) 赋值 (++a) = a; (++a) = 11
>
>int b = ++a; //1) a = a+1 a=11 2) 赋值 (++a) = a; (++a) = 11 3) 赋值符号: 把++a表达式的值赋给b
后加加: 变量++
先赋值: 变量的值赋给表达式 后加1: 变量加1
int a = 10;
int b = a++; //1) 先赋值, 把a的值赋值给(a++)表达式 10 2) 加1: a = a+1, a=11 3)再把表达式结果赋值给b b = 10
--
减1
前减减: --变量: 先减1, 再赋值
后减减: 变量–: 先赋值,再减1
赋值运算符
- = 语法: 变量 = 值; 变量 = 变量1; 不能写: 值 = 变量; 错误, 把赋值符号右边赋值给左边
- += a += b; a = a+b;
- -= a -= b; a= a-b;
- = a * = b; a = ab;
- /= a /= b; a = a/b;
- %= a%=b; a= a%b;
赋值符号与算术符号组合的赋值符号: 隐式数据类型转换
a += b; 把a+b的结果 转换为a的类型
比较运算符
比较运算符结果: boolean类型: true/false
使用场景: 条件语句, 循环语句
== 等于, = 赋值符号
!= 不等于
>
大于
<
小于
>=
大于等于
<=
小于等于
逻辑运算符
&&
短路与, 如果第一个表达式的结果为false, && 后面的表达式都不执行(类似电路的短路)
||
短路或: 如果第一个表达式的结果为true, || 后面的表达式都不执行(类似电路的短路)
!
非
&
与 没有短路
|
或 没有短路
结果: boolean 类型
使用的场景: 条件,循环中, 连接多个比较表达式
三目运算符
语法: 条件(boolean的表达式)?值1:值2
如果条件为true: 返回值1, 如果条件为false, 返回值2
三目运算符可以嵌套:
条件1?值1:(条件2?值2:值3)
对if-else 某些场景的简化, if-else返回结果, 可以使用三目运算替换
位运算 二进制的位运算
&: 按位与 : 1:true 0:false 只要位上有一个为0, 结果:0 位上都为1, 结果: 1
|: 按位或: 只要位上有一个为1: 结果: 1 位上都是0: 结果: 0
!: 按位非 : 1 -取反-> 0 0-取反->1
^: 异或: 相同为0 , 不同为1 一个数异或某个数两次,等到自己
移位操作: 拓展
>>
右移
<<
:左移
java: 十进制, 八进制, 十六进制:
int a = 123; //十进制数
int b = 0123; //八进制
int c = 0x123; //十六进制
分支语句
if-else
```java
if(){
}else if(){
}else{
}
```
switch
switch(表达式){ case 值1: //逻辑代码 break; //退出switch case 值2: //逻辑代码 break; //退出switch //... default: //逻辑代码 break; }
siwtch中表达式: 在jdk1.7之前,不支持String, 在jdk1.7以及之后支持String
类型: 基本数据类型, String, 枚举类型
case的值不能相同, 值唯一
break: 可以省略, 也可以不省略
default: 可有可无, default 可以在最前面, 也可以在最后面, 推荐写在最后面, 可以省略break,
写在最前面, 但是一定要写 break;
循环
for( )
while
while(循环条件){
//循环体
}
//把for循环的表达式1 写在循环之外, 表达式3写循环体的for循环
表达式1;
for(;表达式2;){
//循环体
//表达式3
}
while循环体包含: 重复做的事情, 还有修改循环遍历
for/while特征: 先判断,后循环, 可能一次都不执行, 一上来,循环条件为false
do-while
do-while: 特征: 先循环,后判断, 最小循环次数: 1
语法:
do{
//循环体
}while(循环条件);
//注意: while后面小括号之后有一个分号,不能省略
数组
一维数组
变量: 只能存储一个值
数组: 存储的一组相同数据类型的值, 存储个数: 由程序员在创建的数组的时候来指定,
缺点: 固定长度
也称为: 容器
数组要素:
1) 数组名
2) 数据类型
3) 元素
4) 下标: 获取指定位置的元素: 从0开始: 0 表示第一个元素, 1表示第二个元素…
0=<下标<数组长度
5) 数组的长度: 表示数组最大允许存多少个元素
1、声明数组: 没有开辟空间
语法:
数据类型[] 数组名;
数据类型 数组名[];
开辟空间, 指定数组的长度 通过new关键字, 数组开辟空间是连续
数组名 = new 数据类型[长度];
注意:
> new 数组的方式: 除了开辟内存空间, 还会对数组中元素进行初始化(赋予初始值) > 初始值根据数据类型决定:
int/byte/short/long: 初始值0
double/float: 初始值:0.0
char: \u000
boolean: false
String/类类型: null
- 往数组中存放元素: 通过下标
数组名[下标] = 值;
注意:
如果下标超出最大下标(数组的长度-1): 抛出一个数组越界的异常 ArrayIndexOutOfBoundsException: 5
如果一个数组没有开辟空间, 不能存放数据, 编程出错
- 获取数组的元素,进行相关操作
通过下标: 数组名[下标]
如果下标超出最大下标(数组的长度-1): 抛出一个数组越界的异常 ArrayIndexOutOfBoundsException: 5
在实际开发中,可能使用循环遍历这个数组(把数组的元素一个一个拿出来), 最匹配:for
动态的获取数组的长度: 数组提供了一个属性:
> 数组名.length 获取该数组的长度
可以把1,2,3(声明数组,开辟空间,存元素)合并成一行代码, 数组静态创建
数据类型[] 数组名 = new 数组类型[]{值1,值2,值3,…}
注意: new后面中括号不能写长度, jdk根据后面值的个数确定数组的长度
简写: 数据类型[] 数组名 ={值1,值2,…}
二维数组
由多个一维数组组成, 称为二维数组
三维数组: 由多个二维数组组成
声明一个二维数组:
//1,声明数组 数据类型[][] 数组名; //2.开辟空间 数组名 = new 数据类型[长度1][长度2]
长度1: 表示的一维数组的个数
长度2: 表示的一维数组的元素个数
//3.赋值 通过下标 数组名[i][j] = 值; //4.使用: 通过下标 数组名[i][j]
遍历一维数组: 一个for循环
遍历二维数组: 两个for循环
二维数组的静态初始化
//一维数组的静态初始化 int[] arr = new int[]{1,2,3,4,5}; int[] arr2 = {1,2,3,4,5}; //二维数组: int[][] arr3 = {{1,2,3},{4,5,6},{7,8,9}};
二维数组的一维数组长度: 数组名.length
二维数组的指定下标的一维数组元素个数: 数组名[下标].length
二维数组的元素个数: 数组名[0].length+数组名[1].length+…+数组名[数组名.length-1].length
数组的工具类: java.util.Arrays
1.Arrays.toString()方法
方法作用:快速输出数组内容
int[] a = {1,2,3,4,5};
System.out.println(Arrays.toString(a));
// 输出格式:[1,2,3,4,5]
2.Arrays.sort()方法
方法运用:给数组排序,默认升序
int[] a = new int[5]{5,4,3,2,1};
Arrays.sort(a); // 1 2 3 4 5
System.out.println(Arrays.toString(a));
// [1,2,3,4,5]
int []a = new int[]{7,2,8,3,1,2,90,23};
// fromndex 起始地址 排序到toindex的前一位;
Arrays.sort(a,3,6);
System.out.println(Arrays.toString(a));
// [7, 2, 8, 1, 2, 3, 90, 23]
// 3 4 5
Arrays.sort()降序排列
不能作用于基本数据类型!
Integer[] a = {1,2,3,4,5}
Arrays.sort(a,Collections.reverseOrder())
// 输出数组的内容即为:5 4 3 2 1
实现Comparator<> 接口
Integer []a = new Integer[]{2,45,34,70,0,1};
Arrays.sort(a, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
//升序
// return o1.intValue()-o2.intValue();
//逆序
return o2.intValue()-o1.intValue();
}
});
System.out.println(Arrays.toString(a));
//[70, 45, 34, 2, 1, 0]
//lambda 表达式
Integer []a = new Integer[]{2,45,34,70,0,1};
Arrays.sort(a, (e1,e2)-> e2-e1);
System.out.println(Arrays.toString(a));
//[70, 45, 34, 2, 1, 0]
3.Arrays.equals()方法
方法作用:比较两个数组内容是否相等
int[] a = {1,2,3};
int[] b = {1,2,3};
boolean isSame = Arrays.equals(a,b);
//true
注意:Arrays.equals()是比较数组内容,而a.equals(b) (继承Object)这样的方法是比较地址值
4.Arrays.binarySearch()
方法作用:在数组中查找元素
再数组中查找指定值,若找到,则返回此值的下标,
若没找到,返回 -插入点-1;
int[] a = {1,5,6,7};
Arrays.binarySearch(a,2) //没找到,插入点为1,则返回 -2
Arrays.binarySearch(a,4) //没找到,插入点为1,则返回 -2
Arrays,binarySearch(a,8) //没找到,插入点为4,则返回 -5
Arrays.binarySearch(a,5) //找到了!返回下标 1
只要返回值 ≥ 0 ,就代表找到了。
5.Arrays.copyOf()
方法作用:拷贝数组
int []a = new int[]{1,2,3,4,5};
// 第二个参数为拷贝的数组元素个数
int []b= Arrays.copyOf(a, 5);
int []c= Arrays.copyOf(a, 3);
System.out.println(Arrays.toString(a)); //[1, 2, 3, 4, 5]
System.out.println(Arrays.toString(b)); //[1, 2, 3, 4, 5]
System.out.println(Arrays.toString(c)); //[1, 2, 3]
返回值是一个新数组,会改变接收这个新数组的引用的一些属性
eg:
int[] arr1 = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] arr2 = new int[5];
arr2 = Arrays.copyOf(arr1, 10);
System.out.println(Arrays.toString(arr2)); //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Arrays.copyOf()的拷贝是从下标0开始的,如果你想从其他下表开始,可以使用Arrays.copyOfRange()方法
int[] arr1 = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] arr2 = new int[5];
//from起始下标 , to 复制到下标前一位
arr2 = Arrays.copyOfRange(arr1, 2,6);
System.out.println(Arrays.toString(arr2)); //[3, 4, 5, 6]
System.out.println(Arrays.toString(a)); //[1, 2, 3, 4, 5]
System.out.println(Arrays.toString(b)); //[1, 2, 3, 4, 5]
System.out.println(Arrays.toString(c)); //[1, 2, 3]
返回值是一个新数组,会改变接收这个新数组的引用的一些属性
eg:
```java
int[] arr1 = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] arr2 = new int[5];
arr2 = Arrays.copyOf(arr1, 10);
System.out.println(Arrays.toString(arr2)); //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Arrays.copyOf()的拷贝是从下标0开始的,如果你想从其他下表开始,可以使用Arrays.copyOfRange()方法
int[] arr1 = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] arr2 = new int[5];
//from起始下标 , to 复制到下标前一位
arr2 = Arrays.copyOfRange(arr1, 2,6);
System.out.println(Arrays.toString(arr2)); //[3, 4, 5, 6]