Java基础学习(三):输入输出、控制流程、大数值、数组
目录
- 一、输入输出
- 1. 读取输入
- 2. 格式化输出
- 二、控制流程
- 1. 块作用域
- 2. 条件语句
- 3. while循环
- 4. for循环
- 5. switch语句:多重选择
- 6. 扩展:break和continue
- 三、大数值
- 四、数组
- 1. 数组的初始化
- 2. 匿名数组
- 3. 数组定义方式
- 4. 数组拷贝
- 5. 命令行参数
- 6. 数组排序
相关文章
- Java基础学习(一):类名规范、返回值、注释、数据类型
- Java基础学习(二):Java中的变量和常量、final(重点)、运算、字符串
- Java基础学习(三):输入输出、控制流程、大数值、数组
- 多维数组可以看学习数组内存图(二)这篇文章有涉及到
- 八大排序可以看这四篇文章
- 学习冒泡排序+选择排序并使用java写代码
- 学习插入排序+希尔排序并使用java写代码
- 学习堆排序+基数排序并使用java写代码
- 学习递归+归并排序+快速排序并使用java写代码
一、输入输出
1. 读取输入
- 输出流:
System.out.println();
- 打印:
console.log();
在控制台打印 - 输入流:
System.in
想要输入,需要一个写数据的地方,需要控制台进行输入,所以需要构造一个Scanner
对象,对控制台进行扫描,与System.in
关联。
例如:Scanner sc = new Scanner(System.in);
Scanner
类中的方法
next()
:获取下一个单词,以空格作为结束符Scanner sc = new Scanner(System.in); String a = sc.next(); System.out.println(a); //在控制台中输入内容,回车 //输入:aaa bbb ccc //输出:aaa
nextLine()
:获取下一行内容Scanner sc = new Scanner(System.in); String a = sc.nextLine(); System.out.println(a); //在控制台中输入内容,回车 //输入:abc def //输出:abc def
- 注意:
nextLine()
单独使用没有问题,但与其他的方法一起用,nextLine()
会吃掉回车,所以可以多写一行,让其吃掉回车 - 下图中的示例:num的值为10,a的值为空格,将abcdefg给了b作为值
- 注意:
nextInt()
:获取一个整数,第一个输入的为整数,否则报错Scanner sc = new Scanner(System.in); int a = sc.nextInt(); System.out.println(a); //在控制台中输入内容,回车 //输入:12 15 nihao //输出:12
:``
nextDouble()
:获取一个浮点数,第一个输入的为数字,否则报错Scanner sc = new Scanner(System.in); double a = sc.nextDouble(); System.out.println(a); //在控制台中输入内容,回车 //输入:12 nihao 12.0 //输出:12.0
hasNext()
:检测是否还有其他的单词Scanner sc = new Scanner(System.in); boolean a = sc.hasNext(); System.out.println(a); //在控制台中输入内容,回车 //输入:What is your name? //输出:true
hasNextInt()
:检测是否还有其他的整数Scanner sc = new Scanner(System.in); boolean a = sc.hasNextInt(); System.out.println(a); //在控制台中输入内容 //输入:12 15 12.0 //输出:true
hasNextDouble()
:检测是否还有其他的浮点数Scanner sc = new Scanner(System.in); boolean a = sc.hasNextDouble(); System.out.println(a); //在控制台中输入内容,回车 //输入:What is your name? //输出:false
2. 格式化输出
输出
System.out.print();
java SE 5.0 沿用了C语言中的printf
方法,例如:
double x = 10000.0 / 3.0;
System.out.printf("%8.2f",x);//输出:3333.33
每一个以%字符开始的格式说明符都要用相应的参数替换。
控制格式化输出的标志:
二、控制流程
1. 块作用域
- 指的是当前代码子在那一块范围之内起作用
- 大括号
{}
括起来的代码
2. 条件语句
- if语句:
if(){}
,条件符合,进入到if里面去int a = 10; if(a>0){System.out.println("a"); }//输出:a
- if else 语句:
if(){}else{}
,条件符合,进入到if里面去;不满足,进入到else中int a = 10; int b = 5; if(a>b){System.out.println("a"); }else {System.out.println("b"); }//输出:a
- 多条件判断:
if(){}else if(){}else{}
,满足if条件,进入if中;满足else if条件,进入到else if中;否则进入到else中int a = 10; int b = 50; int c = 5; if(a>b){System.out.println("a"); }else if(a>c){System.out.println("a>c"); }else {System.out.println("b"); }//输出:a>c
3. while循环
while(条件) 执行代码语句
- 当条件为true时,while循环执行
- 如果开始循环条件的值为false,while循环题体一次也不执行
int a = 10;
while(a<15) {System.out.println(a);a++;
}//输出:10 11 12 13 14
do 代码语句 while(条件)
- 先执行语句,在检测循环条件;然后在重复语句,在检测循环条件
4. for循环
- for循环中写三条语句
- 第一句为初始条件,还可以定义在函数外面
- 第二句为条件判断,满足,执行;不满足,结束
- 第三句还可以定义到函数里面
for (int i = 0; i < 5; i++) {System.out.println(i); } //等价于 int i = 0; for (; i < 5;) {System.out.println(i);i++; }//输出:0 1 2 3 4
- for-each循环:通常用在遍历中
- num一次代表arr中的每一项
- :后是要循环的那个列表
int[] arr = {5,7,4,2,0,3}; for(int num:arr) {System.out.println(num); }
5. switch语句:多重选择
- 从上往下依次去匹配
- 从与选项值相匹配的case标签出开始执行直到遇到break语句
- 没有相匹配的case标签,有default子句,执行这个子句
- case标签
- 类型为char、byte、short、int的常量表达式
- 枚举常量
- 还可以是字符串
int a = 10; switch (a) { case 5:System.out.println("555");break; case 7:System.out.println("777");break; case 10:System.out.println("aaa");break; case 12:System.out.println("bbb");break; default:System.out.println("a");break; }//输出:aaa
注意:如果不加break,会击穿
int a = 10;
switch (a) {
case 5:System.out.println("555");
case 7:System.out.println("777");
case 10:System.out.println("aaa");
case 12:System.out.println("bbb");
default:System.out.println("a");
}//输出:aaa bbb a
6. 扩展:break和continue
使用break结束
- i=0时,不符合if条件,打印*
- i++
- 直到i=5,符合if条件,结束,跳出它所在的整个循环
for (int i = 0; i < 10; i++) {System.out.println(i);if(i>=5) {break;}System.out.println("******");
}
输出结果:
0
******
1
******
2
******
3
******
4
******
5
使用continue结束
- i=0时,不符合if条件,打印*
- i++
- 直到i=5,符合if条件,结束,结束本次循环,if下面的语句不在执行
- 但for循环依然执行,打印i,i=6,符合if条件,结束本次循环,if下面的语句不在执行
- 直到i<10,循环结束
for (int i = 0; i < 10; i++) {System.out.println(i);if(i>=5) {continue;}System.out.println("******");
}
输出结果:
0
******
1
******
2
******
3
******
4
******
5
6
7
8
9
三、大数值
满足整数和浮点数的精确度:
Biglnteger
:计算整数,实现了任意精度的整数运算BigDecimaL
:计算小数,实现了任意精度的浮点数运算valueOf()方法
:可以将普通的数值转换为大数值BigInteger a = BigInteger.valueOf(200000000); System.out.println(a.add(a));
运算方法
add()
:和BigInteger a = new BigInteger("200000000"); System.out.println(a.add(a));//输出:400000000
subtract()
:差BigInteger a = new BigInteger("200000000"); System.out.println(a.subtract(a));//输出:0
multipiy()
:积BigInteger a = new BigInteger("200000000"); System.out.println(a.multiply(a));//输出:40000000000000000
divide()
:商BigInteger a = new BigInteger("200000000"); System.out.println(a.divide(a));//输出:1
mod()
:取余BigInteger a = new BigInteger("200000000"); System.out.println(a.mod(a));//输出:0
compareTo
:另一个大数值相等,返回0;小于另一个大数值,返回负数;否则,返回正数BigInteger a = BigInteger.valueOf(200000000); BigInteger b = BigInteger.valueOf(200000000); BigInteger c = BigInteger.valueOf(2000000000); BigInteger d = BigInteger.valueOf(100000000); System.out.println(a.compareTo(c));//输出:0 System.out.println(a.compareTo(b));//输出:-1 System.out.println(a.compareTo(d));//输出:1
四、数组
1. 数组的初始化
第一次赋值。
int[] arr = {5,7,4,2,0,3,6};
2. 匿名数组
初始化一个匿名数组
new int[] {5,7,4,2,0,3,6};
3. 数组定义方式
直接赋值
int[] arr = {5,7,4,2,0,3,6};
new数组长度
int[] arr = new int[5];
new数组值
int[] arr = new int[]{5,7,4,2,0,3,6};
4. 数组拷贝
数组拷贝分为:深拷贝和浅拷贝。
- 深拷贝:把所有的数值复制过来,自己再去开辟一个新的空间,将数组复制过来,如果自己对数值做改变,指改变自己的数组
int[] arr1 = {5,7,4,2,0,3,6}; int[] arr2 = new int[arr1.length]; for (int i = 0; i < arr1.length; i++) {arr2[i] = arr1[i]; } arr2[0] = 100; System.out.println(Arrays.toString(arr1)); System.out.println(Arrays.toString(arr2)); //输出:[5, 7, 4, 2, 0, 3, 6] // [100, 7, 4, 2, 0, 3, 6]
- 浅拷贝:只是把地址复制过去,其中一个对数字做改变,另一个页改变,因为它们指向的是同一个空间
int[] arr1 = {5,7,4,2,0,3,6}; int[] arr2 = arr1; arr2[0] = 100; System.out.println(Arrays.toString(arr1)); System.out.println(Arrays.toString(arr2)); //输出:[100, 7, 4, 2, 0, 3, 6] // [100, 7, 4, 2, 0, 3, 6]
5. 命令行参数
- 指的是给main传参
步骤如下:
- 写一个Test.java的文件,内容如下
import java.util.Arrays;public class Test {public static void main(String[] args) {System.out.println(Arrays.toString(args));} }
- 打开cmd,编译文件:javac Test.java
- 执行:java Test;打印结果:[](因为没有传参,所有数组为空)
- 传参:java Test aa bb cc dd;打印结果:[aa, bb, cc, dd]
6. 数组排序
- 有八大排序
- java中Arrays类中的sort方法,底层用的是快速排序,默认由小到大排序
int[] arr = {5,7,4,2,0,3,6}; Arrays.sort(arr); System.out.println(Arrays.toString(arr));//输出:[0, 2, 3, 4, 5, 6, 7]
- 如果想要由大到小排序,根据拉姆达表达式排序
(a,b)
对于数组中的每一项b-a
表示倒过来- 注意:不能使用基本类型,应使用包装类
Integer[] arr = {5,7,4,2,0,3,6}; Arrays.sort(arr,(a,b)->b-a); System.out.println(Arrays.toString(arr));//输出:[7, 6, 5, 4, 3, 2, 0]
- Arrays类中的sort方法还可以对字符串
String
类型的进行排序,根据ASCII码进行排序String[] arr = {"aa","x","acd","aca","a"}; Arrays.sort(arr); System.out.println(Arrays.toString(arr));//输出:[a, aa, aca, acd, x]
- 对自定义类型进行排序
public class Cat {int age;int weight;//构造方法public Cat(int a, int b) {age = a;weight = b;}@Overridepublic String toString() {return "Cat [age=" + age + ", weight=" + weight + "]";} }
import java.util.Arrays;public class Test {public static void main(String[] args) {Cat cat1 = new Cat(5,8);Cat cat2 = new Cat(2,6);Cat cat3 = new Cat(3,7);Cat cat4 = new Cat(4,6);Cat[] arr = {cat1,cat2,cat3,cat4};Arrays.sort(arr,(a,b)->a.age-b.age);//需要明确按照什么排序,比如说:小猫的年龄,由小到大排序System.out.println(Arrays.toString(arr));//输出:[Cat [age=2, weight=6], Cat [age=3, weight=7], Cat [age=4, weight=6], Cat [age=5, weight=8]]} }
扩展:基本类型对于的包装类
byte
对应java.lang.Byte
short
对应java.lang.Short
int
对应java.lang.Integer
long
对应java.lang.Long
float
对应java.lang.Float
double
对应java.lang.Double
boolean
对应java.lang.Boolean
char
对应java.lang.Character
多维数组可以看学习数组内存图(二)这篇文字有涉及到。