Java概述
- JDK: Java Development Kit 的英文缩写,中文翻译:Java开发工具包。是Java开发的核心,包括了Java运行环境 jre,很多的Java工具,以及一些Java基础类库。
- JRE: Java Runtime Environment 的英文缩写,中文翻译:Java运行环境。是运行基于Java语言编写的程序所不可缺少的运行环境。
- JVM:Java Virtual Machine 的英文缩写,中文翻译:Java虚拟机。是Java实现跨平台的最核心部分。所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。由虚拟机将程序解释给本地系统执行。
注释
//
:单行注释/* */
:多行注释/** */
:文档注释
!> 多行注释不能嵌套
变量和常量
1.声明变量
- 声明变量时需要先声明类型,然后就是变量名
- 变量名必须由字母开头和其他数字或字母构成,变量名长度没有限制
- 不能使用Java保留字作为变量名,Java9中单下划线
_
不能作为变量名
2.变量初始化
- 变量需要用
=
进行赋值 - 变量的声明尽可能靠近变量第一次使用的地方
- Java10开始,局部变量会根据初始值来判断其类型
3.常量
- 在变量的前面添加
final
关键字表示是一个常量 - 被关键字
final
修饰后的常量初始化后将不能更改 - 如果常量需要在多个类中共享可以用
static
关键字修饰 - 习惯上常量名全部使用大写字母
输入与输出
1.读取输入
- 构建扫描器(Scanner)与
System.in
关联
Scanner sc = new Scanner(System.in);
- 读取控制台输入数据
// 读取一行数据
String s = sc.nextLine();
// 读取一个字符串
String next = sc.next();
// 读取一个数字
int i = sc.nextInt();
// 判断是否输入字符串
boolean b1 = sc.hasNext();
// 判断是否输入数字
boolean b2 = sc.hasNextInt();
2.格式化输出
// 输入x
System.out.print(x);
// 补全8个字符,保留2位小数
System.out.printf("%8.2f", x);
// 多个参数(printf转换符)
System.out.printf("Hello, %s. Next year, you'll be %d", "hzlim", 159);
// 用,分割数值(printf标志)
System.out.printf("%,.2f", x);
// 格式化时间,以t开始(printf日期和时间转换符)
System.out.printf("%tc", new Date());
基本数据类型
1.整型
- 用于表示没有小数的数值,允许负数。有4种数据类型 | 类型 | 存储需求 | 取值范围 | | —- | —- | —- | | int | 4字节 | -2147483648 ~ 2147483647; -2^31 ~ 2^31-1 | | short | 2字节 | -32768 ~ 32767; -2^15 ~ 2^15-1 | | long | 8字节 | -9233372036854775808 ~ 9233372036854775807; -2^63 ~ 2^63-1 | | byte | 1字节 | -128 ~ 127; -2^7 ~ 2^7-1 |
- 长整型(long)数值有一个后缀L或l
- 数值可以用进制表示:十六进制加前缀0x或0X、八进制加前缀0、二进制加前缀0b或0B
- 数值可以加
_
,1_000_000
表示100万,加下划线只是为了更容易读
10进制转2进制:除二取余法或拆分法
负10进制转2进制:按位取反最后加1
2.浮点型
- 浮点型用于表示有小数部分的数值。有2种数据类型 | 类型 | 存储需求 | 取值范围 | | —- | —- | —- | | float | 4字节 | -3.403E38 ~ 3.403E38 | | double | 8字节 | -1.798E308 ~ 1.798E308 |
- float类型后有一个F或f,没有后缀的默认为double类型
!> 浮点型进行计算时会产生误差,如果需要进行精确运算则需要使用BigDecimal类
3.boolean型
- boolean(布尔)类型只有2个值:false和true
4.char类型
- char类型用于表示单个字符
- 占用2个字节,并且没有符号位,范围是0 ~ 65535
- 字面量需要用
''
括起来,如'A'
代表65的字符串常量 - 常用ASCII有:
'0'
- 48;'A'
- 65;'a'
- 97;空格
- 32;换行符
- 10 - 可以使用Unicode字符集,范围是\u0000 ~ \uFFFF,
'\u0041'
则代表'A'
!> 不建议在程序中使用char类型,最好使用字符串
堆和栈
- 栈用于存放程序运行过程中所有的局部变量,一个运行的Java程序从开始到结束会有多次变量的声明
- JVM会在其内存空间中开辟一个称为堆的存储空间,这部分空间用于存储使用new关键字创建的数组和对象
- 栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收
调用示意图
字符串
1.字符类型
- Java字符串就是Unicode字符序列
- 转义字符有:
\"
-"
;\'
-'
;\\
-\
;\t
-制表符
;\n
-换行符
2.字符串连接符
- 可以使用
+
连接两个字符串,来组成一个新的字符串 +
两边只要有一个变量是字符串,另一个变量将会被转换成字符串
类型转换
1.自动类型转换
- 从小类型到大类型进行转换:
byte
—>short/char
—>int
—>long
—>float
—>double
2.强制类型转换
- 主要是从大类型转换成小类型:目标类型 变量名 = (目标类型) 源类型变量名
!> 强制类型转换可能会导致精度丢失
运算符
1.算数运算符
- +、-、*、/ 、%表示加、减、乘、除、取余运算
- 如果将一个类标记为
strictfp
,这个类中的所有方法都要使用严格的浮点计算 - 整数被0整除会产生一个异常,浮点数被0除会得到Infinity或NaN结果
2.数学函数与常量
- 幂运算:Math.pow(x, a)
- 取余运算:Math.floorMod(x, y)
- 三角函数:Math.sin、Math.cos、Math.tan、Math.atan、Math.atan2
- 指数函数:Math.exp、Math.log、Math.log10
- 常量:Math.PI、Math.E
3.结合赋值和运算符
x = x + 4
等于x += 4
4.自增自减运算符
- n将变量n的当前值加1,n—则将n减1;,—都可以放在n的前面如++n
- 在表达式中,前缀形式的会先完成加1操作;而后缀的形式会使用原来的变量,然后再加1
!> 建议不要再表达式中使用++,这样可能会导致降低可读性或出现BUG
5.关系和boolean运算符
==
相等,!=
不相等,<
小于,>
大于,<=
小于等于,>=
大于等于&&
与,||
或- 三元运算符:
x < y ? x : y
当x < y为true时返回x,反正返回y
6.位运算符
<<
左移运算符,用于将数据的二进制位向左移动,右边0填充>>
右移运算符,用于将数据的二进制位向右移动,左边使用符号位填充>>>
表示逻辑右移运算符,用于将数据的二进制位向右移动,左边使用0填充&
表示按位与运算符,按照二进制位进行与运算,同1为1,一0为0|
表示按位或运算符,按照二进制位进行或运算,一1为1,同0为0~
表示按位取反运算符,按照二进制位进行取反,1为0,0为1
7.运算符优先级
运算符 | 综合性 |
---|---|
[] . ()(方法调用) |
从左向右 |
! ~ ++ -- +(一元运算) -(一元运算) ()(强制类型转换) new |
从右向左 |
* / % |
从左向右 |
+ - |
从左向右 |
<< >> >>> |
从左向右 |
< <= > >= instanceof |
从左向右 |
== != |
从左向右 |
& |
从左向右 |
^ |
从左向右 |
| |
从左向右 |
&& |
从左向右 |
|| |
从左向右 |
?: |
从右向左 |
= += -= *= /= %= &= |= ^= <<= >>= >>>= |
从右向左 |
流程控制
1.条件语句
- 当条件condition成立时则会执行代码块中的内容
if (condition){
statement1
statement2
...
}
- 当条件condition不成立时则会执行代码块中的statement2
if (condition){
statement1
...
} else {
statement2
...
}
- 当满足条件condition1时则会执行statement1。如果不满足condition1,但是满足condition2则会执行statement2,当上面2个条件都不满足则会执行statement3
if (condition1){
statement1
...
} else if (condition2){
statement2
...
} else {
statement3
...
}
2.循环
- 当满足条件condition则会执行statement。执行完之后,再次判断condition是否满足条件,满足则再次执行statement。直至不满足condition条件时停止执行。
while (condition){
statement
...
}
- 先执行statement,执行完后判断condition是否满足,满足则再次执行statement,不满足则直接结束循环
do {
statement
...
} while (condition);
3.确定循环
int i = 0
所在位置代表变量i的初始值,i < 10
所在位置代表i满足条件时才会执行下面代码块中的代码,i++
所在位置代表每次循环i所发生的变化。下方代码表示i从0开始每次循环加1,一共循环10次,结果将会打印0-9
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
4.多重选择
- 传入一个参数value,在case标签中进行匹配,当有一个case匹配成功则执行匹配成功的case下的代码,最后由break来退出整个代码块。当case条件一个都不满足,则执行default下的代码然后退出。
switch (value) {
case 1:
System.out.println("1");
break;
case 2:
System.out.println("2");
break;
default:
System.out.println("def");
}
case标签可以是
- 类型为char、byte、short、int的常量表达式
- 枚举常量
- 从Java7开始,case标签还可以是字符串
5.中断控制流程
- break将会立刻结束当前循环。下方的结果将会打印0-6然后结束
for (int i = 0; i < 10; i++) {
if (i == 7){
break;
}
System.out.println(i);
}
- continue将会跳过本次循环。下方的结果将会打印0-6,8-9
for (int i = 0; i < 10; i++) {
if (i == 7){
continue;
}
System.out.println(i);
}
数组及应用
- 当需要在Java程序中记录多个类型相同的数据内容时,则声明一个一维数组即可,一维数组本质上就是在内存空间中申请一段连续的存储单元
- 数组是相同数据类型的多个元素的容器,元素按线性顺序排列,在Java语 言中体现为一种引用数据类型
- 可以直接通过下标(或索引)的方式访问指定位置的元素,速度很快
- 数组要求所有元素的类型相同
- 数组要求内存空间连续,并且长度一旦确定就不能修改
- 增加和删除元素时可能移动大量元素,效率低
1.声明数组
// 声明数组
int[] a1;
// 初始化了一个可以存储100个整数的数组
int[] a2 = new int[100];
// 初始化数组的简写形式
int[] a3 = {1, 2, 3, 4, 5,};
// 重新初始化一个数组
int[] a4 = new int[]{1, 2, 3, 4, 5,};
2.访问数组元素
- 可以通过
变量名[下标]
来获得数组的元素
for (int i = 0; i < a4.length; i++) {
System.out.println(a4[i]);
}
- 可以通过增强for循环来遍历数组,而不用考虑数组长度
for (int i : a4) {
System.out.println(i);
}
3.数组拷贝
- 将a4数组拷贝到copyArray,并重新指定数组长度
int[] copyArray = Arrays.copyOf(a4, a4.length + 5);
4.数组排序
- 将a4数组进行排序
Arrays.sort(a4);
5.常用API
方法声明 | 功能介绍 |
---|---|
static String toString(xxx[] a) |
返回包含a元素的字符串 |
stataic xxx[] copyOf(xxx[] a, int end) |
拷贝数组,长度为end,数组长度大于a,则填充0或者false |
stataic xxx[] copyOfRange(xxx[] a, int start, int end) |
拷贝数组,长度为end-start,数组长度大于a,则填充0或者false |
stataic void sort(xxx[] a) |
使用优化的快速排序算法进行排序 |
static int binarySearch(xxx[] a, xxx v) |
使用二分查找算法在有序数组a中查找v。找到返回下标,否则返回负数 |
static int binarySearch(xxx[] a, int start, int end, xxx v) |
使用二分查找算法在有序数组a中查找v。找到返回下标,否则返回负数 |
stataic void fill(xxx[] a, xxx v) |
将数组所有元素设置成v |
stataic boolean equals(xxx[] a, xxx[] b) |
数组大小,元素相等,返回true |
6.多维数组
- 维数组本质上就是由多个一维数组摞在一起组成的数组,二维数组中 的每个元素都是一维数组,而一维数组中的每个元素才是数据内容
- 声明并初始化数组(使用方式和一维数组类似)
int[][] b1 = new int[行数][列数];
- 声明一个固定行数不确定列的二维数组
int[][] b2 = new int[3][];
b2[1] = new int[3];
b2[1] = new int[4];
b2[1] = new int[5];
更新时间:{docsify-updated}