java数组

1:了解什么是数组,什么是数组对象

(1)数组的概述:
数组是一组数据的集合,数组中的每个数据被称为元素。在java中,数组也是对象。数组中的元素可以是任意类型(基本类型和引用类)但同一个数组里只能存放类型相同的元素。
(2)数组对象:
数组类型的变量、类类型的变量、接口类型的变量都属于引用类型的变量,这些变量都是可以指向其相应的对象的,那么数组类型的变量指向的就是数组对象。例如:

Student stu = new Student();
	String[] args = new String[5];

之前我们接触到的第一个数组类型变量,main方法的参数
public static void main(String[] args){
// args----->数组对象(jvm 创建 并传递过来)
}

其中 String[] 就是一个数组类型,args就是这个数组类型的变量,它所指向的数组对象中只能存放String类型的数据。
注:main方法是由JVM负责调用,那么args所指向的数组对象也是由JVM负责创建并传过来.

2.声明数组类型变量

(1)数组类型:
8种基本数据类型(float double byte short int long char boolean)和3种引用类型(类类型 接口类型 数组类型),使用这些都可以声明出数组类型,即:任意类型都可以声明成数组类型,只需要加"[]"即可。
例如:
基本类型的数组:
byte[] short[] int[] long[] float[] double[] char[] boolean[]
引用类型的数组:

//使用类声明出的数组
		Student[]
		//使用接口声明出的数组
		Action[]
		//使用数组声明出的数组
		int[]

注意:使用X类型声明出的数组,那么将来该数组中就只能存放X类型的数据
(2)数组类型变量:
有俩种形式可以声明数组变量,推荐使用第一种。

int[] a;
	或者
	int a[]; 

	int[] a = new int[4]
	int a[] = {4,5,7}
	int a[] = new int[]{4,5,7}
	
	例如:
	String[] str;
	Student[] students;
	long[] l;

注意:数组类型变量将来是要指向对象的。

(3)创建数组对象:
创建对象需要了解数组对象的长度:
数组的长度是指一个数组对象中可以存放多少个数据(元素),每一个数组对象在被创建的时候,就需要指明其长度是多少,并且该长度一确定的就不能再做修改。
数组对象的创建:

创建数组对象使用new关键字即可。
	例如:
	int[] a = new int[4];
	String[] str = new String[1];
	//表示该数组对象中一个数据都存放不了
	char[] c = new  char[0];
	
	//编译报错,因为创建数组对象的时候不知道其长度
	long[] v = new long[];

获得数组对象的长度:
使用数组对象访问其length属性即可获得该数组的长度
例如:

int[] a = new int[4];
	System.out.println(a.length);//4
	注意:对象创建后,数组的长度是不能改变的。
	例如:
	//编译报错
	int[] a = new int[4];
	a.length = 8;

	//编译通过
	//但是这只是又新建了一个数组对象
	//而不是改变原来数组对象的长度
	int[] a = new int[4];
	a = new int[8];

(4)数组对象的初始化及使用

  • 数组对象中每个元素位置上的默认值
数组对象中的默认值和其要保存的数据类型有关
 例如:
 	int[] a = new int[4];
 	在我们存放数据之前,这四个元素位置上就以及有了默认值了
  • 以下为各种类型在创建数组时的默认值:
整型数组的默认值是		0
 	浮点型数组的默认值是	0.0
 	布尔类型数组的默认值是	false
 	字符类型数组的默认值是	0
 	引用类型数组的默认值是	null
  • 数组对象中的元素位置的下标
    由于数组对象在堆区中是一块连续的内存空间,那么我们可以通过连续的下标,找到每一个可以存放数据的元素位置。
    注:下标是从0开始的
    例如:
    //通过下标0 1 2 3可以访问到数组对象中四个元素位置的值
    //整型的默认值是 0
    int[] a = new int[4];
    System.out.println(a[0]);//0
    System.out.println(a[1]);//0
    System.out.println(a[2]);//0
    System.out.println(a[3]);//0
    //布尔的默认值是 false
    boolean[] a = new boolean[4];
    System.out.println(a[0]);//false
    System.out.println(a[1]);//false
    System.out.println(a[2]);//false
    System.out.println(a[3]);//false
    总结:如果一个数组对象的长度是n,那么这个数组下标的值是[0,n-1],其中n必须大于0
  • 使用数组的下标赋值
String[] str = new String[3];
 //赋值前:使用循环输出数组中的元素
 for(int i=0;i<str.length;i++){
 	System.out.println(str[i]);
 }
 str[0] = "hello";
 str[1] = "world";
 str[2] = "test";

 //赋值后:使用循环输出数组中的元素
 for(int i=0;i<str.length;i++){
 	System.out.println(str[i]);
 }

- 特殊形式

//编译通过
	int[] a1 = new int[]{1,3,5,7,9};
	System.out.println(a1.length);//5
	//编译通过
	int[] a2 = {2,4,6,8};
	System.out.println(a2.length);//4
	
	//编译通过
	int[] a4;
	a4 = new int[]{1,2,3};
	System.out.println(a4.length);//3
	
	/*下面俩种情况是错误的创建方式*/

	//编译报错
	int[] a3 = new int[3]{1,2,3};
	
	//编译报错
	int[] a4;
	a4 = {1,2,3};
  • 数组下标越界
    对于一个长度为n的数组对象,它的的下标取值范围是[0,n-1],这里的0和n-1就是这个数组对象的下标边界,使用下标的过程中不能超出这个边界。如果超出那么就会运行报错.
    例如:
    int[] a = new int[4];
    a[4] = 10;

运行后结果:
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 4
at com.briup.test.ArrayTest.main(ArrayTest.java:7)
(5)数组使用例子
当我们了解了上面的数组的基础点后,我们就可以使用一些小列子来加强我们对数组的理解了

  • 求一组值的平均值(int[]a={3,4,7,9,1,2}):
public double getAvg(int[] a){
			double sum = 0;
			for(int i=0;i<a.length;i++){
				sum+=a[i];
			}
			return sum/a.length;
		}
  • 求一组值的最大值(int[]a={3,4,7,9,1,2})
public int getMax(int[] a){
			int max = a[0];//int max = 0
			for(int i=1;i<a.length;i++){
				if(a[i]>max){
					max = a[i];
				}
			}
			return max;
		}
  • 冒泡排序
    原理:相邻的俩个元素比较,让值较大的数据逐渐向数组的底部(即朝最后一个元素)移动。即比较两个相邻的元素,将值大的元素交换到右边。
    简单记忆:一比二,二比三,大的在右边,每趟出一个最大的,两个for ,趟数length-1,比较次数length-1-趟数
public void sort(int[] a) {
          for(int i=0;i<a.length-1;i++) {
            for(int j=0;j<a.length-i-1;j++) {
              if(a[j]>a[j+1]) {
                int temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
              }
            }
          }
        }
  • 从众多手机号码中抽取一个获奖手机号码和四位数验证嘛的实现(附上完整代码)
public class Telephone {
    public static void main(String[] args) {
        //随机电话号码
        String arr[] = {"12345678876","123456765432","16784596545","12457896541","12347895475"};
        //随机数[0,1)    Math.random();
        int index=(int)(Math.random()*arr.length);
        System.out.println("索引值:"+index);
        System.out.println("随机的电话号码:"+arr[index]);

        //随机四位数
        String s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        //将字符串转化为字符型数组
        char[] c=s.toCharArray();
        //4个随机数
        int index1=(int)(Math.random()*c.length);
        int index2=(int)(Math.random()*c.length);
        int index3=(int)(Math.random()*c.length);
        int index4=(int)(Math.random()*c.length);
        System.out.println(""+c[index1]+c[index2]+c[index3]+c[index4]);

    }
}