JAVA基础知识点(一)数组之前

it2025-07-18  3

文章目录

前言Java虚拟机——JVMJRE 和 JDKJava程序开发三步骤Java和C++的区别入门案例 数据类型基本数据类型引用数据类型数据类型转换自动转换强制转换 运算符算术运算符赋值运算符比较运算符逻辑运算符三元运算符 流程控制顺序结构判断语句选择语句循环语句跳出语句 数组JAVA虚拟机的内存划分**一个数组内存图****两个数组内存图**两个变量指向一个数组


前言

Java虚拟机——JVM

JVM(Java Virtual Machine ):Java虚拟机,简称JVM,是运行所有Java程序的假想计算机,是Java程序的运行环境,是Java 最具吸引力的特性之一。我们编写的Java代码,都运行在JVM 之上。

跨平台:任何软件的运行,都必须要运行在操作系统之上,而我们用Java编写的软件可以运行在任何的操作系统上,这个特性称为Java语言的跨平台特性。java语言不是直接运行在CPU上,而是在JVM虚拟机上运行的,每个系统都有自己的虚拟机,所以java语言能够实现跨平台 如图所示,Java的虚拟机本身不具备跨平台功能的,每个操作系统下都有不同版本的虚拟机。

JRE 和 JDK

JRE (Java Runtime Environment) :是Java程序的运行时环境,包含JVM和运行时所需要的核心类库。 JDK (Java Development Kit):是Java程序开发工具包,包含JRE和开发人员使用的工具。 我们想要运行一个已有的Java程序,那么只需安装JRE即可。 我们想要开发一个全新的Java程序,那么必须安装JDK。

Java程序开发三步骤

编写、编译、运行。 javac负责编译 启动java编译器程序,将.java文件编译成.class文件(字节码文件) 字节码文件可以被jvm识别

java负责运行的部分,会启动jvm,加载运行时所需的类库,对class文件进行执行

Java和C++的区别

我知道很多人没学过C++,但是面试官就是没事喜欢拿咱们Java和C++比呀!没办法!!!就算没学过C++,也要记下来!

都是面向对象的语言,都支持封装、继承和多态Java不提供指针来直接访问内存,程序内存更加安全Java的类是单继承的,C++支持多重继承;虽然Java的类不可以多继承,但是接口可以多继承。java有自动内存管理机制,不需要程序员手动释放无用内存

入门案例

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

文件名必须是HelloWorld,保证文件名和类的名字是一致的,注意大小写。

main方法:称为主方法。写法是固定格式不可以更改。main方法是程序的入口点或起始点,无论我们编写多少程序,JVM在运行的时候,都会从main方法这里开始执行。

命名规则: 硬性要求 标识符可以包含英文字母26个(区分大小写) 、0-9数字 、$(美元符号) 和_(下划线) 。 标识符不能以数字开头。 标识符不能是关键字。

数据类型

基本数据类型

Java中的默认类型:整数类型是int、浮点类型是double。

在定义变量的时候 long类型:建议数据后加L表示。 float类型:建议数据后加F表示。

引用数据类型

数据类型转换

自动转换

将取值范围小的类型自动提升为取值范围大的类型 。

public static void main(String[] args) { int i = 1; byte b = 2; // byte x = b + i; // 报错 //int类型和byte类型运算,结果是int类型 int j = b + i; System.out.println(j); }

范围小的类型向范围大的类型提升, byte、short、char 运算时直接提升为int 。

byte、short、char‐‐>int‐‐>long float‐‐>double

强制转换

强制类型转换:将取值范围大的类型强制转换成取值范围小的类型。 转换格式: 数据类型 变量名 = (数据类型)被转数据值;

// double类型数据强制转成int类型,直接去掉小数点。 int i = (int)1.5;

强烈注意 浮点转成整数,直接取消小数点,可能造成数据损失精度。 int 强制转成short 砍掉2个字节,可能造成数据丢失。

笔试题:

public static void main(String[] args) { //short类型变量,内存中2个字节 short s = 1; /* 出现编译失败 s和1做运算的时候,1是int类型,s会被提升为int类型 s+1后的结果是int类型,将结果在赋值会short类型时发生错误 short内存2个字节,int类型4个字节 必须将int强制转成short才能完成赋值 */ s = s + 1//编译失败 s = (short)(s+1);//编译成功 }

运算符

算术运算符

+、 -、 *、 /、%、++、 --

赋值运算符

=、 +=、 *=、 /=、%=

比较运算符

==、<、 >、 <=、 >=、 !=

逻辑运算符

三元运算符

数据类型 变量名 = 布尔类型表达式?结果1:结果2

布尔类型表达式结果是true,三元运算符整体结果为结果1,赋值给变量。 布尔类型表达式结果是false,三元运算符整体结果为结果2,赋值给变量。



流程控制

顺序结构

public static void main(String[] args){ //顺序执行,根据编写的顺序,从上到下运行 System.out.println(1); System.out.println(2); System.out.println(3); }

判断语句

if if… else… if … else if … else…

选择语句

switch…case语句格式

switch(表达式) { case 常量值1: 语句体1; break; case 常量值2: 语句体2; break; ... default: 语句体n+1; break; }

在switch语句中,如果case的后面不写break,将出现穿透现象,也就是不会在判断下一个case的值,直接向后运行,直到遇到break,或者整体switch结束。

面试题 switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上?

在 Java 5 以前,switch(expr)中,expr 只能是 byte、short、char、int。从 Java5开始,Java 中引入了枚举类型,expr 也可以是 enum 类型,从 Java 7 开始,expr还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。

循环语句

for while do{…} while();

for 和 while 的小区别: 控制条件语句所控制的那个变量,在for循环结束后,就不能再被访问到了,而while循环结束还可以继续使用,如果你想继续使用,就用while,否则推荐使用for。原因是for循环结束,该变量就从内存中消失,能够提高内存的使用效率。 在已知循环次数的时候使用推荐使用for,循环次数未知的时推荐使用while。

跳出语句

break

使用场景:终止switch或者循环

在选择结构switch语句中在循环语句中离开使用场景的存在是没有意义的 public static void main(String[] args) { for (int i = 1; i<=10; i++) { //需求:打印完两次HelloWorld之后结束循环 if(i == 3){ break; } System.out.println("HelloWorld"+i); } }

continue 使用场景:结束本次循环,继续下一次的循环

public static void main(String[] args) { for (int i = 1; i <= 10; i++) { //需求:不打印第三次HelloWorld if(i == 3){ continue; } System.out.println("HelloWorld"+i); } }

数组

数组初始化

public static void main(String[] args) { int[] arr1 = new int[5]; //动态初始化 int[] arr2 = new int[]{1,2,3,4,5}; int[] arr3 = {1,2,3,4,5}; }

数组的访问 索引: 每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引 (index),可以通过数组的索引访问到数组中的元素。

数组的长度属性: 每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的长度,语句为: 数组名.length,属性length的执行结果是数组的长度,int类型结果。由次可以推断出,数组的最大索引值为数组名.length-1 。

数组的遍历

public class HelloWorld { public static void main(String[] args) { int[] arr = {15,3,48,1,6,45}; // 根据数组的length属性来遍历 for(int i=0;i<arr.length;i++){ arr[i]=i; System.out.println(arr[i]); } // 如果获取的元素在数组中根本不存在,例如获取第11个元素,会出现数组下标越界异常 // 使用增强for循环进行遍历 for(int i:arr){ // int i 遍历数据的时候所使用的的容器 // arr 表示你要遍历的数组或集合是哪一个 System.out.println(i); } } }

传统的for循环遍历 既可以对元素赋值 也可以遍历数组元素 增强for循环遍历 不可以对元素进行赋值 底层使用的是iteratoer迭代器进行遍历

JAVA虚拟机的内存划分

一个数组内存图

public static void main(String[] args) { int[] arr = new int[3]; System.out.println(arr);//[I@5f150435 }

两个数组内存图

public static void main(String[] args) { int[] arr = new int[3]; int[] arr2 = new int[2]; System.out.println(arr); System.out.println(arr2); }

两个变量指向一个数组

public static void main(String[] args) { // 定义数组,存储3个元素 int[] arr = new int[3]; //数组索引进行赋值 arr[0] = 5; arr[1] = 6; arr[2] = 7; //输出3个索引上的元素值 System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); //定义数组变量arr2,将arr的地址赋值给arr2 int[] arr2 = arr; arr2[1] = 9; System.out.println(arr[1]); }

最新回复(0)