十六.数组的使用
-
数组是多个相同类型数据的组合,实现对这些数据的统一管理。
-
数组中的元素可以是任意数据类型,包括基本类型和引用类型,但是不能混合用
-
数组创建后,如果没有进行扶着,有默认值。
byte 0,short 0,int 0,long 0,float 0 ,double 0,char \u0000,boolean false,String null。
-
使用数组的步骤:使用数组并开辟空间,给数组的各个元素进行复制,使用数组
-
数组的下标从0开始的
-
数组的下标必须在指定范围内使用,否则就会数组越界。
-
数组属于引用类型,数组数据的对象是object。
import java.util.Scanner;
public class array {
public static void main(String[] args) {
//创建一个char类型的26个元素的数组,分别放置'A'-'Z'.使用for循环访问所有元素并打印出来。
char[] chars = new char[26];
for (int i = 0; i < chars.length; i++ ) {
chars[i] = (char)('A' + i);//这里由于'A' + i是int型,需要强制转换
}
System.out.println("chars数组如下:");
for (int i = 0 ; i < chars.length; i++) {
System.out.print(chars[i] + " ");
}
}
}
public class array02 {
public static void main(String[] args) {
//请求出一个数组int[]的最大值{4,-1,9,10,23},并得到相应的下标,并求出其平均值。
int[] arrays = {4, -1, 9, 10, 23};
int max = arrays[0];
int maxindex = 0;
int sum = 4;
double avg = 0;
for (int i = 1; i < arrays.length; i++ ) {
if (arrays[i] > max) {
max = arrays[i];
maxindex = i;
}
sum += arrays[i];
}
avg = sum / arrays.length;
System.out.println("该数组的最大值为:" + max);
System.out.println("其对应的下标为:" + maxindex);
System.out.println("其平均值为:" + avg);
}
}
数组的赋值机制
- 基本数据类型赋值,这个值就是具体的数据,而且是互不影响的。
- 数组在默认的情况下是引用传递的,赋的值是地址。
int[] arr1 = {1,2,3};
int[] arr2 = arr1;
arr2[0] = 10;
//赋值方式是引用赋值,arr2的变换会影响到arr1.
System.out.println("arr1的元素为:");
for (int i = 1; i < arrays.length; i++ ) {
System.out.println(arr1[i]);
}
一维数组的JVM内存布局
值传递 / 值拷贝和引用传递 / 地址拷贝的区别:
值传递的时候相当于值拷贝,将原先的数值拷贝的一份,与之前的数据互不影响。
数组指向的是一个地址,引用传递的时候指向的一个地址,在传递的时候只是将地址复制了一份。
int[] arr1 = {10.20.30};
int[] arr2 = new int[arr1.length];//arr2重新开辟了新的空间,与之前的地址互不影响
public class array03 {
public static void main(String[] args) {
//数组交换
int[] arrs = {11, 22, 33, 44, 55, 66};
int a = 0;
int len = arrs.length;
for (int i = 0; i < len / 2; i++) {
a = arrs[len - i - 1];
arrs[len - i - 1] = arrs[i];
arrs[i] = a;
}
System.out.println("数组倒序排列后的结果如下:");
for (int i = 0; i < arrs.length; i++) {
System.out.print(arrs[i] + " ");
}
}
}
public class array04 {
public static void main(String[] args) {
//数组的扩容
int[] arr = {1, 2, 3};
int[] arrNew = new int[arr.length + 1]; //定义一个新数组
for (int i = 0; i < arr.length ; i++ ) {
arrNew[i] = arr[i];
}
arrNew[arrNew.length - 1] = 4;
arr = arrNew;
System.out.println("数组扩容后的结果如下:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
import java.util.Scanner;
public class array05 {
public static void main(String[] args) {
//动态数组的扩容,每次在最后添加一个元素
Scanner lll = new Scanner(System.in);
int[] arr = {1, 2, 3};
do {
int[] arrNew = new int[arr.length + 1]; //定义一个新数组
for (int i = 0; i < arr.length ; i++ ) {
arrNew[i] = arr[i];
}
System.out.println("请输入您要添加的元素:");
int add1 = lll.nextInt();
arrNew[arrNew.length - 1] = add1;
arr = arrNew;
System.out.println("数组扩容后的结果如下:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println("");
System.out.println("您是否还要继续添加(y/n):");
char add2 = lll.next().charAt(0);
if ( add2 == 'n') {
break;
} else if (add2 == 'y') {
continue;
} else {
System.out.println("您输入的语法错误!!!");
break;
}
} while (true);
System.out.println("程序结束");
}
}
import java.util.Scanner;
public class array06 {
public static void main(String[] args) {
//数组的动态缩减
//有一个数组{1,2,3,4,5},可以将该数组进行缩减,提示用户能否继续进行缩减,每次缩减最后的元素,当只剩下最后的一个元素,提示,不能在进行缩减,
Scanner lll = new Scanner(System.in);
int[] arr = {1, 2, 3, 4, 5};
System.out.println("您最初的数组是{1,2,3,4,5}");
do {
System.out.println("您是否要继续缩减(y/n):");
char add2 = lll.next().charAt(0);
if ( add2 == 'n') {
break;
} else if (add2 == 'y') {
if (arr.length == 1) {
System.out.println("数组长度达到最小值,不能再进行缩减!!!");
break;
}
int[] arrNew = new int[arr.length - 1]; //定义一个新数组
for (int i = 0; i < arrNew.length ; i++ ) {
arrNew[i] = arr[i];
}
arr = arrNew;
System.out.println("数组缩减后的结果如下:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println("");
} else {
System.out.println("您输入的语法错误!!!");
break;
}
} while (true);
System.out.println("程序结束");
}
}
冒泡排序
原理:通俗的来讲就是两个两个重复多轮的进行比较,每执行一轮排序就能进行得到一个结果数。
特点:
- 每执行一轮排序就可以确定一个数的位置,比如第一轮排序确定最大的数,第二轮排序确定第二大的数。
- 当进行比较时,如果前面的数字大于后面的数字,就进行交换。
- 每一轮比较的次数都在减少。有n个数据,第一轮排序需要排n-1,第二轮排序需要排n-2次。以此类推。
public class bubble_order {
public static void main(String[] args) {
//冒泡排序(从大到小排列)
int[] arr = {24, 69, 80, 57, 13};
int aaa = 0;
for (int i = 0 ; i < arr.length - 1 ; i++ ) {
for (int j = 0; j < arr.length - 1 - i ; j++) {
if (arr[j] > arr[j + 1]) {
aaa = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = aaa;
}
}
}
System.out.println("冒泡排序后的结果为:");
for (int k = 0; k < arr.length; k++) {
System.out.print(arr[k] + " ");
}
}
}
public class bubble_order2 {
public static void main(String[] args) {
//冒泡排序(从小到大排列)
int[] arr = {24, 69, 80, 57, 13};
int aaa = 0;
for (int i = 0 ; i < arr.length - 1 ; i++ ) {
for (int j = 0; j < arr.length - 1 - i ; j++) {
if (arr[j] < arr[j + 1]) {//这里改个符号即可从小到大进行排列
aaa = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = aaa;
}
}
}
System.out.println("冒泡排序后的结果为:");
for (int k = 0; k < arr.length; k++) {
System.out.print(arr[k] + " ");
}
}
}
查找
import java.util.Scanner;
public class inquire {
public static void main(String[] args) {
//查找
String[] names = {"狗子", "猴子", "胖子", "瘦子", "绝绝子"};
Scanner lll = new Scanner(System.in);
System.out.println("请输入您要查询的名字");
String findName = lll.next();
int tag = 0;//设置标记
for (int i = 0; i < names.length ; i++ ) {
if (findName.equals(names[i])) {
System.out.println("恭喜找到:" + findName);
System.out.println("下标为:" + i);
tag = 1;
break;
}
}
if (tag == 0) {
System.out.println("对不起,没有找到名字:" + findName);
}
}
}
二维数组
import java.util.Scanner;
public class array07 {
public static void main(String[] args) {
//输出一个二维数组
int[][] arr = {
{1, 2, 3, 4, 5, 6},
{1, 2, 3, 4, 5},
{1, 2, 3, 4},
{1, 2, 3}
};
System.out.println("输出的二维数组的结果如下:");
for (int i = 0; i < arr.length ; i++) {
for (int j = 0; j < arr[i].length ; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println(" ");
}
}
}
import java.util.Scanner;
public class array08 {
public static void main(String[] args) {
//二维数组的使用,动态数组赋值并输出
Scanner lll = new Scanner(System.in);
int arr[][];//声明二维数组
arr = new int[2][3];//开辟数组空间,2行3列的二维数组。
for (int i = 0; i < arr.length ; i++ ) {
System.out.println("现在输入数组的第" + i + "行数据");
for (int j = 0; j < arr[i].length ; j++ ) {
System.out.println("输入第" + j + "列数据");
int a = lll.nextInt();
arr[i][j] = a;
}
}
System.out.println("您输入的数组的结果如下:");
for (int h = 0; h < arr.length ; h++ ) {
for (int k = 0; k < arr[h].length ; k++ ) {
System.out.print(arr[h][k] + " ");
}
System.out.println(" ");
}
}
}
import java.util.Scanner;
public class array09 {
public static void main(String[] args) {
//二维数组的使用,输出二维数组的第一行为1,第二行为两个2,第三行为3个3,以此类推。
Scanner lll = new Scanner(System.in);
System.out.println("您要输出几行:");
int i = lll.nextInt();
int[][] arr = new int[i][];
for (int j = 0; j < arr.length ; j++ ) {
arr[j] = new int[j + 1];//第0层有1个空间,第1层有两个空间。
for (int k = 0; k < arr[j].length ; k++ ) {
arr[j][k] = j + 1;//第一层的j等于0,所以要想每层都是对应层数的话,就需要进行加1
}
}
System.out.println("您输入的数组的结果如下:");
for (int m = 0; m < arr.length ; m++ ) {
for (int n = 0; n < arr[m].length ; n++ ) {
System.out.print(arr[m][n] + " ");
}
System.out.println(" ");
}
}
}
import java.util.Scanner;
public class array10 {
public static void main(String[] args) {
//二维数组的使用,动态数组赋值并输出
Scanner lll = new Scanner(System.in);
int arr[][];//声明二维数组
arr = new int[3][3];//开辟数组空间,3行3列的二维数组
for (int i = 0; i < arr.length ; i++ ) {
System.out.println("现在输入数组的第" + i + "行数据");
for (int j = 0; j < arr[i].length ; j++ ) {
System.out.println("输入第" + j + "列数据");
int a = lll.nextInt();
arr[i][j] = a;
}
}
int sum = 0;
System.out.println("您输入的数组的结果如下:");
for (int h = 0; h < arr.length ; h++ ) {
for (int k = 0; k < arr[h].length ; k++ ) {
System.out.print(arr[h][k] + " ");
sum += arr[h][k];
}
System.out.println(" ");
}
System.out.println("您输入的数据总和为:" + sum);
}
}
import java.util.Scanner;
public class YangHui {
public static void main(String[] args) {
//打印杨辉三角
Scanner lll = new Scanner(System.in);
System.out.println("您要输出几层杨辉三角:");
int a = lll.nextInt();
int[][] yanghui = new int[a][];
for (int i = 0 ; i < yanghui.length ; i++) {
yanghui[i] = new int[i + 1]; //开辟新的空间。
for (int j = 0 ; j < yanghui[i].length ; j++ ) {
if (j == 0 || j == yanghui[i].length - 1) {
yanghui[i][j] = 1;
} else {
yanghui[i][j] = yanghui[i - 1][j - 1] + yanghui[i - 1][j];
}
}
}
System.out.println("输出结果如下:");
for (int k = 0; k < yanghui.length ; k++ ) {
for (int l = 0 ; l < yanghui[k].length ; l++) {
System.out.print(yanghui[k][l] + " ");
}
System.out.println(" ");
}
}
}
import java.util.Scanner;
public class array11 {
public static void main(String[] args) {
//已知有一个升序的数组,要求插入一个元素,该数组的顺序依然是升序的,比如{10,12,45,90},添加23后,数组为{10,12,23,45,90}
Scanner lll = new Scanner(System.in);
System.out.println("请先输入原始数组有几个数字(输入数字即可):");
int a = lll.nextInt();
int[] arr = new int[a];
int pt = 0;
for (int i = 0 ; i < arr.length ; i++ ) {
System.out.println("请输入第" + (i + 1) + "个数");
arr[i] = lll.nextInt();
}
System.out.println("您输出数组的结果如下:");
for (int j = 0; j < arr.length ; j++ ) {
System.out.print(arr[j] + " ");
}
System.out.println(" ");
//这里如果要对初始化的数组进行怕排序,可以使用冒泡排序进行。
System.out.println("请输入您要插入的元素");
int insert_element = lll.nextInt();
int index = 0;
for (int m = 0; m < arr.length; m++ ) {
if (insert_element < arr[m]) {
index = m;
break;
}else{
index = arr.length;
}
}
int[] b = new int[arr.length + 1];
for (int n = 0; n < b.length ; n++) {
if (n == index) {
b[n] = insert_element;
} else if (n > index) {
b[n] = arr[n - 1];
} else if (n < index) {
b[n] = arr[n];
}
}
for (int k = 0; k < b.length ; k++) {
System.out.print(b[k] + " ");
}
}
}
public class array12 {
public static void main(String[] args) {
//随机生成10个整数(1-100),保存到数组,并倒序打印以及求平均值,求最大值和最小值的下标,并查找里面是否含有8.
int[] arr = new int[10];
for (int i = 0; i < arr.length ; i++) {
arr[i] = (int)(Math.random() * 100) + 1;
}
int sum = 0;
int tag = 0;
System.out.println("数组的正序输出如下:");
for (int m = 0; m < arr.length ; m++ ) {
System.out.print(arr[m] + "\t");
}
System.out.println(" ");
System.out.println("数组的倒序输出如下:");
for (int j = arr.length - 1; j >= 0 ; j--) {
if (arr[j] == 8) {
tag = 1;//若含有8的话,则置为1;
}
sum += arr[j];
System.out.print(arr[j] + "\t");//"\t"相当与空4个空格,一个tab键。
}
System.out.println(" ");
System.out.println("平均值为:" + (int)(sum / arr.length));
int max = arr[0];
int min = arr[0];
int max_sub = 0;//最大值的下标
int min_sub = 0;//最小值的下标
for (int k = 0; k < arr.length ; k++) {
if (arr[k] > max) {
max_sub = k;
max = arr[k];
}
if (arr[k] < min) {
min_sub = k;
min = arr[k];
}
}
if (tag == 1) {
System.out.println("是否含有8:" + "True");
} else {
System.out.println("是否含有8:" + "False");
}
System.out.println("最大值下标为:" + max_sub);
System.out.println("最小值下标为:" + min_sub);
}
}
二维数组的JVM内存布局
二维数组的使用细节
一维数组的声明方式有:int[ ] x 或者 int x[ ];
二维数组的声明方式有:int[][] y 或者int[] y[] 或者 int y[][]
二维数组实际上是由多个一维数组组成的,它的每个一维数组的长度可以相同也可以不相同。
比如:arr[][] = {{1,2},{1,2,3,4}}
布尔类型的数值未赋值之前默认为false。