目录
数组介绍
数组可以存放多个同一类型的数据。数组也是一种数据类型,是引用类型。
- 即:数(数据)组(一组)就是一组数据;
数组快速入门
问题:一个养鸡场有 6 只鸡,它们的体重分别是 3kg,5kg,1kg,3.4kg,2kg,50kg 。请问这六只鸡的总体重是多少?平 均体重是多少?
public class Array01{
public static void main(String[] args){
//定义一个数组
double average = 0;
double totalWeight = 0;
//静态初始化 数据类型 []变量名 = {值1,值2,值3}
//他们的类型都是一样的,且是程序运行中可以更改的变量
double [] hens = {3,5,1,3.4,2,50};
//数组名.length 可以获取数组的长度
System.out.println("数组的长度=" + hens.length);
for (int i = 0; i < hens.length;i++ ) {
totalWeight +=hens[i];
System.out.println("第" + (i+1) + "个元素的值=" + hens[i] );
}
average = totalWeight / hens.length;
System.out.println("平均重:" + average);
}
}
1.数组的使用方式
1.1动态初始化
使用方法1-动态初始化
数组的定义:
数据类型 a[] = new 数据类型[大小]
int a[] = new int[5];//创建了一个数组,名字a,存放5个int 默认值是0,double为0.0
使用方法2-动态初始化
先声明:
语法:数据类型 数组名[]; 也可以 数据类型[] 数组名;
int a[]; 或者 int[] a;
创建数组
语法: 数组名=new 数据类型[大小];
a=new int[10]
示例
import java.util.Scanner;
public class Array02{
public static void main(String[] args){
Scanner myScanner = new Scanner(System.in);
int i;
// double score [] = new double [5];
double score [];//声明一个数组,这时是一个空值
score = new double [5];
for (i=0;i < score.length ;i++ ) {
System.out.print("请输入第"+ (i+1) +"个成绩:");
score[i] = myScanner.nextDouble();
}
for (i=0; i < score.length ; i++ ) {
System.out.println("第"+ (i+1) +"个成绩为:" + score[i]);
}
System.out.println("程序运行结束!");
}
}
1.2静态初始化
语法:数据类型 数组名[] = {元素值,元素值.....}
- 适用于元素的值不太多的情况下使用
例如:
int a[] = {1,2,3,4,5,6,7,8,9}
相当于:
int a[] = new a[9];
a[0]=1;
a[1]=2;
...
2.数组的注意事项
- 数组是多个相同类型数据的组合,实现对这些数据的统一管理
- 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用
- 数组创建后,如果没有赋值,有默认值
- int 0,short 0, byte 0, long 0, float 0.0,double 0.0,char \u0000,boolean false,String null
- 使用数组的步骤 1. 声明数组并开辟空间 2 给数组各个元素赋值 3 使用数
- 数组的下标是从 0 开始的
- 数组下标必须在指定范围内使用,否则报:下标越界异常
- 索引最小为0,最大是数组的长度-1
- 数组属于引用类型,数组型数据是对象(object)
应用案例
题目:创建一个 char 类型的 26 个元素的数组,分别 放置'A'-'Z'。使用 for 循环访问所有元素并打印出来。提示:char 类型 数据运算 'A'+2 -> 'C' ArrayExercise01.java
public class ArrayExercise01{
public static void main(String[] args){
/*
创建一个 char 类型的 26 个元素的数组,
分别 放置'A'-'Z'。使用 for 循环访问所有元素并打印出来。
提示:char 类型
数据运算 'A'+2 -> 'C' ArrayExercise01.jav
*/
char letter[] = new char[26];
char ch = 'A';
for (int i = 0; i < letter.length ; i++,ch++ ) {
//方法一
// letter[i] = (char)('A' + i);
//方法二
letter[i] = ch;
}
for (int i = 0; i <letter.length ; i++ ) {
System.out.print(letter[i] + " ");
}
}
}
3.数组的赋值机制
1)基本数据类型赋值,这个值就是具体的数据,而且相互不影响
- 赋值方式为值,拷贝
2) 数组在默认情况下是引用传递,赋的值是地址。
//数组在默认情况下是引用传递,赋的是地址
//是一个地址,arr2变化会影响arr1
int arr1[] = {1,2,3};
int arr2[] = arr1; // 把arr1赋值给arr2;
示例
数组的拷贝
public class ArrayCopy{
public static void main(String[] args){
int arr1[] = {10,20,30};
int arr2[] = new int [arr1.length];
for (int i = 0; i<arr1.length ; i++) {
arr2[i] = arr1[i];
}
for (int i = 0; i<arr2.length ; i++ ) {
System.out.println(arr2[i]);
}
}
}
4.数组的翻转
方法一:找规律
public class ArrayReverse{
public static void main(String[] args){
//方法一
int arr1[] = {1,2,3,4,5,6};
int i;
for ( i = arr1.length-1; i >=0 ; i-- ) {
System.out.print(arr1[i] + " ");
}
System.out.println();
//方法二
// int j;
// System.out.println();
// for ( i = 0, j= arr1.length-1; i < j; i++,j-- ) {
// int tem = arr1[i];
// arr1[i] = arr1[j];
// arr1[j] = tem;
// }
// for ( i = 0; i<arr1.length ; i++ ) {
// System.out.print(arr1[i] + " ");
// }
// 老师的思路
// 一共交换3次
// 每次交换时,对应的下标是 arr1[i] 和 arr1[arr1.length - 1 - i];
for ( i = 0; i< arr1.length/2; i++) {
int temp = arr1[arr1.length-1-i];
arr1[arr1.length-1-i] = arr1[i];
arr1[i] = temp;
}
for ( i = 0; i<arr1.length ; i++ ) {
System.out.print(arr1[i] + " ");
}
}
}
方法二:用另外一个数组来接受
int arr1[] = {10,20,30};
int arr2[] = new int [arr1.length];
for (int i = 0; i<arr1.length ; i++) {
arr2[i] = arr1[i];
}
for (int i = 0; i<arr2.length ; i++ ) {
System.out.println(arr2[i]);
}
5.数组的扩容
要求:实现动态的给数组添加元素效果,实现对数组扩容。ArrayAdd.java
- 原始数组使用静态分配 int[] arr = {1,2,3}
- 增加的元素 4,直接放在数组的最后 arr = {1,2,3,4} 3)
- 用户可以通过如下方法来决定是否继续添加,添加成功,是否继续?y/n ArrayAdd02.java
import java.util.Scanner;
public class ArrayAdd{
public static void main(String[] args){
Scanner myScanner = new Scanner(System.in);
char ch = ' ';
int arr[] = {1,2,3};
while(true){
//这个数组是用来接收arr数组的值,长度位arr.length+1,最后的一个下标用于
//存放新添加的元素
int arrNew[] = new int[arr.length+1];
System.out.println("请输入要添加的数字");
int n = myScanner.nextInt();
//把arr数组的元素copy到arrNew这个新的数组里面去
for (int i = 0; i <arr.length ; i++ ) {
arrNew[i] = arr[i];
}
//把新的值付给arrNew最后一个元素
arrNew[arrNew.length-1] = n;
//让arr指向arrNew,这时,arr原本指向的数组就没人引用了,会被销毁回收,
//arr的地址变成了arrNew的地址
arr = arrNew;
for (int i = 0 ; i <arr.length ; i++ ) {
System.out.print(arr[i]+" ");
}
System.out.println();
System.out.println("添加成功,是否继续添加(y/n)");
ch = myScanner.next().charAt(0);
if ( ch == 'n') {
break;
}
}
}
}
6.数组的排序
6.1内部排序
- 指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法、选择式排序法和插入式排序法
6.2外部排序
- 数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法。
6.3冒泡排序
package ArrayList_Practice;
public class BubbleSort {
public static void main(String[] args) {
// 冒泡排序
int a[] = {24,69,80,57,13};
int i,j,temp;
for(i = 0 ; i < a.length -1 ; i++) {
for( j = 0 ; j < a.length - i -1 ; j++) {
//在冒泡排序中第m趟循环比较n-m次
//目的:每一趟都两两比较,如果第一个数比第二个数大,就让他们互换位置
if(a[j]>a[j+1]) {
//交换位置
temp = a[j];
a[j+1] = a[j];
a[j] = temp;
}
}
}
//打印
for (int k = 0; k < a.length; k++) {
System.out.print(a[k]);
if(k!=a.length-1) {
System.out.print(",");
}
}
}
}
7.查找
7.1顺序查找
int a[] = { 24, 69, 80, 57, 13 };
int key = 99;
System.out.println("{24,69,80,57,13}");
System.out.println("查找80的位置");
int i;
// 顺序查找
System.out.println("顺序查找");
for (i = 0; i < a.length; i++) {
System.out.println("执行第" + i + "次");
if (a[i] == key) {
System.out.print("找到");
System.out.println(key + "在第" + i + "位置上");
break;
}
}
if(i == a.length-1) {
System.out.println("查找失败");
}
7.2二分查找
System.out.println("二分查找");
int low, height, mid, cnt;
low = 0;
cnt = 0;
height = a.length - 1;
while (low <= height) {
cnt++;
System.out.println("执行第" + cnt + "次");
mid = (low + height) / 2;
if (key == a[mid]) {
System.out.print("找到了,");
System.out.println(key + "在第二个" + mid + "位置上");
break;
} else if (key < a[mid]) {
height = mid - 1;
} else {
low = mid + 1;
}
}
if (low > height) {
System.out.println("查找失败");
}
完整代码:
package ArrayList_Practice;
public class BinSearch {
public static void main(String[] args) {
int a[] = { 24, 69, 80, 57, 13 };
int key = 99;
System.out.println("{24,69,80,57,13}");
System.out.println("查找80的位置");
int i;
// 顺序查找
System.out.println("顺序查找");
for (i = 0; i < a.length; i++) {
System.out.println("执行第" + i + "次");
if (a[i] == key) {
System.out.print("找到");
System.out.println(key + "在第" + i + "位置上");
break;
}
}
if(i == a.length-1) {
System.out.println("查找失败");
}
System.out.println("======================");
// 二分查找
System.out.println("二分查找");
int low, height, mid, cnt;
low = 0;
cnt = 0;
height = a.length - 1;
while (low <= height) {
cnt++;
System.out.println("执行第" + cnt + "次");
mid = (low + height) / 2;
if (key == a[mid]) {
System.out.print("找到了,");
System.out.println(key + "在第二个" + mid + "位置上");
break;
} else if (key < a[mid]) {
height = mid - 1;
} else {
low = mid + 1;
}
}
if (low > height) {
System.out.println("查找失败");
}
}
}