Java语言基础之基础语法&流程控制语句&数组

Java语言概述

Java语言是一款面向对象的高级语言,是由Sun Microsystems公司(现已被oracle公司收购)。由James Gosling和同事们共同研发,并在1995年正式推出,据oracle官方数据指数,目前全球已有上亿的系统是使用Java开发的。Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。

Java语言的特性

①简单性:在Java语言当中真正操作内存的是:JVM,所有的java程序都是运行在Java虚拟机当中的。而Java虚拟机执行过程中再去操作内存。
对于C或者C++来说程序员都是可以直接通过指针操作内存的,但是要求程序员技术精湛。
Java语言屏蔽了指针概念,程序员不能直接操作指针,或者说程序员不能直接操作内存。这种方式不容易导致内存泄漏,更简单。

②完全面向对象:Java语言堪称完全面向对象的。面向对象更容易让人理解,人类通常是以对象的方式认知世界的。采用面向对象的方式可以让复杂问题简单化。

③健壮性:Java语言是健壮的,相对于C语言来说,Java不容易导致内存的泄漏,C++或者C语言使用不当时很容易导致内存泄漏。主要是因为Java中有一种机制:自动垃圾回收机制(GC机制),JVM负责调度GC机制。程序员不需要干涉。

④可移植性/跨平台:Java语言只要编写一次,可以做到到处运行。例如:java程序编写完之后,可以运行在windows操作系统上,不需要做任何改动可以直接运行在Linux操作系统上,同样也可以运行到MaC OS上面。

⑤多线程并发:在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子类来创建。Java语言支持多个线程的同时执行,并提供多线程之间的同步机制。

JVM、JRE和JDK的理解

JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性。

JRE(Java Runtime Environment):java的运行环境,包括jvm+java的核心类库。

JDK(Java Development Kit):java的开发工具,包括jre+开发工具

java语言是跨平台,jvm不是跨平台的。
JDK包含了JRE和JVM,JRE包含了JVM。

Java语言的三种技术架构

Java2EE:企业版
是为开发企业环境下的应用程序提供的一套解决方案。
该技术体系中包含的技术如 Servlet、Jsp等,主要针对于Web应用程序开发。

Java2SE:标准版
是为开发普通桌面和商务应用程序提供的解决方案。
该技术体系是其他两者的基础,可以完成一些桌面应用程序的开发。
比如Java版的扫雷。

Java2ME:小型版
是为开发电子消费产品和嵌入式设备提供的解决方案。
该技术体系主要应用于小型电子消费类产品,如手机中的应用程序等。

Java的内存结构

栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放。

堆内存:数组、对象、成员变量,通过new建立的实例都存放在堆内存中。

方法区:静态成员、构造函数、常量池、线程池

本地方法区:window系统占用

配置Java环境变量

JAVA_HOME = 你的JDK安装路径

CLASSPATH = %JAVA_HOME%\lib

PATH = %JAVA_HOME%\bin

我的第一个Java程序HelloWorld

public class HelloWorld {
   public static void main(String[] args) {
	  System.out.println("Hello World");
   }
}

标识符命名规则
由数字(0-9),大小写英文字母,以及_和$组成。
不能以数字开头。
不能使用关键字来自定义命名。

八大基本数据类型

整数类型:byte、short、int、long

浮点数类型:float、double

布尔类型:boolean

字符类型:char

记忆法:1248 4812

引用数据类型

类类型、接口类型、数组类型等

流程控制语句

1、选择语句

if语句

if语句是指如果满足某种条件,就进行某种处理。
语法格式:

if(条件语句){ 
	执行语句;
	……
}

代码演示

public class Demo{
	public static void main(String[] args) {
	    int x = 5;
        if(x < 10){
            x++;
        }
        System.out.println("x=" + x);
	}
}

if…else语句

if…else语句是指如果满足某种条件,就进行某种处理,否则就进行另一种处理。
语法格式:

if(判断条件){
	执行语句1
	……
}else{
	执行语句2
	……
}

代码演示

public class Demo {
	public static void main(String[] args) {
        int num = 5;
        if(num % 2 == 0){
            //判断条件成立,num被2整除
            System.out.println("num是一个偶数");
        }else{
            System.out.println("num是一个奇数");
        }
	}
}

if…else if…else语句

if…else if…else语句用于对多个条件进行判断,进行多种不同的处理。
语法格式:

if(判断条件1){
	执行语句1
}else if (判断条件2){
	执行语句2
}else if (判断条件n){
	执行语句n
}else{
	执行语句n+1
}

代码演示

public class Demo {
	public static void main(String[] args) {
        int grade = 75; // 定义学生成绩
        if (grade > 80){
            System.out.println("该成绩的等级为优");
        }else if(grade > 70){
            System.out.println("该成绩的等级为良");
        }else if(grade > 60){
            System.out.println("该成绩的等级为中");
       }else{
           System.out.println("该成绩的等级为差");
       }
	}
}

选择结构if语句与三元运算转换

三元运算符,它和if-else语句类似,语法如下:

判断条件 ? 表达式1 : 表达式2

三元运算符会得到一个结果,通常用于对某个变量进行赋值,当判断条件成立时,运算结果为表达式1的值,否则结果为表达式2的值。

例如求两个数x、y中的较大者,如果用if…else语句来实现,具体代码如下:

int x = 0;
int y = 1;
int max;
if(x > y){
	max = x;
}else{
	max = y;
}
//上面的代码运行之后,变量max的值为1。其中3-8行的代码可以使用下面的三元运算来替换。
int max = x > y ? x : y;

switch语句

switch 条件语句也是一种很常用的选择语句,它和if条件语句不同,它只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码。
语法格式:

switch (表达式){
	case 目标值1:
        执行语句1
        break;
	case 目标值2:
        执行语句2
        break;
    ......     
	case 目标值n:
       执行语句n
       break;
	default:
       执行语句n+1
       break;
}

练习:根据数字来输出中文格式的星期

public class SwitchDemo01 {
	public static void main(String[] args) {
        int week = 5;
        switch(week){
            case 1:
                System.out.println("星期一");
            break;
        case 2:
            System.out.println("星期二");
           break;
        case 3:
            System.out.println("星期三");
            break;
        case 4:
            System.out.println("星期四");
            break;
        case 5:
            System.out.println("星期五");
            break;
        case 6:
            System.out.println("星期六");
            break;
        case 7:
            System.out.println("星期天");
            break;
        default:
            System.out.println("输入的数字不正确...");
            break;
        }
	}
}

2、循环语句

while循环

while循环语句和选择结构if语句有些相似,都是根据条件判断来决定是否执行大括号内的执行语句。区别在于,while语句会反复地进行条件判断,只要条件成立,{}内的执行语句就会执行,直到条件不成立,while循环结束。
语法格式:

while(循环条件){
    执行语句
    ………
}

代码演示

public class Demo {
	public static void main(String[] args) {
        int x = 1; 
        while(x <= 4){ 
            System.out.println("x = "+x);
            x++;
        }
	}
}

for循环

for循环语句是最常用的循环语句,一般用在循环次数已知的情况下。
语法格式:

for(初始化表达式; 循环条件; 操作表达式){
    执行语句
    ………
}

代码演示

public class ForDemo {
	public static void main(String[] args) {
        int sum = 0;
        for(int i = 1; i <= 4; i++){ 
            sum += i;
        }
        System.out.println("sum = " + sum);
	}
}

do…while循环

do…while循环语句和while循环语句功能类似
语法格式:

do{
    执行语句
    ………
}while(循环条件);

在上面的语法结构中,关键字do后面{}中的执行语句是循环体。do…while循环语句将循环条件放在了循环体的后面。这也就意味着,循环体会无条件执行一次,然后再根据循环条件来决定是否继续执行。

public class Demo {
	public static void main(String[] args) {
        int x = 1;
        do{
            System.out.println("x = " + x);
            x++;
        }while(x <= 4); // 循环条件
	}
}

循环嵌套

嵌套循环是指在一个循环语句的循环体中再定义一个循环语句的语法结构。while、do…while、for循环语句都可以进行嵌套,并且它们之间也可以互相嵌套,如最常见的在for循环中嵌套for循环。

for(初始化表达式; 循环条件; 操作表达式){
	………
	for(初始化表达式; 循环条件; 操作表达式){
	    执行语句
        ………
	}
	………
}

案例:打印直角三角形

public class Demo {
    public static void main(String[] args) {
        int i, j; // 定义两个循环变量
        for(i = 1; i <= 9; i++){ // 外层循环
    	for(j = 1; j <= i; j++){ // 内层循环
    		System.out.print("*"); // 打印*
    	}
    	System.out.print("\n"); // 换行
        }
    }
}

跳转语句(break、continue)

跳转语句用于实现循环执行过程中程序流程的跳转,在Java中的跳转语句有break语句和continue语句。

break语句
在switch条件语句和循环语句中都可以使用break语句。当它出现在switch条件语句中时,作用是终止某个case并跳出switch结构。当它出现在循环语句中,作用是跳出循环语句,执行后面的代码。关于在switch语句中使用break前面的例程已经用过了,接下来通过下面一段代码,实现将当变量x的值为3时,使用break语句跳出循环。

代码演示

public class Demo {
	public static void main(String[] args) {
        int x = 1;
        while(x <= 4){
            System.out.println("x = " + x);
            if(x == 3){
                break; // 条件成立则跳出循环
            }
            x++;
       }
	}
}

continue语句

continue语句用在循环语句中,它的作用是终止本次循环,执行下一次循环。

练习:对1~100之内的奇数求和

public class Demo {
	public static void main(String[] args) {
        int sum = 0;
        for(int i = 1; i <= 100; i++){
            if(i % 2 == 0){
                continue; //结束本次循环
            }
            sum += i; // 实现sum和i的累加
        }
        System.out.println("sum = " + sum);
	}
}

数组&排序

在Java中,可以使用以下格式来定义一个数组。

数据类型[] 数组名 = new 数据类型[元素个数或数组长度];

例如:

int[] x = new int[100];

为了更好地理解数组的这种定义方式,可以将上面的一句代码分成两句来写
int[] x; // 声明一个int[]类型的变量

x = new int[100]; // 创建一个长度为100的数组

第一行代码 int[] x; 声明了一个变量x,该变量的类型为int[],即一个int类型的数组。变量x会占用一块内存单元,它没有被分配初始值。
在这里插入图片描述
第二行代码 x = new int[100]; 创建了一个数组,将数组的地址赋值给变量x。在程序运行期间可以使用变量x来引用数组,这时内存中的状态会发生变化
在这里插入图片描述
代码演示

public class ArrayDemo {
    public static void main(String[] args) {
        int[] arr; // 声明变量
        arr = new int[3]; // 创建数组对象
        System.out.println("arr[0]=" + arr[0]); // 访问数组中的第一个元素
        System.out.println("arr[1]=" + arr[1]); // 访问数组中的第二个元素
        System.out.println("arr[2]=" + arr[2]); // 访问数组中的第三个元素
        System.out.println("数组的长度是:" + arr.length); // 打印数组长度
    }
}

数组的遍历

在操作数组时,经常需要依次访问数组中的每个元素,这种操作称作数组的遍历。接下来通过一个案例来学习如何使用for循环来遍历数组。

public class ArrayDemo04 {
	public static void main(String[] args) {
        int[] arr = { 1, 2, 3, 4, 5 }; // 定义数组
        // 使用for循环遍历数组的元素
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]); // 通过索引访问元素
        }
	}
}

扩展:增强for循环

数组的遍历可以通过增强for循环来完成
语法格式:

for(数据类型 变量名 : 数组名){
    输出语句;
}

例如:

public class Demo {
    public static void main(String[] args){
        int[] arr = { 1, 2, 3, 4, 5 };
        for(int x : arr){ //高级for循环
            System.out.println(x);
        }
    }
}

二维数组

二维数组的定义格式
第一种方式:

int[][] arr = new int[3][4];

上面的代码相当于定义了一个3*4的二维数组,即二维数组的长度为3,二维数组中的每个元素又是一个长度为4的数组,接下来通过一个图来表示这种情况
在这里插入图片描述
第二种方式:

int[][] arr = new int[3][];

第二种方式和第一种类似,只是数组中每个元素的长度不确定,接下来通过一个图来表示这种情况
在这里插入图片描述
第三种方式:
上面的二维数组中定义了三个元素,这三个元素都是数组,分别为{1,2}、{3,4,5,6}、{7,8,9},接下来通过一个图来表示这种情况
在这里插入图片描述
对二维数组中元素的访问也是通过角标的方式,如需访问二维数组中第一个元素数组的第二个元素,例如

arr[0][1];

二维数组元素的访问

class ArrayDemo {
	public static void main(String[] args){
        //定义二维数组的方式
        int[][] arr = new int[3][4];
        
        System.out.println( arr );
        System.out.println("二维数组的长度: " + arr.length);
        //获取二维数组的3个元素
        System.out.println( arr[0] );
       System.out.println( arr[1] );
       System.out.println( arr[2] );
        
        System.out.println("打印第一个一维数组的元素值");
        System.out.println( arr[0][0] );
        System.out.println( arr[0][1] );//访问的为二维数组中第1个一维数组的第2个元素
        System.out.println( arr[0][2] );
        System.out.println( arr[0][3] );
        
        System.out.println("打印第二个一维数组的元素值");
        System.out.println( arr[1][0] );
        System.out.println( arr[1][1] );
        System.out.println( arr[1][2] );
        System.out.println( arr[1][3] );
        
        System.out.println("打印第三个一维数组的元素值");
        System.out.println( arr[2][0] );
        System.out.println( arr[2][1] );
        System.out.println( arr[2][2] );
        System.out.println( arr[2][3] );
	}
}

数组的排序

①冒泡排序

原理:依次比较相邻的两个元素,通过一次比较将数组中最大(或最小)的元素放在了数组的末尾。

实现代码:

public static void BubbleSort(int[] arr) {
	//外层循环控制比较趟数
	for(int i = 1; i < arr.length; i++) {
        //内层循环控制当前趟的比较次数
	    for(int j = 0; j < arr.length-i; j++) {
        	if(arr[j] > arr[j+1]) //循环比较相邻两个元素
		   swap(arr, j, j+1);
        }
	}
}

②选择排序

原理:每一次从数组的元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

这就好比一个小学生,从包含 数字1-10的乱序的数字堆中分别选择合适的数字,组成一个1-10的排序。而这个学生首先从数字堆中选择1,放在第一位,然后选择2(注意 这时的数字堆中已经没有1了),放在第二位,以此类推,直到其找到数字9,放在8的后面,最后剩下10,就不用选择了,直接放到最后就可以了。

代码实现:

public static void SelectSort(int[] arr) {
	//声明一个指针,指向最大值的下标
	int index;
	for(int i = 1; i < arr.length; i++) {
	    index = 0; //假设第一元素是最大值
        for(int j = 1; j <= arr.length-i; j++) {
           if(arr[j] > arr[index])
		  index = j; //如果发现比最大值大,那么就将下标赋给index
        }
       swap(arr, arr.length-i, index);
	}
}

热门文章

暂无图片
编程学习 ·

COMP暴涨 风险暗藏

作者|JX kin编辑|文刀6月29日,在以太坊上构建的DeFi借贷协议Compound,因资金规模首超10亿美元引起市场关注,更受关注的是该协议的治理代币COMP近期的暴涨暴跌。从几十美元到400多美元再到如今的200多美元,COMP这趟过山车仅仅开了不到半个月。6月16日,自Compound以“流动性…
暂无图片
编程学习 ·

通过组键扫描使得Spring管理类的对象

通过组件扫描使得Spring管理类的对象。 如果User类需要使用Spring框架管理,必须声明User类所在的包,然后再用测试类中的AnnotationConfigApplicationContext的构造方法中将包名作为参数():import org.springframework.context.annotation.AnnotationConfigApplicationContex…
暂无图片
编程学习 ·

Scanner对象

Scanner对象 作为输入使用,主要有两种接收键盘输入字符的方法,next()方法和nextLine()方法,下面介绍一下 import java.util.Scanner;public class demo01 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输…
暂无图片
编程学习 ·

练习2-1 Programming in C is fun! (5分)

练习2-1 Programming in C is fun! (5分) 本题要求编写程序,输出一个短句“Programming in C is fun!”。 输入格式: 本题目没有输入。 输出格式: 在一行中输出短句“Programming in C is fun!”。 #include <stdio.h>int main() {printf("Programming in C is fun…
暂无图片
编程学习 ·

nginx+tomcat 配置证书

nginx 配置证书 tomcat 配置文件说明#user nobody; worker_processes 1;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024; }http {include mime.typ…
暂无图片
郑州普通话 ·

学习笔记六——循环神经网络

一、RNN 前馈神经网络&#xff1a;信息往一个方向流动。包括MLP和CNN 循环神经网络&#xff1a;信息循环流动&#xff0c;网络隐含层输出又作为自身输入&#xff0c;包括RNN、LSTM、GAN等。 RNN模型结构如下图所示&#xff1a; 展开之后相当于堆叠多个共享隐含层参数的前馈…
暂无图片
代理记账 ·

学习笔记六——循环神经网络

一、RNN 前馈神经网络&#xff1a;信息往一个方向流动。包括MLP和CNN 循环神经网络&#xff1a;信息循环流动&#xff0c;网络隐含层输出又作为自身输入&#xff0c;包括RNN、LSTM、GAN等。 RNN模型结构如下图所示&#xff1a; 展开之后相当于堆叠多个共享隐含层参数的前馈…
暂无图片
cgfy ·

学习笔记六——循环神经网络

一、RNN 前馈神经网络&#xff1a;信息往一个方向流动。包括MLP和CNN 循环神经网络&#xff1a;信息循环流动&#xff0c;网络隐含层输出又作为自身输入&#xff0c;包括RNN、LSTM、GAN等。 RNN模型结构如下图所示&#xff1a; 展开之后相当于堆叠多个共享隐含层参数的前馈…
暂无图片
coreui ·

Heap Sort 讲解

Heap Sort sorts a group of unordered elements using the Heap data structure. The sorting algorithm using a Min Heap is as follows: Heapify all elements into a Min HeapRecord and delete the top elementPut to top element into an array T that stores all so
暂无图片
未来博客 ·

Heap Sort 讲解

Heap Sort sorts a group of unordered elements using the Heap data structure. The sorting algorithm using a Min Heap is as follows: Heapify all elements into a Min HeapRecord and delete the top elementPut to top element into an array T that stores all so
暂无图片
建站日记 ·

[react] 你觉得react上手快不快?它有哪些限制?

[react] 你觉得react上手快不快&#xff1f;它有哪些限制&#xff1f; 相对vue来说不快。 限制 需要学习JSX需要工程化的配置需要对原生JavaScript有相当的掌握react只是一个UI层面的库&#xff0c;像vue内置了动画处理、keep-alive等功能&#xff0c;react则需要去找第三方库…
暂无图片
mfbz ·

学习笔记六——循环神经网络

一、RNN 前馈神经网络&#xff1a;信息往一个方向流动。包括MLP和CNN 循环神经网络&#xff1a;信息循环流动&#xff0c;网络隐含层输出又作为自身输入&#xff0c;包括RNN、LSTM、GAN等。 RNN模型结构如下图所示&#xff1a; 展开之后相当于堆叠多个共享隐含层参数的前馈…
暂无图片
mfbz ·

AOV网是否存在回路-拓扑排序-C++

拓扑排序是对测试AOV网是否存在回路的方法&#xff01; 拓扑排序的过程中&#xff0c;由于需要查找所有以某顶点为尾的弧&#xff0c;即找到该顶点的所有出边&#xff0c;故图要采用邻接表的存储方式。但拓扑排序较邻接表的存储方式有一点不同&#xff0c;由于要查找入度为0的点…
暂无图片
珊珊日记 ·

学习笔记六——循环神经网络

一、RNN 前馈神经网络&#xff1a;信息往一个方向流动。包括MLP和CNN 循环神经网络&#xff1a;信息循环流动&#xff0c;网络隐含层输出又作为自身输入&#xff0c;包括RNN、LSTM、GAN等。 RNN模型结构如下图所示&#xff1a; 展开之后相当于堆叠多个共享隐含层参数的前馈…
暂无图片
珊珊日记 ·

AOV网是否存在回路-拓扑排序-C++

拓扑排序是对测试AOV网是否存在回路的方法&#xff01; 拓扑排序的过程中&#xff0c;由于需要查找所有以某顶点为尾的弧&#xff0c;即找到该顶点的所有出边&#xff0c;故图要采用邻接表的存储方式。但拓扑排序较邻接表的存储方式有一点不同&#xff0c;由于要查找入度为0的点…