JavaSE基础知识
文章目录
一.Java的语法基础
1.标识符
只要在Java中能够起名字的,都叫标识符。
标识符的规则:
- 由数字, 字母, 下划线, $ 符号组成
- 不能以数字开头
- 不能有空格
- 驼峰命名法
- 见名知意: name userAge
2.关键字
Java已经用过的名字, 这些名字,自己写代码的时候不能使用。
不用死记硬背。
3.数据类型
Java的数据类型:
基本数据类型:
数值型:
整型: byte, short, int , long(1, 100, 256)
浮点型: float, double(3.14, 0.0001)
字符型:char ( 'J','a', '成')
布尔型:boolean (true, false)
引用数据类型:
类: (String, String str = "abcd";)
接口: (List)
数组: (Array)
(1)整型
Java中默认的整型是int.
(2)浮点型
Java中默认的浮点型是double.
(3)字符型
Java中字符型只能用单引号来包裹: '国','信'
Java中的字符占用两个字节。
Java中的字符可以表示特殊字符: 换行符('\n'), 制表符('\t')
(4)布尔型
布尔型在Java中只有两个值: true, false
true 表示 真 =》 正确
false 表示 假 =》 错误
4.变量
变量: 可变的量
变量的三要素:
数据类型 变量名 变量值
5.常量
一旦申明就不能改变。
好处: 一处修改,多处修改, 主要是方便维护代码。
注意关键字: final
变量名的规范: 所有的字母必须大写, 单词与单词之间用下划线连接。
// 常量
// 常量的命名规范: 所有的字母必须大写, 单词与单词之间用下划线连接
// 常量值一旦申明就不能改变了。
final int NUM = 10;
final int USER_COUNT = 10;
//final int NUM = 20;
//final int USER_COUNT = 30;
// 常量的好处: 一处修改, 多处修改
System.out.println(NUM);
System.out.println(USER_COUNT);
System.out.println(NUM);
System.out.println(USER_COUNT);
6.运算符
(1)赋值运算符
=, 最主要的作用就是给变量赋值
int num = 10;
(2)算术运算符
主要是+,-,*,/, %
%: 取模(取余数)
// %
int num = 9%2;
System.out.println(num);
(3)比较运算符
主要包含: >, >=, == , <, <=, !=
比较运算符最终计算的结果是: boolean
Scanner scanner = new Scanner(System.in);
System.out.println("请输入第一个数字:");
int num1 = scanner.nextInt();
System.out.println("请输入第二个数字:");
int num2 = scanner.nextInt();
System.out.println("请选择操作: 1 : +, 2 : -, 3 : *, 4 : /");
int choose = scanner.nextInt();
if (choose == 1) {
// 加法运算 System.out.println(num1+num2);
}else if (choose == 2) {
System.out.println(num1-num2);
}else if (choose == 3) {
System.out.println(num1*num2);
}else if (choose == 4) {
System.out.println(num1/num2);
}
(4)逻辑运算符
主要包含: && || !
逻辑运算符主要运算条件表达式.
&& : 必须都为true => true
||: 只要一个为true => true
! : ! true => false, ! false => true
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("你有多少钱?");
int money = scanner.nextInt();
System.out.println("请输入是否下雨?");
String isRain = scanner.next();
if (money >= 10 && "否".equals(isRain)) {
System.out.println("可以买好吃的!!");
}else {
System.out.println("等一下!!");
}
}
(5)单目运算
++, --
++: 表示自增1
--: 自减一
public static void main(String[] args) {
int num = 10;
num++;// num = num + 1; num += 1;
num--;// num = num -1; num -= 1;
System.out.println(num);
}
前置和后置的区别: 程序是从左到右执行
// 前置和后置的区别
int num = 100;
int num1 = ++num;// 101
int num2 = num++;// 100
(6)三目运算
条件表达式 ? 值1 : 值2;
条件表达式 -》 true -> 值1
条件表达之-》false -> 值2
public static void main(String[] args) {
// 三目运算
int a = 10;
int b = 20;
a = a > b ? a : b;
// 用if写
if(a > b) { a = a; }else { a = b; }
}
(7)连接运算符
+
加号的两边有任意一边是字符串, 这个时候就是连接运算。
(8)调用符
.
对象调用属性
对象调用方法
7.数据类型转换
8.强制类型转换
类型1 变量名 = (类型1)类型2
强转会造成一个问题: 精度的损失。
注意:
boolean不能和其他任意类型的值进行转换。
int i=1,j = 0;
float f1=0.1f;
float f2=123;
double d1=2020,d2=124;
byte b1=1,b2=2,b3=120;
j=j+10;
i=i/10;
i=(int) (i*0.1);
char c1='a',c2=125;
// byte, short 在运算的时候自动转换成int
byte b=(byte) (b1-b2);
float f3=f1+f2;
float f4=(float) (f1+f2*0.1);
double d=d1*i+j;
float f=(float)(d1*5+d2);
9.流程分支
if
分支语句: 将代码分成不同的部分, 条件不同执行的代码就不一样。
分支的种类:
单分支
// Java中分支语句规范
// 分支体里面无论是一行代码还是多行代码,都将{}写出来
if(条件表达式){
// 分支体语句
}
双分支
// 满足条件进入分支1 不满足进入分支2
if(条件表达式){
// 分支1
}else{
// 分支2
}
多分支
// 满足哪个条件表达式 就进入哪个分支
// 最终只会进入一个分支
if(条件表达式1){
// 分支1
}else if(条件表达式2){
// 分支2
}else if(条件表达式3){
// 分支3
}else if(条件表达式n){
// 分支n
}else{
// 分支n+1
}
/** * 2.输入a ,b,c 三个个位数(0-9)之间,组成一个最大的三位数 */
System.out.println("请输入第一个数:");
int num1 = scanner.nextInt();
System.out.println("请输入第二个数:");
int num2 = scanner.nextInt();
System.out.println("请输入第三个数:");
int num3 = scanner.nextInt();
if (num1 < 0 || num1 > 9 || num2 < 0 || num2 > 9 || num3 < 0 || num3 > 9) {
System.out.println("输入的数字满足条件!");
}else { // 交换的思想
// 最终的效果: num1 最大, num2 次之 num3 最小
int temp;
if (num1 < num2) {
temp = num1;
num1 = num2;
num2 = temp;
}
if (num1 < num3) {
temp = num1;
num1 = num3;
num3 = temp;
}
if (num2 < num3){
temp = num2;
num2 = num3;
num3 = temp;
}
System.out.println("三个数字组成的最大数:"+num1+num2+num3);
}
switch
是优雅版的if...else....
语法有差距, 最终效果一致。
根据实际的情况选择使用即可。
// 比较值 是不能相同的。
// 比较值的数据类型: 字符, 字节, 短整型, 整型, 字符串。
// break必须得加上。
switch(值){
case 比较值1 :
// 逻辑 break;
case 比较值2 :
// 逻辑 break;
case 比较值n :
// 逻辑 break;
default:
// 默认情况
break;
}
/** * 利用switch来完成
* 完成一个简单的计算器程序。程序要求如下:
* 1. 读入两个整数
* 2. 提示用户选择对这两个整数的操作,即输出
* 1 : +
* 2 : -
* 3 : *
* 4 : /
* */
Scanner scanner = new Scanner(System.in);
System.out.println("请输入第一个数字:");
int num1 = scanner.nextInt();
System.out.println("请输入第二个数字:");
int num2 = scanner.nextInt();
System.out.println("请选择操作: 1 : +, 2 : -, 3 : *, 4 : /");
int choose = scanner.nextInt();
switch(choose) {
case 1:
// 逻辑代码
System.out.println(num1+num2);
break;
case 2:
// 逻辑代码
System.out.println(num1-num2);
break;
case 3:
// 逻辑代码
System.out.println(num1*num2);
break;
case 4:
// 逻辑代码
if (num2 == 0) {
System.out.println("0不能作为除数!");
}else {
System.out.println(num1/num2);
}
break;
default:
System.out.println("运算符错误!");
break;
}
10.循环语句
while循环
// 1. 先判断条件表达式计算的结果
// 2. 如果为true=>执行循环体
// 3. 如果为false=> 结束循环
// 属于先验循环
while(条件表达式){
// 循环体
}
// 做一个小小的练习
// 输出1~100之间的奇数
int num = 1;
while (num <= 5) {
// 判断是否是奇数
if (num%2 != 0) {
System.out.println(num);
}
num++;
}
do…while循环
// 是一个后验循环: 先执行循环体,再判断条件
// 1. 先执行循环体
// 2. 判断条件, true=> 继续执行循环体, false =>结束循环
do{
// 循环体
}
while(条件表达式);
do {
System.out.println("后验循环");
}while(false);
for循环
for循环是用的最多的,也是最复杂的
for(初始值的申明;条件的判断;迭代){
//循环体
}
//for循环执行的步骤
//1.执行初始化
//2.执行条件判断
//3.循环体
//4.迭代
//5.执行条件判断
//.....重复步骤,直到条件不满足,结束循环
//计算1累加到100
for(int i=1;i<=100;i++){
sum+=i;
}
System.out.println(sum);
/*:3、有一分数序列: 2/1, 3/2, 5/3, 8/5, 13/8, 21/13.求出这个数列的前20项之和。*/
public class Demo1 {
public static void main(String[] args) {
double a1=1;
double a2=2;
double temp;
double sum=0;
for(int i=1;i<=20;i++) {
sum+=a2/a1;
temp=a2;
a2=a2+a1;
a1=temp;
}
System.out.println(sum);
}
}
跳出循环
跳出循环有两种方式:
break : 直接结束(跳出)循环。
continue: 结束当次循环, 继续下一次循环。
/**
* 1、打印0-50以内所有能被7整除的数(使用continue)
* */
* for (int i = 0; i <= 50; i++) {
* if (i%7 != 0) {
* continue;
* }
* System.out.println(i);
* }
/**
* 2、打印0-50以内前5个能被7整除的数(使用break)
* */
int count = 0;
for (int i = 0; i <= 50; i++) {
if (i%7 == 0) {
System.out.println(i); // 把次数+1
count++;
}
if (count == 5) {
break;
}
}
双层循环
双层循环: 循环里面嵌套循环。
// 语法
for(int i=0; i<=n; i++){
// 循环体
for(int j=0; j<=m; j++){
// 循环体
}
}
// 打印出99乘法表
// 双层循环
// 打印99乘法表
// 有行和列
// 外层循环: 循环行=》9 外层循环的范围 1~9
// 内存循环: 循环列=》 列数和行数相等
// 什么时候换行: 内层循环完了之后换行
for (int i = 1; i <= 9; i++) {
// 循环行
for (int j = 1; j <= i; j++) {
System.out.print(j+"×"+i+"="+(i*j)+"\t");
}
// 换行
System.out.println("");
}
/**
(循环)*读入一个整数n,输出如下图形
n = 3
*
***
*****
n = 4
*
***
*****
*******
思路:输入的数字就是行数
列数:2*n-1
*/
int n = 5;
for (int i = 1; i <= n; i++) {
// 行
for (int j = 1; j <= n-i; j++) {
// 输出空格
System.out.print(" ");
}
for (int j = 1; j <= 2*i-1; j++) {
// 输出*
System.out.print("*");
}
// 换行
System.out.println("");
}
多层循环的跳出
关键字都是一样的: break, continue;
直接break, continue => 只能退出一层循环
多层循环的退出 需要一个标记
这个标记自定义。
flag:for(int i=0; i<=n; i++){
// 循环体
for(int j=0; j<=m; j++){
// 循环体
break flag;
}
}
// 多层循环的退出
flag:for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
System.out.print("*");
if (j == 5) {
break flag;
}
}
System.out.println("");
}
11.数组
数组是所有语言中**最为重要的结构**
现在我们的程序需要将班级所有的同学的名字装起来,并且在控制台输出
如果用基本数据类型的变量来装:定义48个变量装每个人的名字
有一种数据结构可以很简单的实现:**数组**
数组一旦申明,长度不能改变
(1)如何定义数组?
//定义数组并初始化(静态初始化)
int[] nums = {1,2,3,4};
//或
int nums3[] = {3,55};
//或
int[] nums4 = new int[] {1,2,3,4,5};
//定义数组并初始化(动态初始化)
int[] nums2 = new int[5];
//注意事项
//静态初始化:定义和初始化不能分开写
String[] names;
//names = {"jack"}; 报错
names = new String[5]; //动态初始化是可以的
数组是引用数据类型
内存里面有两个区域:栈区 和 堆区
基本数据类型存入 **栈区**
引用数据类型存入 **堆区**
(2)下标
下标就是索引。
数组里面元素的地址是连续的:可以通过
索引地址来取出对应的元素
索引是从0开始
// 索引的作用就是位了快速的取获取数组中的元素
// 获取数组中的元素 0 1 2
String[] names = {"jack", "rose", "lucy"};
// 取第一个元素
System.out.println(names[2]);
System.out.println(names[1]);
System.out.println(names[0]);
// 动态初始化
int[] nums = new int[5];
nums[0] = 11;
nums[4] = 4;
(3)数组的长度
// length属性
//数组.length
int[] nums = new int[5];
int len = nums.length;
(4)遍历数组
for循环
需要依赖于数组的长度
注:循环内不要定义变量,在循环外定义,循环内使用
int len = nums.length;
for (int i = 0; i < len; i++) {
System.out.println(nums[i]);
}
foreach
不用依赖于数组的长度
// foreach遍历
for (int i : nums) {
System.out.println(i);
}
(5)数组的冒泡排序
冒泡排序的核心思想: 交换。
// 冒泡排序法 =》 核心思想是交换
// 通过每一次遍历交换前后两个值, 大的排后面, 小的排前面
int[] nums = {23,1,7,55,3,6,22};
// 获取长度
int len = nums.length;
int temp = 0;
for (int i = 0; i < len; i++) {
// -1 的原因 当最后一个元素的时候, 继续和下一个元素比较, 下一个元素没有, 会越界
// -i 的原因是 每遍历一次会少一个
for (int j = 0; j < len-1-i; j++) {
// 交换
// 把大的值 往后面排 =》 升序
if (nums[j] > nums[j+1]) {
temp = nums[j+1];
nums[j+1] = nums[j];
nums[j] = temp;
}
}
}
System.out.println(Arrays.toString(nums));
(6)数组下标越界的情况
(7)数组初始值的问题
byte,short,int,long 初始值都是 0
float, double 初始值都是 0.0
char 初始值是 ‘’(空字符)
boolean 初始值 false
引用数据类型初始值 null
(8)数组容量的问题
数组的长度一旦确定之后,就不能更改了
我们要去操作数组里面的数据是很麻烦的:增加一个数据、修改一个数据、删除一个数据
我们需要使用java提供的工具类:
Arrays / System
----数组的扩容
在原来的数组的长度基础之上,增加指定长度。
注意:内存里面并不是在原来的数组基础之上增加,而是**新创建了数组**
需要用到Arrays里的copyOf方法(地址会发生变化,并非同一个数组)
//数组扩容
String[] names = {"admin"};
System.out.println(names);
System.out.println(Arrays.toString(names));
//长度+1
names = Arrays.copyOf(names, names.length+1);
System.out.println(names);
System.out.println(Arrays.toString(names));
----数组的缩容
主要用于数组数据的删除。
任意位置的数据删除。删除数据后不能留空。
关键点:找到需要删除的下标
//删除3这个元素
//随机的复制数组中的元素
int[] nums = {1,2,3,4,5,6,7};
int index = -1;
int delete = 3;
//通过遍历找到3的下标
for (int i = 0; i < nums.length; i++) {
if(delete == nums[i]) {
index=i;
break;
}
}
//copyOfRange 包前 不包后
int[] nums1 = Arrays.copyOfRange(nums, 0, index);
int[] nums2 = Arrays.copyOfRange(nums, index+1,nums.length);
System.out.println(Arrays.toString(nums1));
System.out.println(Arrays.toString(nums2));
//准备一个新的数组,装最终的数据
int[] newNums = new int[nums.length-1];
System.out.println(Arrays.toString(newNums));
//将nums1和nums2中的数据放入newNums中
//先复制nums1
System.arraycopy(nums1, 0, newNums, 0, nums1.length);
System.out.println(Arrays.toString(newNums));
//再复制nums2
System.arraycopy(nums2, 0, newNums, nums1.length, nums2.length);
System.out.println(Arrays.toString(newNums));
二维数组
数组中存放的元素是一个数组
语法:
//一维数组的语法
数据类型[] 数组名 = {};
数据类型[] 数组名 = new 数据类型[长度];
//二维数组的语法
数据类型[][] 数组名 = {{},{},{}....};
数据类型[][] 数组名 = new 数据类型[长度][长度]
// 二维数组
// 静态初始化
int[][] nums = {{1,2},{2,3}};
System.out.println(nums[1][1]);
// 动态初始化
int[][] nums2 = new int[3][2];
nums2[0][0] = 100;
nums2[0][1] = 250;
nums2[1][0] = 200;
nums2[1][1] = 300;
// 遍历
// 需要知道长度
for (int i = 0; i < nums2.length; i++) {
for (int j = 0; j < nums2[i].length; j++) {
System.out.print(nums2[i][j]+"\t");
}
System.out.println("");
}
Java中有没有二维数组
从内存的角度是没有二维数组的
从使用的角度是有的
12.函数
定义:将业务代码中,公共的部分取出来,并且封装,取一个函数名,供其他地方调用
//语法:
public static 返回值数据类型 函数名字(形参数据类型 形参1,形参数据类型 形参2....){
//定义一个函数add(int a,int b)
/**
* 加法运算
* @param a:数值1
* @param b:数值2
* @return a+b
*/
public static int add(int a,int b) {
return a+b;
}
//调用
int sum = add(10,20);
System.out.println(sum);
函数分类
(1)有参有返回值
/**
* 有参有返回值
* @param a
* @param b
* @return a-b
*/
public static int jian(int a,int b) {
return a-b;
}
(2)有参无返回值
/**
* 有参无返回值
* @param a
* @param b
*/
public static void cheng(int a,int b) {
System.out.println(a*b);
}
(3)无参有返回值
/**
* 无参有返回值
* @return
*/
public static void getRandomName() {
Random random = new Random();
int c = random.nextInt(100);
System.out.println(c);
}```
(4)无参无返回值
```java
/**
* 无参无返回值
*/
public static void welcome() {
System.out.println("jhhh");
System.out.println("pppppp");
System.out.println("cccccch");
}
注意:函数里面定义的变量(局部变量),该变量的作用域在函数体{}中