java_数组_学会数组从本文开始

  • Post author:
  • Post category:java


import java.util.Scanner;
public class Change{
	public static void main(String[] args){
		/*
		1-100以内的求和,求出当和大于20时候的那个数。
		 */ 
		double[] hens = {1.5, 5.6, 56, 30, 60};
		double sum = 0;
		double average;
		// 遍历数组中的元素。
		// java中的元素是从0开始的。
		for (int i = 0;i <= 4 ;i++ ) {
			System.out.println(hens[i]);
			sum += hens[i];
		}
			average = sum / 5;
			System.out.println("最终的平均数:" + average);
	}
}

(1)了解数组的定义(也有好多种数据类型,具体选那种数据类型需要最开始定义);怎么样遍历数组,用for循环,怎么取出数组中的每一个数。

怎么打印数组中的数。

(2)数组中的数序号是从0开始的;

(3)第几个数是(i+1);

(4)打印第几个元素的值:

System.out.println("第"+ (i+1)+ "元素的值=" + hens[i]);

在java 中可以根据


数组名.length,这一点很重要哦。

数组的使用

1、动态初始化

数组的定义

数据类型[] 数组名   = new  数据类型[大小]

int[] hens = new int[50];      创建了一个数组,名字为a,存放5个int。

你要使用数组的第





个元素:a

[2]

在没有放值的时候,数据内的元素默认是0.

import java.util.Scanner;
public class Change{
	public static void main(String[] args){
		/*
		键盘输入5个double类型,保存在设置的数组中。
		大小就是大小。获取数组的长度你会吗?
		 */ 
		double[] score = new double[5];
		Scanner myScanner = new Scanner(System.in);

		// 遍历数组中的元素。
		// java中的元素是从0开始的。
		for (int i = 0;i < score.length ;i++ ) {
			System.out.println("请输入第" + (i+1) + "个同学的分数");
			score[i] = myScanner.nextDouble();
		}
			
			System.out.println("输入完毕" );
			System.out.println("接着遍历数组" );

		for (int i = 0;i < score.length ;i++ ) {
			System.out.println("第" + (i+1) + "个数组的值" + score[i]);
		}	

	}
}

2、动态初始化          数组就是[]

(1)先声明数组:    数据类型[] 数组名;

int[ ]

score;   score是null。

(2)创建数组  :     数组名 =


new


数据类型[大小];

score

= int [50];

         double[] score;
		score = new double[5];

可以一步,也可以两步。这样也有使用场景。

3、静态初始化



int[] score = {1,2,3};   一般知道具体的值的时候采用这个。且个数较小。

这种用法相当于:



int[] score = new int[3] ;

score[0] = 1;  score[1] = 2;…




注意事项







1、数组是多个

相同数据

类型的集合;

2、数组中的元素可以是任何数据类型,包括基本数据类型和引用类型,但是

不能混用,包括String

String[] ch = {“我爱你”,”aini”};

3、数组创建后,若没有使用是有默认值的。

4、怎么使用呢,三种方法。



int[] hens = new int[50];   这个过程可以分成两步。还有一种是直接赋值的。

5、

数组的下表是从0开始的。

6、数组下表必须在制定的范围内使用,否则报:下表越界异常,比如


int[] score = new int[5],这个数组的有效下标是0-4.   < score.length


下标很重要!!!数组的下表最大值是长度减一。最小是0。


7、数组是属于引用类型的,数组型的数据本质上是对象(object)




数组应用案例


1

symbol[i] = (char)('A' + i) 

这一点一定要注意哈。需要一个强转的。

import java.util.Scanner;
public class Change{
	public static void main(String[] args){
		/*
		键盘输入5个double类型,保存在设置的数组中。
		大小就是大小。获取数组的长度你会吗?
		 */ 
		char[] symbol = new char[26];
	
		for (int i = 0;i < symbol.length ;i++ ) {
				symbol[i] = (char)('A' + i) ;//问题就出现在这。
		}	
		for (int i = 0;i < symbol.length ;i++ ) {
				
			System.out.println("第" + (i+1) + "个数组的值" + symbol[i]);

		}	

	}
}

数组:Array

求一个数组中数的最大值。

import java.util.Scanner;
public class Change{
	public static void main(String[] args){
		/*
		找到数组中的最大值。
		1、假定max = array[0],maxIndex = 0.
		2、从下标1 开始遍历,如果max < 当前数。将当前数赋值给max,maxIndex = i(当前的i)。
		3、自己和自己比较是没什么意义的,因此从第一个开始比较。也就是一个遍历、赋值比较。
		 */ 
		int i;
		int[] num = {4,-1,9,999,23,25,80,1000,8928};
		int maxnum = num[0];
		// System.out.println("此时的下标是 :" + maxnum);
		int maxIndex = 0;
		for (i = 1;i < num.length ;i++) {
			if ( num[i] > maxnum) {
				maxnum= num[i];
				maxIndex = i;
			}
			
		}

			System.out.println("最大的值是 :" + maxnum);
			System.out.println("此时的下标是 :" + maxIndex);
}
		

	}


数组赋值机制:

数组在默认的情况下是


引用传递


,赋的值是地址。


重要

看上面的代码,将arr1的值赋值给arr2,赋的值是


地址




地址的重新指向。

此时arr2的值变化会影响到arr1的值。

栈   堆  方法区

把这个图记住。


地址的指向正这看。

记住这就话:

在内存里面只要分配了一个空间,一定会对应一个地址。



也就是两个共用一个地址空间。数组元素放在堆。


自我胡说八道:地址就像祖籍,这个东西是一生下来就固定的,基本上看你的爸爸爷爷辈,而户口是后天可以改变的,若你以后再上海北京有了户口(原来是祖籍的户口),无论你走到哪里,祖籍永远是哪个不变的。

遍历数组1,并且将值赋值给arr2.

import java.util.Scanner;
public class Change{
	public static void main(String[] args){
		/*
		
		 */ 
		int[] arr1 = {10,20,30};
		//创建一个行的数组arr2,开辟新的数据空间。
		//大小  arr1.length
		int[] arr2 = new int[arr1.length];
		// 这条语句的作用是重新开辟一个空间。
		// arr2 = {10,20,30};//再次赋值
		for (int i = 0;i < arr1.length ; i++) {
			arr2[i] = arr1[i]; 
 		}
			for (int i = 0;i < arr2.length ; i++) {
				System.out.println("第 "+(i + 1)+"数组的值是;" + arr2[i]);
			}

     }
}

再次赋值就不会出现覆盖的情况了。

import java.util.Scanner;
public class Change{
	public static void main(String[] args){
		/*
		
		 */ 
		int[] arr1 = {10,20,30};
		//创建一个行的数组arr2,开辟新的数据空间。
		//大小  arr1.length
		int[] arr2 = new int[arr1.length];
		// 这条语句的作用是重新开辟一个空间。
		// arr2 = {10,20,30};//再次赋值
		for (int i = 0;i < arr1.length ; i++) {
			arr2[i] = arr1[i]; 
 		}
 		arr2[0] = 25;
			for (int i = 0;i < arr2.length ; i++) {
				System.out.println("第 "+(i + 1)+"数组2的值是;" + arr2[i]);
			}
			for (int i = 0;i < arr2.length ; i++) {
				System.out.println("第 "+(i + 1)+"数组1的值是;" + arr1[i]);
			}

     }
}


数组反转


{22,112,56}  —————————————————————————》{56,112,22}



将数组反转的几种方法:



第一种方法:重新定义一个新的数组。不是逆序遍历,是正顺序的遍历,将其赋值给数组2的最后一个地址。

import java.util.Scanner;
public class Change{
	public static void main(String[] args){
		/*
		
		 */ 
		int[] arr1 = {10,20,30};
		//创建一个行的数组arr2,开辟新的数据空间。
		//大小  arr1.length
		int[] arr2 = new int[arr1.length];
		int j = 2;
		// 这条语句的作用是重新开辟一个空间。
		// arr2 = {10,20,30};//再次赋值
		for (int i = 0;i < arr1.length ; i++) {
		
			arr2[j] = arr1[i]; 
			j--;
 		}
 		
			for (int i = 0;i < arr2.length ; i++) {
				System.out.println("第 "+(i + 1)+"的值是;" + arr2[i]);
			}

     }
}

int[] hens = new int[arr.length]

这样的方法很无聊。本质是上是创建了一个新的数组,也就是新的地址,将原来数组中的值重新赋值给新的地址。

import java.util.Scanner;
public class Change{
	public static void main(String[] args){
		/*
		1、将数组的第一个和最后一个交换顺序。将第二个和倒数第二个进行交换。
		2、依次进行,可以按照奇偶进行变换啊。本来我想的是要考虑奇偶,但是7 / 2 = 3
		6 / 2 = 3,也就是说:要是偶数的话,也是交换这么多次。奇数时,中间的那个数就不交换
		3、 0和5,交换;1和4交换。2和3交换。他们的和都是5(arr1.length-1),而对应的另外一个数就是
		arr1.length-1-i;就是要去找规律。
		4、最主要的是要先定义一个临时变量。
		5、优化,
		 */ 
		int[] arr1 = {10,20,30,40,50,60,70};
		int temp;
		for (int i = 0;i < arr1.length / 2 ; i++) {
			temp = arr1[arr1.length - 1 - i];
			arr1[arr1.length-1-i] = arr1[i]; 
			arr1[i] = temp;		
 		}
		
		for (int i = 0;i < arr1.length ; i++) {

			System.out.println("第 "+(i + 1)+"的值是;" + arr1[i]);
		}
    }
}




数组的添加



1、就是加上添加数据;这是转接的是地址,不能想赋值那样,地址空间时固定的。



这样就是另外一个数组啦。将数组之前的值遍历出来赋值给新的数组。



我的代码;

import java.util.Scanner;
public class Change{
	public static void main(String[] args){
	int[] arr1 = {1,2,3};
	int[] arr = new int[4];
	// arr = arr1;这是地址的指向,那样的话,后面的语句就会越界,
	arr[3] = 4;
	for (int i = 0;i < arr1.length ;i++ ) {
		arr[i] = arr1[i];
	}
	for (int i = 0;i < arr.length  ;i++ ) {
		System.out.println("最后的结果:  " + arr[i]);
	}
//其实还可以先死后活。继续增加变量。
    }
}

改进后的:

import java.util.Scanner;
public class Change{
	public static void main(String[] args){
	int[] arr = {1,2,3};
	int[] arrNew = new int[4];
	// arr = arr1;
	arrNew[3] = 4;
	for (int i = 0;i < arr.length ;i++ ) {
		arrNew[i] = arr[i];
	}
	arr = arrNew;//将arr的地址指向arrNew的地址空间,这样的话,数组还是那个数组,他的值变化喽。
	for (int i = 0;i < arr.length  ;i++ ) {
		System.out.println("最后的结果:  " + arr[i]);
	}

    }
}

do {

}while(true);  配合break使用。

接收字符:

char key = myScanner.next().charAt(0);括号别忘记了。




arr = arrNew;//将arr的地址指向arrNew的地址空间,这样的话,数组还是那个数组,他的值变化喽。(睁着看)原先的空间就被jvm销毁,这样的话节省空间哦!



下面的代码是缩减数组的值的,有缺陷,暂不改进,保留最后一个数值。

import java.util.Scanner;
public class Change{
	public static void main(String[] args){
	// 创建一个Scanner可以接受用户输入
	// 因为用户什么时候退出不确定。
	Scanner myScanner = new Scanner(System.in);
	int[] arr = {1,2,3,4,5};
	int count = arr.length;
	do{
	System.out.println("请问你要缩减数组的值吗 y/n ");
	char key = myScanner.next().charAt(0);//先要输入吗?然后在接收一个
	
	if (key == 'n') {
		break;
	}else{
		count--;

		if (count == 1) {
				System.out.println("不能在减少了");
				System.out.println("最后一个数组的值 = " + arr[0]);

			break;
		}
		int[] arrNew = new int[arr.length - 1];
	// arrNew[arrNew.length - 1] = num;
		for (int i = 0;i < arr.length - 1;i++ ) {
			arrNew[i] = arr[i];
		}
			arr = arrNew;//将arr的地址指向arrNew的地址空间,这样的话,数组还是那个数组,他的值变化喽。
			for (int i = 0;i < arr.length  ;i++ ) {
				System.out.println("最后的结果:  " + arr[i]);
			}

         }  
		}while(true);


    }
}

完结撒花!!



版权声明:本文为chenchw原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。