代码规范
Java程序的文件名与类名必须一致 建议一行只写一条语序 注意代码缩进(按tab直接八个空格) 声明变量的数据类型和变量名(包含数字,字母,下划线,$,不能包含空格,运算符,不能用关键字命名例如public,不能以数字开头) 数据类型转换规则只能由低字节向高字节进行转换,反之则不行{比如int4个字节转换(整数)为double8个字节(小数点后一位)}
配置Java环境
右击“我的电脑”右键“属性”“高级系统设置”“高级”“环境变量” 在系统变量新建“JAVA_HOME”变量值换成JDK的安装路径 在系统变量里新建“CLASSPATH”变量 变量值“.;%JAVA_HOME%\lib” 找到path变量(系统自带的)添加变量“$JAVA_HOME%\bin” 打开运行输入cmd再输入“java_version”
条件运算符
三元运算符,三目运算符,三元表达式
根据不同的条件给同一个变量赋不同的值,变量=条件?值1:值2
(条件是true把值1赋给变量,条件是false则把值2赋给变量)
例:
int num = 1<2?1:0;
System.out.println(num);
输出结果为1
int num = 1>2?1:0;
System.out.println(num);
输出结果为0
int num = 1>2?0:1;
System.out.println(num);
输出结果为1 (与位置无关)
变量
-
数据类型
-
变量名
-
变量值
基本数据类型+引用数据类型
数值类型:byte 1个字节、int 4个字节、short 2个字节、long 8个字节、float 4个字节、double 8个字节
非数值类型:char 2个字节、boolean 1/8个字节
数据类型转换
-
自动转换
java可以自动对某些数据类型进行自动转换(只能由低字节向高字节转换)
public static void main(String[] args) {
int num1 = 10;
double num2 = num1 ;
System.out.println(num2);
}
//输出结果是10.0 自动转换为double类型
-
强制类型转换
java无法自动转换的数据类型,开发者可以通过强制手段进行转换(一般来讲强制转换可能会造成精度损失)
public static void main(String[] args) {
double num1 = 10.5;
int num2 = (int)num1 ;
System.out.println(num2);
}
//输出结果是10,强制将double类型的num1转换为int类型
流程控制
if-else
int score = 70;
int integal = 600;//integal代表积分
System.out.println("本次答题得分:"+score);
System.out.println("您的积分:"+integal);
if(score>60 && integal>=500){//短路与计算如果score分数>60则恭喜您中奖了或者就是积分integal>=500
System.out.println("恭喜您中奖了");
}else{
System.out.println("很遗憾");
}
if(score>80 && integal>=300){
System.out.println("恭喜您中奖了");
}else{
System.out.printl("很遗憾");
输出结果为:恭喜您中奖了
很遗憾
(输出结果有问题,逻辑思路错了,第5行和第10行其实相当于一个或的关系,也可以将第10行改为else if)
int score = 70;
int integal = 600;//integal代表积分
System.out.println("本次答题得分:"+score);
System.out.println("您的积分:"+integal);
if((score>60 && integal>=500)||(score>80 && integal>=300)){//短路与计算如果score分数>60则恭喜您中奖了或者就是积分integal>=500
System.out.println("恭喜您中奖了");
}else{
System.out.println("很遗憾");
}
输出结果为:恭喜您中奖了
-
多重if
173M
173~178L
178XL
-
if后面必须跟条件
-
else后面不能跟条件
-
else后面可以跟括号也可以跟if(else if)
switch-case
与if不同的是,switch-case只能完成等值判断,而无法完成判断大小。
如果是判断两个值是否相等,可以使用switch-case,如果比较两个值的大小关系,则不能使用switch-case。
switch 支持int、short、char、枚举、String类型,不支持boolean类型。
基本语法
switch(变量){
case 值1:
//业务代码
break;
case 值2:
//业务代码
break;
default;//前面的条件都不成立执行default默认
//业务代码
break;
}
case判断变量是否等于某个值,default表示所有的case都不成立的情况下所执行的代码。
1 奖励 2000复合算术运算符
+= , -= ,*=,%=
变量1+=变量2:先求出变量1和变量2之和,再把计算结果赋值给变量1,变量1=变量1+变量2
以此类推
关系运算符
==, !=不等于,>,<,>=,<=
只能用作数字类型作为比较
char cha = 'a';
char cha1 = 'b';
System.out.println(cha != cha1);
== , != 用于非数字类型,输出正确或错误 false or true
int num1 = 10;
int num2 = 11;
boolean flag = num1 >= num2;
System.out.println(flag);
将输出false or true
通常用来作为判段 是 与 非 后面常跟 flag
逻辑运算符
逻辑运算符只能用于boolean类型的数据运算,判断boolean数据之间的逻辑关系,与,或,非
- 符号代表&(与),|(或),!(非),&&(短路与),||(短路或)
- 变量1&变量2:只有当变量1和变量2结果都为true时结果才为true,有一个为false则为false变量1|变量2:只要有一个变量为true则结果为true
- 变量1:若变量1为true,结果为false,若变量1为false,结果为true
- 变量1&&变量2:只有当变量1和变量2结果都为true时结果才为true,有一个为false则为false
- 变量1||变量2:只要有一个变量为true则结果为true
短路与 和 与 ,短路或 和 或 区别
短路与:如果检测到变量1为false直接判断false不用再判断变量2
短路或:如果检测到变量1为true直接判段结果为true不用再判断变量2
减少了判断量提高了运算效率
面试经典题
public class Test{
public static void main(String[]args){
int num1 = 10;
int num2 = 11;
System.out.println((num1++==num2)&(++num1==num2));
System.out.println(num1);
}
}
输出结果是false
12
因为num1加完1等于11(num1++==num2)是true而(++num1==num2)的++num1加完1等于12与num2不等为false 所有输出为false
-
2 奖励 1000
-
3 奖励 500
-
否则没有奖励
运算符
-
复制运算符
数据类型 变量名 = 数值/变量
public static void main(String[] args) {
//1、创建变量用来记录张三的体重
double weight1 = 60.5;
//2、创建变量表示李四的体重
double weight2 = 70.5;
System.out.println("交换之前:张三的体重是"+weight1+",李四的体重是"+weight2);
System.out.println("进行交换");
double temp;
temp = weight2;
weight2 = weight1;
weight1 = temp;
System.out.println("交换之后:张三的体重是"+weight1+",李四的体重是"+weight2);
}
-
算术运算符
-
基本算术运算符
+、-、*、/、%、++、--
-
复合算术运算符
-
位运算符
-
十进制和二进制的转换
*十进制转二进制:目标数除以2,若能除尽,该位记做0,若除不尽,该位记做1,再对商继续除以2,以此类推,直到商为0,然后把每一位的结果反序组合就是对应的二进制*。(二进制算法)
10:1010
17:10001
*二进制转十进制:从目标数的最后侧起,本位的数值乘以本位的权重,权重就是2的第几位的位数减一次方,将每一位,不同级的值进行相加,得到结果就是十进制。
1010:10
位运算
:&(按位y与),|(按位或),^(按位异或),<<(左移),>>(右移)
变量1&变量2:先转换为二进制,再依次一一对应按与计算,都为1则输出为1。
变量1|变量2:先转换为二进制,再依次一一对应按或计算,有一个为1则输出为1。
变量1^变量2:先转换为二进制,再依次一一对应按异或计算,相同记为0,不同记为1。
变量1<<变量2:变量1乘以2的变量2次方
2<<3:2*8=16
变量1>>变量2:变量1除以2的变量2次方
2>>3:2/8=0
循环
for、while、do-while、foreach
循环四要素:
-
初始化循环变量
-
循环条件
-
循环体
-
更新循环变量
while
public class Test11 {
public static void main (String[] args) {
//初始化循环变量
int num = 0;
//循环条件
while(num < 10) {
//循环体
System.out.println("Hello world!");
//更新循环变量
num++;
}
}
}
public class Test12 {
public static void main (String[] args) {
String flag = "y";
while (flag.equals("y")){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入学生的学号:");
int id = scanner.nextInt();
switch (id){
case 1:
System.out.println("张三的成绩是96");
break;
case 2:
System.out.println("李四的成绩是91");
break;
case 3:
System.out.println("王五的成绩是89");
break;
default:
System.out.println("请输入正确的学号");
break;
}
System.out.println("是否继续?y/n");
flag = scanner.next();
}
System.out.println("感谢使用学生成绩查询系统!");
}
}
do-while
public static void main(String[] args){
//始化循环变量
int num = 0;
do {
//循环体
System.out.println("Hello World");
//更新循环变量
num++;
}while(num<10);
//循环条件
}
}
while先判断再执行,do-while先执行再判断
for
适用于循环次数确定的情况下
for(初始化循环变量;循环条件;更新循环变量){
循环体
}
for(int num = 0;num < 10;num++){
System.out.println("Hello World");
}
while、do-while、for 3种循环的区别
-
相同点:都遵循循环四要素,初始化循环变量、
循环条件、循环体、更新循环变量。
-
不同点:
-
while 和 do-while 适用于循环次数不确定的业务场景;for 适用于循环次数确定的场景。
-
while 和 for 都是先判断循环条件,再执行循环体;do-while 先执行循环体,再判断循环条件。
-
分别使用while、do-while、for 循环输出10以内的所有奇数
for 循环只适用于循环次数确定的场景下 for 也可以适用于循环次数不确定的场景,while 和 do-while 循环次数确定或者不确定都可以使用。
数组
数组就是一种可以存储大量数据类型相同的变量的数据结构,数组就是一个具有相同数据类型的数据集合。
数组中的数据必须是同一种类型的。
数据类型必须完全相同如int类型float类型
数组的基本要素
-
数组名称
-
数组元素
-
元素下标
-
数据类型
数组本身就是一个变量,数组名称就是变量名,数组中保存的每一个数据都会有一个下标(从0开始)可以快速检索到对应的元素
public class Test14 {
public static void main (String[] args) {
//声明数组
int[] array;
array = new int[6];
//给数组赋值
array[1]=4;
array[2]=1;
int[] array2 ={1,2};
int[] array3 = new int[]{1,2};
// array[2]=10;
System.out.println("数组中的第二个元素是:"+array[2]);
}
}
public class Test14 {
public static void main (String[] args) {
// int[] array = {1,2,3,4,5,6};
int[] array = new int[4];
array[0] = 179;
array[1] = 182;
array[2] = 167;
array[3] = 176;
double sum = 0;
for (int i = 0; i < array.length;i++);{
sum = sum + array[1];
}
System.out.println();
}
}
public class Test15 {
public static void main (String[] args) {
int[] array = new int[100];
for(int i=0;i< array.length;i++) {
array[i] = i + 1;
}
System.out.println(Arrays.toString(array));
}
}
数组常见的错误
-
数据类型不匹配。
-
边声明边赋值的方式,代码必须写在同一行,不能换行。
-
数组下标越界。
数组的常用操作及方法
-
求数组的最大值
-
求数组的最小值
-
在数组的指定位置插入数据
-
对数组进行排序
求最大最小值
public static void main(String[] args) {
int[] array ={73,80,62,93,96,87};
int max = array[0];
int min = array[0];
for(int i = 1;i < array.length;i++)
{
if(array[i]>max)
{
max=array[i];
}
}
System.out.println("最大值为:"+max);
for(int i = 1;i < array.length;i++)
{
if(array[i]<min)
{
min=array[i];
}
}
System.out.println("最小值为:"+min);
}
在数组的指定位置插入数据
public static void main(String[] args) {
int[] array = {96, 93, 87, 80, 73, 62};
//将83插入到数组下标为3的位置
int num = 83;
int[] array2 = new int[array.length+1];
//将原数组中的数据移动到新数组中
for(int i=0;i<3;i++) {
array2[i] = array[i];
}
for (int i=4;i< array2.length ;i++){
array2[i]=array[i-1];
}
array2[3]=num;
System.out.println("插入后的数组:"+ Arrays.toString(array2));
}
对数组进行排序
public static void main(String[] args) {
int[] array = {96, 93, 87, 80, 73, 62};
//冒泡排序
for(int i=0;i< array.length-1;i++)
{
if(array[i+1]>array[i]) {
int temp;
temp = array[i];
array[i]= array[i+1];
array[i+1] = temp;
}
}
System.out.println(Arrays.toString(array));
}
关于数组的各种方法
public static void main(String[] args) {
int[] array = {73,80,62,93,96,87};
int[] array2 = {73,80,62,93,96,87};
int[] array3 = {66,55,44,33,22};
System.out.println(Arrays.toString(array));
System.out.println(Arrays.equals(array,array2));//equals方法比较两组数组是否相等
Arrays.sort(array);//sort方法给数组排序
System.out.println(Arrays.toString(array));//排完序后的结果输出
Arrays.fill(array2,66);//将66填充进入array数组,将原来数组的值覆盖掉
System.out.println(Arrays.toString(array2));
int[] copyarray = Arrays.copyOf(array3,3);//复制数组将数组的值复制长度为3,长度不够就加默认值int类型的默认值为0
System.out.println(Arrays.toString(copyarray));
int index =Arrays.binarySearch(array,87);//查找87的位置返回的是下标,使用的是二分查找法必须保证数组是有序的
System.out.println(index);
}
//toString 方法只能解析一维数组变为字符串
二维数组
二维数组简单理解即一维数组中保存的值是另外一个一维数组
public static void main(String[] args) {
//声明
int[] [] array;
//开辟内存空间
array = new int[2] [3];
// array[0] [0] = 50;
// array[0] [1] = 60;
// array[0] [2] = 70;
// array[1] [0] = 80;
// array[1] [1] = 90;
// array[1] [2] = 100;
// System.out.println(Arrays.toString(array));
// int[] item ={50,60,70};
// int[] item2 ={80,90,100};
// array[0] = item;
// array[1] = item2;
int[][] array2 = {{50,60,70},{80,90,100}};
String str = "";
System.out.println(array2.length);
for(int i=0;i< array2.length;i++){
str += Arrays.toString(array2[i]);
}
System.out.println(str);
}
综合练习
用户管理系统
查询用户:将系统中保存的全部用户信息在控制台打印输出。
添加用户:向系统中添加新的用户信息,如果添加的用户已经存在,给出提示信息。
删除用户:输入用户名,进行删除操作,若输入的用户名不存在,给出提示信息。
账号冻结:输入用户名,进行冻结操作,若输入的用户不存在或者该用户已经被冻结,给出相应提示。
账号解封:输入用户名,进行解封操作,若输入的用户名不存在或者该用户状态正常,给出相应提示。
推出系统:跳出循环,给出提示信息。
package com.bsj;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static String[] names = {"张三", "李四", "王五", "小明"};
static int[] ages = {22, 23, 20, 22};
static String[] states = {"正常", "正常", "正常", "正常"};
public static void main (String[] args) {
//初始化数据
int num;
Scanner scanner = new Scanner(System.in);
do {
System.out.println("————欢迎使用用户管理系统————");
System.out.println("1、查询用户");
System.out.println("2、添加用户");
System.out.println("3、删除用户");
System.out.println("4、账号冻结");
System.out.println("5、账号解冻");
System.out.println("6、退出系统");
System.out.println("请选择:");
num = scanner.nextInt();
switch (num) {
case 1:
System.out.println("——————————查询用户——————————");
System.out.println("编号\t\t姓名\t\t年龄\t\t状态");
for (int i = 0; i < names.length; i++) {
if(names[i]!=null) {
System.out.println((i + 1) + "\t\t" + names[i] + "\t\t" + ages[i] + "\t\t" + states[i]);
}
}
System.out.println("输入0返回上级菜单");
num = scanner.nextInt();
break;
case 2:
System.out.println("——————————添加用户——————————");
System.out.println("请输入用户姓名:");
String name = scanner.next();
boolean flag = nameIsExisit(name);
if (flag == true) {
System.out.println(name + "已存在,请勿重复添加!");
} else {
if (names[names.length - 1] != null) {
//创建新的数组,并且将老数组的值存入新数组
names = Arrays.copyOf(names, names.length + 1);
names[names.length - 1] = name;
System.out.println("请输入" + name + "的年龄");
ages = Arrays.copyOf(ages, ages.length + 1);
int age = scanner.nextInt();
ages[ages.length - 1] = age;
states = Arrays.copyOf(states, states.length + 1);
states[states.length - 1] = "正常";
}else{
int index = getFirstNull();
names[index] = name;
System.out.println("请输入"+name+"的年龄");
int age = scanner.nextInt();
ages[index] = age;
states[index] = "正常";
}
System.out.println(name + "添加成功!");
}
// if (names[names.length - 1] != null) {
// System.out.println("数据已经填满,新用户无法加入!");
// } else {
// System.out.println("请输入用户姓名:");
// String name = scanner.next();
// boolean flag = nameIsExisit(name);
// if (flag == true){
// System.out.println(name+"名字已存在,请勿重复添加!");
// }else{
// names[names.length-1] = name;
// System.out.println("请输入"+name+"的年龄");
// int age = scanner.nextInt();
// ages[ages.length-1] = age;
// states[states.length-1] = "正常";
// System.out.println(name+"添加成功!");
// }
// }
System.out.println("输入0返回上级菜单");
num = scanner.nextInt();
break;
case 3:
if (names[0] == null) {
System.out.println("用户已全部删除!");
} else {
System.out.println("——————————删除用户——————————");
System.out.println("请输入用户名:");
name = scanner.next();
if (nameIsExisit(name)) { //判断用户是否存在
int index = getIndex(name);
if (index>=0){
for (int i=index;i< names.length-1;i++){
names[i] = names[i+1];
ages[i] = ages[i+1];
states[i] = states[i+1];
}
names[names.length-1] = null;
ages[ages.length-1] = 0;
states[states.length-1] = null;
}
} else {
System.out.println("您输入的用户不存在!");
}
}
System.out.println("删除完成!");
System.out.println("输入0返回上级菜单");
num = scanner.nextInt();
break;
case 4:
System.out.println("——————————账号冻结——————————");
System.out.println("请输入用户名:");
name = scanner.next();
if(nameIsExisit(name)){
int index = getIndex(name);
String state = states[index];
if (state.equals("冻结")){
System.out.println(name+"账号已经被冻结,请勿重复操作!");
}else{
states[index] = "冻结";
System.out.println(name+"冻结成功!");
}
}else{
System.out.println("输入的用户信息不存在!");
}
System.out.println("输入0返回上级菜单");
num = scanner.nextInt();
break;
case 5:
System.out.println("——————————账号解冻——————————");
System.out.println("请输入用户名:");
name = scanner.next();
if(nameIsExisit(name)){
int index = getIndex(name);
String state = states[index];
if (state.equals("正常")){
System.out.println(name+"账号状态已为正常,请勿重复操作!");
}else{
states[index] = "正常";
System.out.println(name+"解冻成功!");
}
}else{
System.out.println("输入的用户信息不存在!");
}
System.out.println("输入0返回上级菜单");
num = scanner.nextInt();
break;
case 6:
System.out.println("感谢使用本系统,再见!");
break;
}
} while (num != 6);
}
/**
* 判断用户输入的姓名是否已经存在与数组中
*/
public static boolean nameIsExisit (String name) {
for (int i = 0; i < names.length; i++) {
if (name.equals(names[i])) {
return true;
}
}
return false;
}
/**
* 找到名字在数组中的下标
*/
public static int getIndex (String name) {
for (int i = 0; i < names.length; i++) {
if (name.equals(names[i])) {
return i;
}
}
return -1;
}
/**
* 找到数组中第一个为空的下标
*/
public static int getFirstNull(){
for (int i = 0;i< names.length;i++){
if (names[i]==null){
return i;
}
}
return -1;
}
}