java—数组【学习笔记】

数组概述

数组概述

数组的定义方式

二维数组

常用数组操作(基础)

     数组遍历

     数组排序

     数组查询

     数组扩容 

Arrays数组工具类

    常见操作:


   什么是数组

  • 数组:对于每一门编程语言来说都是重要的数据结构之一,在Java 中提供的数组是用来存储固定大小的同类型元素。

    原因 

  •  原因:要知道,运行程序往往需要大量的数据,尤其是表达相同的一些数据。比如你输入的100名学生的成绩,我们要用它进行计算。我们不可能声明100个变量来存储这些数据,所以我们需要数据结构来存储一个元素个数固 定且元素类型下相同的有序集。

   本质 

  •  本质:是一系列空间大小相等且地址连续的一片存储空间。                                           空间大小相等是为了方便维护数据,我们必须统一数据类型;                                         地址连续且大小相等:方便计算后续元素的具体物理内存地址。

    注释

  •  数组是一种引用数据类型,数据引用变量只是一个引用。
  • 数组元素和数组变量在内存里是分开存放的,实际的数组元素被存储在堆(heap)内存中,存在堆内存的数据称为对象。
  • 数组引用变量是一个引用类型的变量,被存储在栈(stack)内存中
  • 创建数组时,必须明确大小和内容。
  • 数组一旦定义下来,其长度不可改变;数组中有几个地址?就看数组有几个元素空间(数组 的长度)。
  • 数组提供角标来访问数组里的元素。

数组的定义方式

   创建数组只指定长度但不指定内容

   数据类型 [ ] 数组名 = new 数据类型 [长度]

    创建数组指定内容(同时长度就确定了)

   数据类型[ ] 数组名 = new 数据类型[]{数据1, 数据2, 数据3, ..., 数据n};

   数据类型[ ] 数组名 ={数据1, 数据2, 数据3, ..., 数据n};

示例1: 输入10个同学的成绩 求出成绩最高者 ,成绩最低者,以及平均值。 

public class TestEclipse {
  public static void main(String[] args) {
	  Scanner sc = new Scanner(System.in);
	  double [] score = new double[10];
	  double sum = 0;
	  double max = 0,min=100;
	  for(int i=0;i<10;i++) {
		  System.out.println("请输入第"+(i+1)+"位同学的java 成绩");
		  score[i] = sc.nextDouble();
	      sum+=score[i];
	     if(score[i]>max) {
	    	 max=score[i];
	     }else if(score[i]<min) {
	    	 min=score[i];
	     }
	  }
	  sc.close();
	  System.out.println("成绩最高: "+max);
	  System.out.println("成绩最低: "+min);
	  System.out.println("平均值: "+sum/10);
  }

二维数组

     就是一个由行和列组成的一个表格而已,矩阵Matrix。 在这个矩阵中访问元素的话,是根据元素的行角标和列角标所确定的。

     定义方式 

     直接为每一维分配空间,格式如下:

     数据类型 [ ] [ ]  数组名 = new 数据类型 [数据行长度] [数据列长度];

     int a[ ] [ ]= new int[2][3];

           示例1:

int[][] arr = new int[2][3];
for (int i = 0; i < arr.length; i++) {
	for (int j = 0; j < arr[i].length; j++) {
		arr[i][j] = j;
		System.out.print(arr[i][j] + " ");
	}
	System.out.println("");
}

          示例2: leetcode 62 路径规划问题

   public static void main(String[] args) {
	   System.out.println("请输入你想生成的棋盘的长和宽:");
	   Scanner sc = new Scanner(System.in);
	   int x = sc.nextInt();
	   int y = sc.nextInt();
	   int [][] arr=new int[x][y];
	   bulid(arr,x,y);
	   way1(x,y);
	   System.out.println("总共有:"+ way1(x,y)+"种方法");
   }

   private static void bulid(int[][] arr, int x ,int y) {
	  for (int i = 0; i < x; i++) {
	     for (int j = 0; j < y; j++) {
	    	System.out.print("0 ");
		 }	
	        System.out.println("");
	  }
    }

   private static int way(int x, int y) {
	    int z = x+y-2;
	    int sum = 1;
	    for (int i = z; i >y-1; i--) {
		     sum*=i;
	    }
	    for (int i = 1; i <x; i++) {
			 sum=sum/i;
	    }
	    return sum;
    }// 高中数学知识,但有溢出的风险
   
   public static int way1(int m, int n) {
       int[][] result=new int[m][n];
       for(int i=0;i<m;i++) {
          for(int j=0;j<n;j++) {
              if(i==0||j==0) {
                  result[i][j]=1;
              }else {
                  result[i][j]=result[i-1][j]+result[i][j-1];
              }
           }
        }
      return result[m-1][n-1];
  }
    // 动态规划是最优解

常用数组操作(基础)

    数组遍历

public class Array1 {
   public static void main(String[] args) {
      int[] arr = new int[] { 7, 2, 3, 5, 9, 6 };
      for (int i = 0; i < arr.length; i++) {
        System.out.println(arr[i]);
      }
      for (int i : arr) {
        System.out.println(i);
      }
   }
}

     数组排序

 常见数组排序 : 冒泡排序 ,选择排序 ,插入排序。 

package com.openlab.day08.array;
import java.util.*;
  public class TestZ2 {
      public static void main(String[] args) {
    	  int [] sc = new int [10];
    	  int [] score = {100,99,46,66,75,89,76,87,69,88};
    	  sort1(score);
    	  for (int i : score) {
		  System.out.print(i+",");
		}
      }

	public static void sort2(int[] score) {
		for ( int i = 0; i < score.length-1; i++) {
			int min =i;
			for (int j = i+1; j < score.length; j++) {
				if (score[j]<score[min]) {
					min=j;
				}
			}
			if (min!=i) {
			    swap(score,i,min);	
			}
		}
		
	}  // 选择排序

	public static void sort1(int[] score) {
		for (int i = 1; i < score.length; i++) {
			for (int j = i; j >0&&score[j]<score[j-1]; j--) {
				swap(score,j,j-1);
			}
		}
		
	}// 插入排序;

	public static void sort(int[] score) {
		for (int i = 0; i < score.length-1; i++) {
			for (int j = 0; j < score.length-1-i; j++) {
				if (score[j]>score[j+1]) {
					swap(score, j, j+1);
				}
			}
		}
		
	}//   冒泡排序

	public static void swap(int[]arr,int i, int j) {
		arr[i] = arr[i] + arr[j];
		arr[j] = arr[i] - arr[j];
		arr[i] = arr[i] - arr[j];
	}
 }

     数组查询

public class TestZ4 {
	public static void main(String[] args) {
		  linearSearch();
		  binarySearch();
	}
	
	private static void linearSearch() {
		int[] arr = { 6, 9, 1, 5, 2, 3, 8, 4, 7 };
		int key = 8;
		int index = -1;
		for (int i = 0; i < arr.length; i++) {
		  if (arr[i] == key) {
		      index = i;
		      break;
		   }
		}
		System.out.println(index);
	}//遍历查询
	
	private static void binarySearch() {
		int[] arr = { 6, 9, 1, 5, 2, 3, 8, 4, 7 };
		int key = 8;
		int min = 0;
		int max = arr.length - 1;
		int mid = (min + max) / 2;
	    while (arr[mid] != key) {
		  if (key < arr[mid]) {
		    max = mid - 1;
		  }
		  if (arr[mid] < key) {
		    min = mid + 1;
		  }
		  if (min > max) {
		    mid = -1;
		    break;
		  }
		    mid = (min + max) / 2;
		}
		   System.out.println(mid);
    }//二分查询
		
}

代码运行结果 : 6

                         6

     数组扩容 

public static void main(String[] args) {
     int[] arr = new int[] { 1, 2, 3, 4, 5, 6 };
     arr = arrayExpansion(arr, arr.length + 1);
}
 
   private static int[] arrayExpansion(int[] origin, int newLen) {
     int[] newArr = new int[newLen];
     for (int i = 0; i < origin.length; i++) {
        newArr[i] = origin[i];
     }
       return newArr;
   }

数组扩容,就是创建一个新的数组扩大它可存储的数据长度,将旧数组复制进去 

Arrays数组工具类

Arrays类是JDK提供的专门用于操作数组的工具类,位于java.util包中。

用Arrays类的方法操作数组,无需自己编码。

    常见操作:

  • static int binarySearch(int[] a, int key) :使用二分搜索法来搜索指定的 int 型数组,以获得指定 的值。
  • static int[] copyOf(int[] original, int newLength) :复制指定的数组,截取或用 0 填充(如有必 要),以使副本具有指定的长度。
  • static boolean equals(int[] a, int[] a2) :如果两个指定的 int 型数组彼此相等 ,则返回 true 。
  • static void sort(int[] a) :对指定的 int 型数组按数字升序进行排序。
  • static String toString(int[] a) :返回指定数组内容的字符串表示形式。 

1.   binarySearch(int[ ] a, int key)

import java.util.*;
public class TestF2 {
	    public static void main(String[] args) {
	        int a[] = new int[] {1, 3, 4, 6, 8, 9};
	        int x1 = Arrays.binarySearch(a, 4);
	        int x2 = Arrays.binarySearch(a, 9);
	        System.out.println( "x1:" + x1);
	        System.out.println( "x2:" + x2);
	    }
}

代码运行结果  : x1:2 

                            x2:5 

2. int[ ] copyOf(int[ ] original, int newLength)

import java.util.*;
public class TestF2 {
	    public static void main(String[] args) {
	        int a[] = new int[] {1, 3, 4, 6, 8, 9};
	        int b[] ; 
			b = Arrays.copyOf(a, 7);
			System.out.println(Arrays.toString(b));
	    }
}

代码运行结果:[1, 3, 4, 6, 8, 9, 0] 

 3.boolean equals(int[] a, int[] a2)

package day07;
import java.util.*;
public class TestF2 {
	    public static void main(String[] args) {
	        int a[] = new int[] {1, 3, 4, 6, 8, 9};
	        int b[] ,c[]; 
	    	b = Arrays.copyOf(a, 7);
            // 复制数组a 到 b ,将 b 数组的长度定为7
	    	c = Arrays.copyOf(a, 6);
            // 复制数组a 到 c ,将 c 数组的长度定为6
	        boolean flag = Arrays.equals(a,b);
	        boolean flag1 = Arrays.equals(a,c);
			System.out.println(Arrays.toString(b));
			System.out.println(flag);
			System.out.println(Arrays.toString(c));
			System.out.println(flag1);
	    }
}

代码运行结果: [1, 3, 4, 6, 8, 9, 0]
                           false
                          [1, 3, 4, 6, 8, 9]
                           true

4. sort(int[] a)

package day07;
import java.util.*;
public class TestF2 {
	    public static void main(String[] args) {
	        int a[] = new int[] {8, 3, 5, 6, 2, 1};
	        Arrays.sort(a);
	        System.out.println(Arrays.toString(a));
	    }
}

 代码运行结果:[1, 2, 3, 5, 6, 8]

 5.’static String toString(int[ ] a)  

package day07;
import java.util.*;
public class TestF2 {
	    public static void main(String[] args) {
	        int a[] = new int[] {8, 3, 5, 6, 2, 1};
	        Arrays.sort(a);
	        System.out.println(a);
	        System.out.println(Arrays.toString(a));
	    }
}

代码运行结果:[I@6d06d69c
                      [1, 2, 3, 5, 6, 8] 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值