数组是用于存储同种类型的多个数据的容器。
一、声明
//语法
dataType[] arrayRefVar; // 首选的方法
或
dataType arrayRefVar[]; // 效果相同,但不是首选方法
//示例
double[] myList; // 首选的方法
或
double myList[]; // 效果相同,但不是首选方法
二、创建数组
//语法
dataType[] arrayRefVar = new dataType[arraySize];
dataType[] arrayRefVar = new dataType[]{
value0, value1, ..., valuek};
dataType[] arrayRefVar = {
value0, value1, ..., valuek};
数组的元素是通过索引访问的。数组索引从 0 开始,所以索引值从 0 到 arrayRefVar.length-1
。
//示例
public class TestArray {
public static void main(String[] args) {
// 数组大小
int size = 10;
// 定义数组
double[] myList = new double[size];
myList[0] = 5.6;
myList[1] = 4.5;
myList[2] = 3.3;
myList[3] = 13.2;
myList[4] = 4.0;
myList[5] = 34.33;
myList[6] = 34.0;
myList[7] = 45.45;
myList[8] = 99.993;
myList[9] = 11123;
// 计算所有元素的总和
double total = 0;
for (int i = 0; i < size; i++) {
total += myList[i];
}
System.out.println("总和为: " + total);
}
}
注:采用new dataType[arraySize]
的方式创建的数组,每一项都会有默认值,不同的类型默认值不一样:
- byte、short、int、char、long类型数组的元素默认值都是
0
- float、double类型数组元素的默认值都是
0.0
- boolean类型数组的元素默认值是
false
,String
类型数组的元素的默认值是null
三、数组遍历
使用myList.length
可以获取数组的长度,结合for循环,我们可以对数组进行遍历,以便对数组中的每一项进行处理。
//方式一
public class TestArray {
public static void main(String[] args) {
double[] myList = {
1.9, 2.9, 3.4, 3.5};
// 打印所有数组元素
for (int i = 0; i < myList.length; i++) {
System.out.println(myList[i] + " ");
}
// 计算所有元素的总和
double total = 0;
for (int i = 0; i < myList.length; i++) {
total += myList[i];
}
System.out.println("Total is " + total);
// 查找最大元素
double max = myList[0];
for (int i = 1; i < myList.length; i++) {
if (myList[i] > max) max = myList[i];
}
System.out.println("Max is " + max);
}
}
//方式二
for(type element: array)
{
System.out.println(element);
}
四、函数参数是数组
public static void printArray(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
五、函数的返回值是数组
public static int[] reverse(int[] list) {
int[] result = new int[list.length];
for (int i = 0, j = result.length - 1; i < list.length; i++, j--) {
result[j] = list[i];
}
return result;
}
六、多维数组
String[][] str = new String[3][4];
七、工具类Arrays
1、判断相等-equals
如果两个数组以相同顺序包含相同的元素,则两个数组是相等的。
package com.itfeiniu.hello;
import java.util.Arrays;
public class HelloWorld {
public static void main(String[] args) {
int[] a1 = {
12, 56, 42};
//声明创建一个数组
int[] a2 = new int[3];//先定义数组长度
a2[0] = 12;
a2[1] = 56;
a2[2] = 42;
//给数组赋值
int[] a3 = {
42, 56, 12};//a3元素和a1相同,顺序不同
if (Arrays.equals(a1, a2)) {
System.out.println("a1和a2相等");
} else {
System.out.println("a1和a2不相等");
}
if (Arrays.equals(a1, a3)) {
System.out.println("a1和a3相等");
} else {
System.out.println("a1和a3不相等");
}
}
}
//a1和a2相等
//a1和a3不相等
2、正序排序-sort
package com.itfeiniu.hello;
import java.util.Arrays;
public class HelloWorld {
public static void main(String[] args) {
int[] myList = new int[3];
myList[0] = 3;
myList[1] = 1;
myList[2] = 2;
Arrays.sort(myList);
for (int i = 0; i < myList.length; i++) {
System.out.println(myList[i]);
}
}
}
//1
//2
//3
3、填充-fill
package com.itfeiniu.hello;
import java.util.Arrays;
public class HelloWorld {
public static void main(String[] args) {
int[] myList = new int[3];
Arrays.fill(myList, 10);
for (int i = 0; i < myList.length; i++) {
System.out.println(myList[i]);
}
}
}
//10
//10
//10
4、查找-binarySearch
package com.itfeiniu.hello;
import java.util.Arrays;
public class HelloWorld {
public static void main(String[] args) {
int[] myList = new int[3];
myList[0] = 30;
myList[1] = 10;
myList[2] = 20;
Arrays.sort(myList);//必须先做排序
System.out.println(Arrays.binarySearch(myList, 20));
System.out.println(Arrays.binarySearch(myList, 1));
}
}
//1
//-1
用二分查找算法在给定数组中搜索给定值的对象(Byte,Int,double等)。数组在调用前必须排序好的。如果查找值包含在数组中,则返回搜索键的索引;否则返回 (-(插入点) - 1)。
5、转换成字符串-toString
package com.itfeiniu.hello;
import java.util.Arrays;
public class HelloWorld {
public static void main(String[] args) {
int[] myList = new int[3];
myList[0] = 30;
myList[1] = 10;
myList[2] = 20;
Arrays.sort(myList);
System.out.println(Arrays.toString(myList));
}
}
//[10, 20, 30]
八、数组存储
JVM中包含三种内存区域:
- 方法区
- 栈内存
- 堆内存
变量和数组的存储案例说明:int a=20;int[] arr=new int[3];
- a是变量,直接放在【栈中】,a变量中存储的数据就是20这个值
- new int[3]是创建一个数组对象,会在【堆内存】中开辟区域存储3个整数
- arr是变量,在【栈中】,arr中存储的是数组对象在堆内存中的地址值
多个变量指向同一个数组:
package com.itfeiniu.hello;
public class HelloWorld {
public static void main(String[] args) {
int[] arr1 = {
11, 22, 33};
int[] arr2 = arr1;
arr2[1] = 222;//改了arr2,arr1也同时改变。引用类型。
System.out.println(arr1[1]);
System.out.println(arr2[1]);//引用类型,arr2存储在栈中,存储了arr1的内存地址值
}
}
//222
//222
如果某个数组变量存储的地址是
null
,那么该变量将不再指向任何数组对象。
十、ArrayList集合
ArrayList
集合类似于数组。不同的是集合和泛型都不支持基本数据类型,只支持引用数据类型。
package com.itfeiniu.hello;
import java.util.ArrayList;
public class HelloWorld {
public static void main(String[] args) {
ArrayList arr=new ArrayList();
arr.add("a");
arr.add("b");
arr.add("c");
for (int i = 0; i < arr.size(); i++) {
System.out.println(arr.get(i));
}
}
}
//a
//b
//c
十一、一个简单的饭店上菜系统
这里使用Scanner
交互式命令行,实现点菜,上菜的功能模拟。
一共三份代码,具体代码如下:
- HelloWorld.java 入口文件
- Food.java 菜品类
- FoodOperator.java 菜品操作类
//HelloWorld.java
package com.itfeiniu.hello;
public class HelloWorld {
public static void main(String[] args) {
FoodOperator operator = new FoodOperator();
operator.start();
}
}
package com.itfeiniu.hello;
import java.util.ArrayList;
import java.util.Scanner;
public class FoodOperator {
private ArrayList<Food> foodList = new ArrayList<>();
public void addFood() {
Food f = new Food();
Scanner sc = new Scanner(System.in);
System.out.println("请输入该菜品名称:");
String name = sc.next();
f.setName(name);
System.out.println("请输入该菜品价格:");
Double price = sc.nextDouble();
f.setPrice(price);
System.out.println("请输入该菜品描述:");
String decs = sc.next();
f.setDesc(decs);
foodList.add(f);
System.out.println("上架成功!");
}
public void showAllFood() {
if (foodList.size() == 0) {
System.out.println("请先上架菜品!");
return;
}
for (int i = 0; i < foodList.size(); i++) {
Food f = foodList.get(i);
System.out.println(f.getName());
System.out.println(f.getPrice());
System.out.println(f.getDesc());
System.out.println("------------------------");
}
}
public void start() {
while (true) {
System.out.println("请选择功能:");
System.out.println("1、上架菜品");
System.out.println("2、展示菜品");
System.out.println("3、退出");
Scanner sc = new Scanner(System.in);
String command = sc.next();
switch (command) {
case "1":
addFood();
break;
case "2":
showAllFood();
break;
case "3":
System.out.println("欢迎下次再来!");
return;
default:
System.out.println("您输入的命令不存在");
break;
}
}
}
}
package com.itfeiniu.hello;
public class Food {
String name;
double price;
String desc;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
命令行执行过程如下:
请选择功能:
1、上架菜品
2、展示菜品
3、退出
1
请输入该菜品名称:
黄瓜
请输入该菜品价格:
2.5
请输入该菜品描述:
夏天吃起来很应季
上架成功!
请选择功能:
1、上架菜品
2、展示菜品
3、退出
1
请输入该菜品名称:
红烧肉
请输入该菜品价格:
12.5
请输入该菜品描述:
非常下饭的一道菜
上架成功!
请选择功能:
1、上架菜品
2、展示菜品
3、退出
2
黄瓜
2.5
夏天吃起来很应季
------------------------
红烧肉
12.5
非常下饭的一道菜
------------------------
请选择功能:
1、上架菜品
2、展示菜品
3、退出
3
欢迎下次再来!
Process finished with exit code 0