typora-copy-images-to: ./
Java基础知识点整理
JDK输出
System.out.println() //小括号可以没有内容, 作为换行符 System.out.print() ///小括号必须有内容,否则报错
转义符
\
注释
学习写注释的习惯
注释位置: 1) 类名 2) 方法上 3) 在复杂的逻辑代码上
变量
变量的三素:
变量名(获取数据) 数据类型(控制变量的存储空间) 变量值
注意:
String引用数据类型
整数默认int类型,默认浮点数double型
char类型值: 只能是单字符, 必须使用单引号 ‘a’ ‘中’ ‘1’ ‘ab’ 错误
变量的使用
声明、赋值、使用
注意:
1):如果变量是 byte: 赋值的数字 ~128 - 127 之间, 若数字超出此范围,可直接赋值, 直接赋值报错(直接!
2):float num = 1.2; 1.2 double类型, 相当于把double类型转换为float类型, 但是float类型比double低
相当于将高转换为低, 不能自动转换,报错
3):char值只能是单字符,需要单引号引起 ‘a’ ‘1’
转换数据类型
-
从低到高 , java 自动转换
-
从高到低: 无法自动转换, 需要手动强制转换: 数据类型(低) 变量名 = ()值(高值);
double a = 1.2; float b = (float)a; int c = (int)a;
面试题: char为什么能保存中文字符?
电脑里保存的不是中文字符,而是ASCII代码,每个中文字符对应一个ASCII码
进制转换
Scanner输入
使用步骤
1):导入类别 Scanner类, 位于java.util包: import java.util.Scanner; String/System 不需要导包, 位于java.lang包中的类程序将自动加载
2):创建Scanner Scanner input = new Scanner(System.in); (input可自定义))
3):调用next相关方法, 进行输入 input .nextInt() input.nextDouble()等等,
注意:
不能输入char ,没有nextChar() 这个方法,
next() 输入字符串 nextLine() 输入字符串
细节:
next() 输入有效字符串, 不包含 空格,tab,回车, 遇到空格,tab,回车时,输入结束,但空间,tab,回车及以下内容将保存在缓存中
nextLine() 包含空格的输入字符串, 但是nextLine() 如果前面还有别的next() nextInt() nextDouble()…等方法时,nextLine() 不起作用, 无法输入
解决方案:
- nextLine() 放在所有的next方法之前
- nextLine() 不在第一位: 使用nextLine() 再加一个nextLine()
运算符
算数运算符 - * / %
:数值类型 结果为数值类型的数值类型; 任意类型 结果是字符串类型
int a = 10; int b = 20; System.out.println(a b “101”); // 30101 System.out.println(“101” a b); //1011020 /:整数/整数,结果取整; 当有浮点数时,结果是小数
int num1 = 5; int num2 = 2; System.out.println(num1 / num2); // 2
double num3 = 2;
System.out.println(num1 / num3); //2.5
System.out.println((double)num1 / num2); // 2.5
System.out.println(num1 / (double)num2); // 2.5
System.out.println((double)(num1 / num2); // 2.0
%:作用1:判断是否整除 2.得到某位数值
1234 % 10 ,得到个位
1234 / 10 %10 ,得到十位
1234 /100 %10 ,得到百位
1234 / 1000 % 10 ,得到千位
赋值运算符 =
a = a+1; 与 a+=1; 的区别
赋值符号与算术符号组合的赋值符号存在 隐式数据类型转换,a += b; 把a+b的结果 转换为a的类型
int a = 1; double b = 2; a = a+b;//报错
a+=b;// a=3 (a+b)的结果转换为int类型也就是a的类型
-= *= /= %=同理
面试题可能出现
int a = 2;
byte b = 1;
b = b+a;//报错
b +=a;//b=3
比较运算符> < >= <= == !=
使用场景
1):条件语句、循环语句 运算结果:boolean类型
逻辑运算符&& || ! & |
使用场景
1):条件语句、循环语句、连接多个比较表达式 运算结果:boolean类型
&&与&、||与|的区别
&&、||存在短路运算,&、|不存在短路运算,推荐使用&&、||
面试题
int a = 10;
int b = 6;
boolean rs = (a++ >11)&&(b++ >5);//10>11 false
System.out.println(rs);//false
System.out.println(a,b);//a = 11;b = 6
boolean rs = (a++ >11)&(b++ >5);
System.out.println(rs);//false
System.out.println(a,b);//a = 11;b = 7
三目运算符 条件(boolean的表达式)?值1:值2
三目运算符可以嵌套: 条件1?值1:(条件2?值2:值3),最好不要嵌套超过两次,可读性差
对if-else 某些场景的简化, if-else返回结果, 可以使用三目运算替换
自增自减运算符++ –
++变量 变量++ --变量 变量–
++a : a = a+1; (++a) = a
a++:(a++)= a; a = a+1
位运算& | ^(异或) !
异或特征
一个数异或某个数两次,得到自己(简单得密码加密)
拓展
>>右移
<<:左移
java: 十进制, 八进制, 十六进制:
int a = 123; //十进制数
int b = 0123; //八进制
int c = 0x123; //十六进制
分支语句
- if 分支语句: 条件语句 最重要的
- switch分支语句: 条件语句: 等值判断
if语句
注意:
如果 if,else, else if大括号中只有一行代码, 可以省略大括号, 但是最好不省略,提高可读性
switch语句 等值判断
注意
1):case的值不能相同, 值唯一
2):break: 可以省略, 也可以不省略
3):default: 可有可无, default 可以在最前面, 也可以在最后面, 推荐写在最后面, 可以省略break,如果写在最前面, 一定要写 break;
循环
for循环
for(表达式1 ①;表达式2 ②;表达式3 ③){
//循环要做的事情 ④
}
表达式1: 初始化循环变量, 给循环变量赋值, 只执行一次
表达式2: 循环条件表达式, boolean类型的结果, 如果true: 表示继续循环, 如果false:结束循环
每循环一次执行一次
表达式3: 修改循环变量, 如果不改,可能出现死循环,每循环一次执行一次
1 --> 2 --true-> 4 --> 3 --> 2 -false-> 结束
使用步骤
- 判断是否需要使用循环, 看问题中是否有重复做的事情
- 找循环条件
- 找循环要做的事情
难点: 把循环条件,循环要做的事情转换为代码
细节: 表达式能省略, 两个分号一定不能省略
for循环的表达式细节
-
表达式1 可以省略, 可以把表达式1 写在for循环的外面, 提升循环变量的作用域
-
表达式2可以省略, 默认永远为true, 出现死循环, 避免出现死循环, 也可以在循环体中使用 break关键字退出循环
-
表达式3可以省略, 循环变量没有改变,可能出现死循环, 也可以在循环体写表达式3
-
三个表达式都省略, 但是两个分号不能省略
for(;😉{ //死循环
//在循环体中使用break退出循环
}
while循环
//把for循环的表达式1 写在循环之外, 表达式3写循环体的for循环
for/while特征:
先判断,后循环, 可能一次都不执行, 开始循环条件为false
do-while循环
do-while 特征
先循环,后判断, 循环体至少执行一次
语法:
do{
//循环体
}while(循环条件);
注意: while后面小括号之后有一个分号,不能省略
IDEA的使用
快速遍历数组
数组名.fori
数组
存储一组相同类型的值,长度由创建数组的时候指定 缺点:固定长度
数组元素
数组名、数据类型(基本数据类型,类类型,对象)、元素、下标(从0开始)、数组的长度
使用数组(一维数组)
1):声明数组(没有开辟空间) 语法格式:① 数据类型[ ] 数组名 ; ② 数据类型 数组名[ ];
2):开辟空间 (指定数组的长度,开辟的空间是连续的) 语法格式: 数组名 = new 数据类型[长度]
注意:开辟空间的同时,会根据数据类型将元素的值初始化,int的初始值为0,float、double初始值为0.0, char:\u00, boolen:false, String/类类型:null
3):往数组中存放元素 语法格式: 数组名[下标] = 值;
如果下标超出数组最大下标的范围,会抛出一个数组越界异常
如果一个数组没有开辟空间,不能存放数据,否则报错
4):数组的静态创建(合并1) 2) 3)) 语法格式:数据类型[ ] 数组名 = new 数据类型【】{值1,值2,值3}
new 后面的【】不能写数组长度,jdk会根据数组元素的个数确定数组长度
简写:数据类型 数组名 = {值1,值2,值3}
int arr[];
arr = new int[5];
System.out.print(arr[0],arr[1],arr[2]);//0,0,0
arr[0] = 9;
System.out.print(arr[0]);//9
System.out.print(arr[5]);//超出范围 报错
int arr2[];
arr2[0] = 8;
System.out.print(arr2[0]);//arr2没有开辟空间,不能赋值,报错
//数组的静态创建(实际开发用得少)
int arr3[] = new arr3[]{
1,2,3}
int arr4[] = {
1,2,3}
对数组的增删查改
删除:把删除元素后面的元素往前挪一个位置,将被删除的元素还原为初始值
//删除 先把要删除的元素之后的元素往前移一位
int rmIndex = 2;
for (int i = rmIndex+1; i < arr.length; i++) {
arr[i-1] = arr[i];
}
//最后一个元素复位为初始值
arr[arr.length-1] = 0;
java内存模型

栈区: 方法执行时, 方法入栈, 存放临时变量,当方法执行完成之后, 出栈,该方法往栈区存放临时变量空间都会回收 堆区:new 出来的东西都存在堆区, java提供的GC(垃圾回收器)机制 方法区:字节码文件(.class文件)加载时进入的内存 本地方法栈:调用操作系统相关资源
二维数组
本质:由多个一维数组组成
三维数组:多个二维数组组成
声明一个二维数组
1): 数据类型[ ] [ ] 数组名;
2): 数组名 = new 数据类型[长度1] [长度2];
长度1指的是一维数组的个数,长度2指的是一维数组的长度
如果不指定长度2,表示每一个一维数组的长度是不一样的
3): 数组名[i] [j] = 值;
二维数组的静态初始化
int[ ] [ ] arr = {
{
1,2,3},{
4,5,6},{
7,8,9}};
注意:
二维数组的一维数组长度: 数组名.length
二维数组的指定下标的一维数组元素个数: 数组名[下标].length
二维数组的元素个数: 数组名[0].length+数组名[1].length+…+数组名[数组名.length-1].length
int[ ] [ ] arr = {
{
1,2,3,9},{
4,5,6},{
7,8,9}};
System.out.print(arr.length);//3
System.out.print(arr[0].length);//4
System.out.print(arr[0].length+arr[1].length+arr[2].length);//10