Java概述
Java发展
Java之父:詹姆斯·高斯林(James Gosling)
Java语言是美国Sun公司在1995年推出的计算机语言,Java的前身是Oak语言。
-
1995年,Java正式诞生,推出了Java1.0以及开发工具包JDK1.0
-
2004年,Java推出了Java5,此后都已JavaXL命名
-
2009年,Sun公司被甲骨文(Oracle)公司收购,之后都由Oracle进行更新维护
-
2014年,推出了Java8,是当前最流行稳定的版本,也是长期维护版LTS
-
当前长期维护版为Java8,Java11和Java17
Java的分类和优点
分类
- JavaEE:JavaME称为Java微型版,用于开发移动应用,早期的塞班系统中会使用,如今基本已经淘汰。
- JavaSE:JavaSE称为Java标准版,是Java的核心和基础,也是JavaME和JavaEE的核心。可以用于开发桌面端程序。
- JavaEE:JavaeEE称为Java企业版,用于开发WEB应用,Java的流行得益于JavaEE
优点
- 跨平台/可移植性:Java的核心优势之一, Java的运行是通过JVM来实现的,只需要在操作系统上安装对应的虚找机即可运行,节省代码重复编写时间。
- 面向对象:Java是完全的面向对象语言,非常适合大型软件的设计和开发。
- 多线程:Java多线程简单易用,使其成为了最主流的服务器端开发语言。
- 简单:Java去掉了头指针,指针,结构等内容,更加简单易学。
- 安全:一是严格遵循面向对象的规范,即封装了数据细节,只提供接口给用户,增加了数据级的安全性;二是无指针运算,增加了内存级的运算;三是数组边界检查,有效防止了缓存溢出等安全漏洞;四是强制类型转换,使非同类型的对象之间不能进行转换;五是语言对线程安全的支持;六是通过编译器、检验器、类装载器自动建立安全策略。
- 开源
运算符
算术运算符
符号 | + | - | * | / | % |
作用 | 加 | 减 | 乘 | 除 | 求余 |
注意:算术运算需要两个操作数,如果有浮点数参与运算,结果为浮点数;如果两个操作数都是数值型的数据,+用于计算。如果两个操作数有一端是字符串,+用于拼接字符串;如果同时多个符号一起使用,遵循数学中的四则运算规则,先乘除后加减;运算时最终结果的数据类型,以所有参与的操作数中所占字节最大的为准。
关系运算符
符号 | > | < | >= | <= | != | == |
作用 | 大于 | 小于 | 大于等于 | 小于等于 | 不等于 | 等于 |
注意:关系运算需要两个操作是参与,计算结果为布尔型boolean;==用于判断相等,=用于赋值;==用于比较两个原始类型的值或引用类型的内存地址;关系运算结果为true/false
逻辑运算符
符号 | 作用 | 说明 |
---|---|---|
&& | and与 | 符号两端需要聊个表达式,判断如果都为true,整体结果则为true,如果有一端结果为false,整体结果为false |
|| | or或 | 符号两端需要两个表达式,判断如果都为false,整体结果为false,如果有一端结果为true,整体结果为true |
! | not非 | 是一个单目运算符,只有一个表达式参与运算,“!表达式”表示对原表达式的结果取相反值 |
注意:&&和||也称为短路运算,如果能通过第一个表达式决定最终的结果,则不用判断第二个表达式;通常情况下,使用&&和||提高代码执行效率
条件运算符
三目运算符,有三个操作数参与。是一个简化版的双分支条件语句。
表达式1 ? 表达式2 : 表达式3
首先运算表达式1,如果结果为true,执行问号后的表达式2;如果结果为false,执行冒号后面的表达式3;整个表达式的最终结果为表达式2或者表达式3;
public class Runnian {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int year=sc.nextInt();
String str=(year%4==0&&year%100!=0)||(year%400==0)?"是闰年":"不是闰年";
System.out.println(year+str);
}
}
if语句
单分支if语句:如果一件事满足则执行,不满足则不执行。
if(判断条件){
条件满足时执行的代码
}
public class IFTest {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=3;
if(n<=3){
System.out.println("hello word");
}
}
}
双分支if语句:如果一件事有两种情况,满足执行某些内容,不满足则执行另一些类容
if(判断条件){
条件满足时执行的代码
}else{
不满足条件时执行的代码
}
public class Max {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
int b=sc.nextInt();
int max;
if(a>b){
max=a;
}else {
max=b;
}
System.out.println(max);
}
}
switch
开关语句,如果一个变量的值能过列举出时,使用switch语句更加简洁
switch(表达式){
case 常量表达式1: 语句1;
break;
case 常量表达式2: 语句2;
break;
……
case 常量表达式n: 语句n;
break;
default: 语句n+1;
}
public class Test1 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请选择功能:");
System.out.println("1:注册");
System.out.println("2:登录");
System.out.println("3:退出");
int n=sc.nextInt();
switch (n){
case 1:
System.out.println("进入注册功能");
break;
case 2:
System.out.println("进入登录功能");
break;
default:
System.out.println("退出功能");
}
}
}
使用注意事项
-
Switch小括号中的变量只能是非long的整型,字符型char,字符串String和枚举类型
-
小括号中的类型要和case后的值的类型相匹配
-
如果有某个case后的内容和变量值相匹配,执行case后的代码,如果没有任何case匹配,执行default后的代码
-
break和default可以省略不写,如果不写break,在某个case匹配时,执行完相应的代码后继续执行后续case的代码,直到遇到break或没有代码为止
-
如果多个case执行后的内容一致,可以省略break,将统一要做的代码放在最后的case后
if语句与switch语句的选择
-
如果条件能够一一列举出来时,使用switch语句更加简洁
-
如果条件是一个范围时,只能使用if语句
-
switch语句可以改成成if语句,if语句不一定能够改为switch语句
循环
如果要重复执行某些代码时,使用循环语句。
while
while(循环条件){
满足循环条件时重复执行
}
public class WhileTest {
public static void main(String[] args) {
int n=1;
while (n<=3){
System.out.println("Hello World");
n++;
}
}
}
do-while
do{
满足循环条件时执行的代码
}while(循环条件);
public class WhileTest {
public static void main(String[] args) {
int n=1;
do{
System.out.println("Hello World");
n++;
}while (n<=3);
}
}
public class DoWhile {
public static void main(String[] args) {
int str = 123123;
Scanner sc = new Scanner(System.in);
int str1;
int cout = 0;
int money = 100;
int n;
boolean flag = true;
do {
System.out.println("请输入密码!");
str1 = sc.nextInt();
if (str == str1) {
System.out.println("请选择功能");
System.out.println("1:查询余额");
System.out.println("2:存款");
System.out.println("3:取款");
System.out.println("4:退出");
do {
n = sc.nextInt();
switch (n) {
case 1:
System.out.println("余额为" + money);
break;
case 2:
money+=50;
System.out.println("存款" + 50 + "元,余额为" + money );
break;
case 3:
money-=50;
System.out.println("取款" + 50 + "元,余额为" + money);
break;
case 4:
System.out.println("退出");
flag = false;
break;
default:
System.out.println("无效输入!,请重新输入");
break;
}
} while (flag);
} else {
cout++;
if (cout == 3) {
System.out.println("你不输入了,最多只能输入3次");
break;
}
}
} while (str != str1);
}
}
while和do-while的区别
while循环可能一次都不执行,do-while循环至少会执行一次
for循环
for(初始化;布尔表达式;更新){
//代码语句
}
//n的阶乘和n的阶乘和
public class ForTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
int sum=0;
int k=1;
for(int i=1;i<=n;i++){
k=k*i;
sum+=k;
}
System.out.println(n+"的阶乘是"+k+",阶乘和是"+sum);
}
}
循环总结
-
如果一直循环次数,推荐使用for循环。如遍历数组、集合等。
-
如果未知循环次数,推荐使用while循环。
-
while循环和for循环可以相互转换
-
do-while循环至少执行一次,for循环和while循环有可能一次都不执行
循环嵌套
如果一个重复的过程还需要将其整体重复执行时,可以使用循环嵌套。
//打印菱形
public class MyTest3 {
public static void main(String[] args) {
int h=7;
for(int i=1;i<=h/2+1;i++){
for(int j=1;j<=h/2+1-i;j++){
System.out.print(" ");
}
for(int k=1;k<=2*i-1;k++){
System.out.print("*");
}
System.out.println();
}
for(int i=h/2;i>=1;i--){
for(int j=1;j<=h/2+1-i;j++){
System.out.print(" ");
}
for (int k=1;k<=2*i-1;k++){
System.out.print("*");
}
System.out.println();
}
}
}
数组(一维数组)
概念
一组类型相同的数据的有序集合。
关于数组
实际在内存中是一块连续的空间。是保存数据的区域。
数组定义是需要确定大小和数据类型,不可改变。
数组中保存的数据称为元素,每个元素有个一个唯一的位置,称为索引(下标),这个索引从0开始计数。
可以通过数组的索引给数组赋值或读取数据中某个索引上的值。
定义数组
语法:数据类型[] 数组名;或数据类型 数组名[];//建议使用前者。(约定俗成)
//定义数组后,如果不进行初始化数组,数组无法使用。
数组初始化
语法:数据类型[] 数组名=new 数据类型[数组大小];
double [] arr= new int[10];
数组赋值
动态赋值
通过数组名[索引]给数组中某个位置赋值
int arr=new int[10];
arr[0]=124;
arr[5]=2;
静态赋值
在定义数组的同时赋值
数据类型[] 数组名=new 数据类型[]{元素1,元素2,元素3……}
数据类型[] 数组名={元素1,元素2……}
String[] nameList1 =new String[]{"张三","李四","王二"};
String[] nameList2={"张三","李四","王二"};//也可以这样赋值
注意
-
数组一旦初始化后,数组大小不能改变,其中的元素类型要统一。
-
数组的索引范围是[0,数组大小-1],使用时不能抄书范围。在编译时无法识别是否超出数组索引,但运行时会抛出“数组索引”异常
-
数组一旦初始化后,如果没有赋值,默认有初始值
数组数据类型 | 默认值 |
---|---|
整型 | 0 |
浮点型 | 0.0 |
引用类型(如string等) | null |
布尔型 | false |
字符型 | 空白字符 |
arrays是jdk提供的用于处理数组的工具类。包含了如排序、复制、填充等方法,这些方法都是静态方法,可以通过Arrays调用。
常用方法 | 作用 |
---|---|
sort(数组) | 将数组中的元素生序排序。 |
sort(数组,起始位置,结束位置) | 对数组中[起始位置,结束位置)区间的元素进行排序。 |
fill(数组,值) | 使用指定值对数组中的所有元素进行填充 |
fill(数组,起始位置,结束位置,值) | 使用指定值对数组中[起始位置,结束位置)区间的数进行填充。 |
copyOf(数组,新数组长度) | 复制数组并指定复制后的数组的长度。得到复制后的新数组。 |
asList(一组数据) | 将一组数据转为List集合。 |
equals(数组1,数组2) | 判断两个数组是否相同,得到判断的布尔值。只有两个数组一模一样时得到true。 |
知识汇总
模拟买彩票及开奖过程
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class ArrayHomeWork4 {
public static void main(String[] args) throws InterruptedException {
Scanner sc = new Scanner(System.in);
Random rd = new Random();
int[] userRed = new int[6];
int[] comRed = new int[6];
int userBlue, comBlue = rd.nextInt(16) + 1;
System.out.print("请输入红色球号码");
for (int i = 0; i < 6; i++) {
int inp = sc.nextInt();
if (inp < 1 || inp > 33) {
System.out.println("输入有误");
i--;
continue;
}
userRed[i] = inp;
for (int j = 0; j < i; j++) {
if (userRed[i] == userRed[j]) {
System.out.println("该号码已存在");
i--;
}
}
}
while (true) {
System.out.println("请输入蓝色球号码");
int inpBlue = sc.nextInt();
if (inpBlue < 1 || inpBlue > 16) {
System.out.println("蓝色球号码输入有误");
} else {
userBlue = inpBlue;
break;
}
}
System.out.println("您选择的蓝色球号码为");
System.out.println(userBlue);
for (int i = 0; i < 6; i++) {
comRed[i] = rd.nextInt(33) + 1;
for (int j = 0; j < i; j++) {
if (comRed[i] == comRed[j]) {
i--;
}
}
}
Arrays.sort(comRed);
System.out.println("===============");
//打印开奖结果
System.out.println("开奖结果红色球号码为");
for (int i : comRed) {
Thread.sleep(1000);
System.out.print(i + "\t");
}
System.out.println();
System.out.println("开奖结果蓝色球号码为");
System.out.println(comBlue);
boolean flag = userBlue == comBlue;
int count = 0;
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 6; j++) {
if (userRed[i] == comRed[j]) {
count++;
}
}
}
if (!flag) {
System.out.println("很遗憾未中奖");
}
switch (count) {
case 0:
case 1:
case 2:
if (flag) {
System.out.println("六等奖,奖金5元");
}
break;
case 3:
if (flag) {
System.out.println("五等奖,奖金10元");
}
break;
case 4:
if (flag) {
System.out.println("四等奖,奖金200元");
} else {
System.out.println("五等奖,奖金10元");
}
break;
case 5:
if (flag) {
System.out.println("三等奖,奖金3000元");
} else {
System.out.println("四等奖,奖金200元");
}
break;
case 6:
if (flag) {
System.out.println("一等奖");
} else {
System.out.println("二等奖");
}
break;
}
}
}