数组的定义格式:
基本数据类型变量的定义: int x;
数组变量的定义: int[] arr;
数组的初始化:
•初始化方式1:
•动态初始化:数组的创建和元素的赋值分开进行
格式:
元素类型[] 数组名 = new 元素类型[数组长度];
int[] arr = new int[3];
•初始化方式2:
•静态初始化:数组创建时就给数组元素赋值
格式:
元素类型[] 数组名 = new 元素类型[]{元素1,元素2,…};
int[] arr = new int[]{2,0,3,1};
静态初始化的简化写法
int[] arr = {2,0,3,1};
内存结构:栈stack,堆heap
•
栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放
•
•
堆内存:存放数组和对象,通过new建立的实例都存放在堆内存中
每一个实例都有内存地址值
实例中的变量都有默认初始化值
当实例不再被使用,会在不确定的时间被垃圾回收器回收
•
方法区:存放类文件和方法(面向对象部分再讲解)
本地方法栈:供本地方法使用,与操作系统相关
程序计数器
--Program Counter
:对字节码文件计数
数组操作常见问题:
1、数组索引越界异常(
ArrayIndexOutOfBoundsException)
int[] arr = new int[2];
System.out.println(arr[
2
]);
原因:访问到了数组中的不存在的索引发生异常
2、
空指针异常(NullPointerException)
int[] arr = new int[2];
arr =
null
;
System.out.println(arr[0])
;
原因:arr引用没有指向数组,却在操作数组中的元素
数组的练习:
1、
/*
数组的格式
数组:
同一种数据类型的若干个值的容器
元素:数组中的值称为元素
索引:元素的标号,从0开始
长度:数组中元素的个数
*/
public class ArrayDemo1{
public static void main(String[] args){
int a = 1;
int b = 2;
int c = 3;
//数据类型 变量名 = 初始值;
//定义数组,第一种格式:动态初始化,定义数组时,不指定数组里具体的值.
int[] arr = new int[10];
//第二种静态初始化:定义数组时,元素已经确定
int[] arr2 = new int[]{1,2,3};
//简化写法
int[] arr3 = {10,20,30};
}
}
2、
/*
数组元素的使用:
数组名[索引值]
数组元素的默认值:
能为0的为0,能为0.0的为0.0,能为false的为false,能为null的为null
*/
public class ArrayDemo2{
public static void main(String[] args){
//创建一个长度为5的int型数组
// double[] arr = new double[5];
// boolean[] arr = new boolean[5];
// String[] arr = new String[5];
/*
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
System.out.println(arr[4]);
*/
// int[] arr = new int[5];
// byte[] arr = new byte[5];
// short[] arr = new short[5];
// char[] arr = new char[5];
// int[] arr = new int[5];
//用循环改进
for(int i = 0;i<5;i++){
System.out.println(arr[i]);
}
}
}
3、获取数组的最值(最大值,最小值)
public class Demo{
public static void main(String[] args){
int[] arr = getArray(15);
printArray(arr);
int max = getMax(arr);
System.out.println("获取的最大值为:" + max);
int min = getMin(arr);
System.out.println("获取的最小值为:" + min);
}
//获取随机数数组
public static int[] getArray(int n){
int[] arr = new int[n];
for(int i = 0;i < arr.length;i ++){
int r = (int)(Math.random() * 50 + 1);
arr[i] = r;
}
return arr;
}
//打印数组
public static void printArray(int[] arr){
for(int i = 0;i < arr.length;i ++){
System.out.print(arr[i] + " ");
}
System.out.println();
}
//取数组最大值
public static int getMax(int[] arr){
int max = arr[0];
for(int i = 0;i < arr.length;i ++){
if(arr[i] > max){
max = arr[i];
}
}
return max;
}
//获取数组中的最小值
public static int getMin(int[] arr){
int min = arr[0];
for(int i = 0;i < arr.length;i ++){
if(min > arr[i]){
min = arr[i];
}
}
return min;
}
}
4、获取一个不包含重复元素的int型的数组
/*
生成一个不包含重复元素的int型的数组
*/
public class Demo2{
public static void main(String[] args){
printArray(getUniqueArray(10));
}
//生成一个不包含重复元素的int型的数组
public static int[] getUniqueArray(int n){
int[] arr = new int[n];
for(int i = 0;i < arr.length;i ++){
int r = (int)(Math.random() * 50 + 1);
while(isExist(arr,r)){
r = (int)(Math.random() * 50 + 1);
arr[i] = r;
}
return arr;
}
//判断一个数组中是否包含某个值
public static boolean isExist(int[] arr,int value){
for(int i = 0;i < arr.length; i ++){
if(arr[i] == value){
return true;
}
}
return false;
}
//打印数组
public static int[] printArray(int n){
for(int i = 0;i < arr.length;i ++){
System.out.print(arr[i] + " ");
}
System.out.println();
}
}
5、
/*
从键盘录入数组的元素,并求最值
*/
import java.util.Scanner;
public class Demo{
public static void main(String[] args){
int[] arr = getArray();
printArray(arr);
System.out.println("获取的最大值为:" + getMax(arr));
System.out.println("获取的最小值为:" + getMin(arr));
}
//从键盘录入数据,并返回一个int型数组
public static int[] getArray(){
Scanner sc = new Scanner(System.in);
System.out.print("请输入数组长度:");
int len = sc.nextInt();
int[] arr = new int[len];
for(int i = 0;i < arr.length;i ++){
System.out.print("请输入第" + (i+1) + "个数:" );
arr[i] = sc.nextInt();
}
return arr;
}
//打印数组
public static void printArray(int[] arr){
for(int i = 0;i < arr.length;i ++){
System.out.print(arr[i] + " ");
}
System.out.println();
}
//取数组最大值
public static int getMax(int[] arr){
int max = arr[0];
for(int i = 0;i < arr.length;i ++){
if(arr[i] > max){
max = arr[i];
}
}
return max;
}
//获取数组中的最小值
public static int getMin(int[] arr){
int min = arr[0];
for(int i = 0;i < arr.length;i ++){
if(min > arr[i]){
min = arr[i];
}
}
return min;
}
}
6、普通查找:获取指定元素第一次出现的索引
/*
普通查找:获取指定元素第一次出现的索引
*/
public class ArrayDemo5{
public static void main(String[] args){
int[] arr = {1,2,3,4,4,4};
int value = 40;
int index = getIndex(arr,value);
if(index == -1){
System.out.println("数 " + value + " 没找到");
}else{
System.out.println("数 " + value + " 对应的索引是: " + index);
}
}
//获取指定元素在指定数组中第一次出现的索引值
public static int getIndex(int[] arr,int value){
for(int i = 0;i<arr.length;i++){
if(arr[i] == value){
return i;
}
}
return -1;
}
}
7、随机生成一个5个元素(1-10)的int型数组,求一个随机数在这个数组中第一次出现的索引值
/*
随机生成一个5个元素(1-10)的int型数组,求一个随机数在这个数组中第一次出现的索引值
*/
public class ArrayDemo6{
public static void main(String[] args){
int[] arr = genArray();
printArray(arr);
int r = (int)(Math.random() * 10 + 1);
int index = getIndex(arr,r);
if(index < 0){
System.out.println(r + "没找到");
}else{
System.out.println(r + "第一次出现的索引是: " + index);
}
}
//获取一个数在指定数组中出现的第一次索引值
public static int getIndex(int[] arr,int value){
for(int i = 0;i<arr.length;i++){
if(arr[i] == value){
return i;
}
}
return -1;
}
//生成一个int型数组
public static int[] genArray(){
int[] arr = new int[5];
for(int i = 0;i<arr.length;i++){
int r = (int)(Math.random() * 10 + 1);
arr[i] = r;
}
return arr;
}
//打印数组
public static void printArray(int[] arr){
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i] + " ");
}
System.out.println();
}
}
8、
/*
用数组模拟打分:
5个裁判,去掉最高分,最低分,然后求剩余元素的平均值作为最终得分
*/
public class ArrayDemo7{
public static void main(String[] args){
int n = 5;
int[] arr = genArray(n);
print(arr);
double avg = getAvg(arr);
System.out.println("平均分是: " + avg);
}
//求平均值
public static double getAvg(int[] arr){
int max = getMax(arr);
int min = getMin(arr);
double sum = 0.0;
for(int i = 0;i<arr.length;i++){
sum += arr[i];
}
sum = sum - max - min;
return sum / (arr.length - 2);
}
//求最大值
public static int getMax(int[] arr){
int max = arr[0];
for(int i = 1;i<arr.length;i++){
if(arr[i] > max){
max = arr[i];
}
}
return max;
}
//求最小值
public static int getMin(int[] arr){
int min = arr[0];
for(int i = 1;i<arr.length;i++){
if(arr[i] < min){
min = arr[i];
}
}
return min;
}
//生成随机数组
public static int[] genArray(int n){
int[] arr = new int[n];
for(int i = 0;i<arr.length;i++){
arr[i] = (int)(Math.random() * 101);
}
return arr;
}
public static void print(int[] arr){
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i] + " ");
}
System.out.println();
}
}
9、定义一个int型数组,定义方法,把数组的元素变成原来的2倍
/*
定义一个int型数组,定义方法,把数组的元素变成原来的2倍
*/
public class ArrayTest{
public static void main(String[] args){
int[] arr = {1,2,3,4,5};
printArray(arr);
doubleArray(arr);
printArray(arr);
}
//将元素变成原来的2倍
public static void doubleArray(int[] arr){
for(int i = 0;i<arr.length;i++){
arr[i] = arr[i] * 2;
}
}
//打印数组元素
public static void printArray(int[] arr){
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i] + " ");
}
System.out.println();
}
}
10、复制数组
/*
数组的复制:返回值类型是数组
判断堆空间中的两个对象(数组)是否是同一个数组,可以使用 == 判断他们的地址值
*/
public class CopyArrayDemo{
public static void main(String[] args){
int[] arr1 = genArray();
print(arr1);
int[] arr2 = copyArray(arr1);
// int[] arr2 = arr1;
print(arr2);
// System.out.println(arr1 == arr2);//
System.out.println(arr1);//[I@6d06d69c 类型@十六进制值
}
public static int[] genArray(){
int[] arr = new int[5];
for(int i = 0;i<arr.length;i++){
int r = (int)(Math.random() * 50 + 1);
arr[i] = r;
}
return arr;
}
public static void print(int[] arr){
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i] + " ");
}
System.out.println();
}
//int[]
//int[]
public static int[] copyArray(int[] arr){
//创建一个和参数一样大小的数组
int[] copy = new int[arr.length];
//遍历参数的数组,把元素拷贝到新数组中
for(int i = 0;i<arr.length;i++){
copy[i] = arr[i];
}
return copy;
}
}
11、合并两个数组
/*
合并两个数组
data1 = [1,2,3] data2 = [4,5,6]
*/
public class MergeDemo{
public static void main(String[] args){
int[] arr1 = genArray();
int[] arr2 = genArray();
System.out.println("生成的第一个小数组是:");
print(arr1);
System.out.println("生成的第二个小数组是:");
print(arr2);
int[] res = merge(arr1,arr2);
System.out.println("合并之后的数组是:");
print(res);
}
//随机生成一个长度随机(1-5)的int数组(1-50)
public static int[] genArray(){
int len = (int)(Math.random() * 5 + 1);
int[] arr = new int[len];
for(int i = 0;i<arr.length;i++){
arr[i] = (int)(Math.random() * 50 + 1);
}
return arr;
}
//合并两个数组
public static int[] merge(int[] a,int[] b){
int[] bigArray = new int[a.length + b.length];
int index = 0;
for(int i = 0;i<a.length;i++){
bigArray[index] = a[i];
index++;
}
for(int i = 0;i<b.length;i++){
bigArray[index] = b[i];
index++;
}
return bigArray;
}
//打印数组
public static void print(int[] arr){
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i] + " ");
}
System.out.println();
}
}