1. 数组的概念
Java 语言是典型的静态语言,因此 Java 数组是静态的,即当数组被初始化之后,该数组 所占的内存空间、数组长度都是不可变的
数组:一组相关类型(基本数据类型,引用类型)的变量的集合
性质:数组的长度固定
2. 数组元素初始化的初始值
元素类型 | 初始值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0 |
float | 0.0 |
double | 0.0 |
char | ‘\u0000’ |
double | 0.0 |
boolean | false |
类,接口,数组 | null |
3. 数组初始化方式
3.1 静态初始化
初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度
完整格式:
数据类型[] 数组名称 = new 数据类型[]{值, 值, …}
int[] array = new int[]{1, 2, 3, 4, 5};
注意:只有在完整格式下,才可以使用匿名数组
匿名数组:在栈内存中没有任何引用,只在堆内存开辟空间,存放数据
System.out.println(new int[]{1,2,3}.length);
简化格式:
数据类型[] 数组名称 = {值, 值, …}
int[] array = {1, 2, 3, 4, 5};
3.2 动态初始化
初始化时程序员只指定数组长度,由系统为数组元素分配初始值
格式:
数据类型[] 数组名称 = new 数据类型 [长度] ;
int[] array = new int[5];
4. 引用传递
引用传递:同一块堆内存空间被不同的栈内存所指向
public class ArrayDemo{
public static void main(String[] args){
int[] array = new null;
int[] temp = null;
arr = new int[3];
arr[0] = 1; // 数组第一个元素
arr[1] = 2; // 数组第二个元素
arr[2] = 3; // 数组第三个元素
temp = array; // 发生引用传递
temp[0] = 55; // 修改数据
System.out.println(arr[0]);
}
}
5. 数组经典面试题
给你一个文件里面包含全国人民(14亿)的年龄数据(0~180),现在要你统计每一个年龄有多少人?
思路:
数组 = 元素 + 下标
用数组的长度表示年龄范围,比如 new int[180],表示每个人年龄只会在这个范围之内
用数组的下标表示年龄的具体年限,比如 0 表示 0 岁,以此类推
用数组的元素表示该年龄的具体人数。比如 a[0] = 100表示0岁的是100人
代码实现:
package com.atguigu.gulimall.auth.controller;
import java.io.*;
/**
* 描述:
* 面试题
*
* @author XueGuCheng
* @create 2021-02-26 11:19
*/
public class Test {
public static void main(String[] args) throws IOException {
/**
* 思路:
* 数组 = 元素 + 下标
* 用数组的长度表示年龄范围,比如 new int[180],表示每个人年龄只会在这个范围之内
* 用数组的下标表示年龄的具体年限,比如 0 表示 0 岁,以此类推
* 用数组的元素表示该年龄的具体人数。比如 a[0] = 100表示0岁的是100人
*/
//1. 使用Buffered流读取文件
String str = null;
String file = "\\文件位置";
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(file));
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
//定义一个统计计数器,表示统计的所有人数
int count = 0;
//2. 定义一个数组
int[] array = new int[180];
while ((str = bufferedReader.readLine()) != null){
//读出来的是一个字符串,需要转换为int
Integer age = Integer.valueOf(str);
//例如读出来的是 30 ,则array[30]进行 +1,表示统计
array[age]++;
count++;
}
System.out.println("统计人数:" + count);
//3. 打印每个年龄的人数
for (int i = 0; i < array.length; i++) {
System.out.println("年龄:" + i + "该年龄的人数:" + array[i]);
}
}
}
6. 简单手写数组
package com.atguigu.gulimall.auth.controller;
/**
* 描述:
* 数组实现
*
* @author XueGuCheng
* @create 2021-02-26 11:36
*/
public class ArrayDemo {
//数组的长度
private int length;
private int data[];
//当前已存在数据的大小
private int index;
public void print(){
System.out.println("index:" + index);
for (int i = 0; i < index; i++) {
System.out.println(data[i] + " ");
}
System.out.println();
}
/**
* 插入。 时间复杂度O(n),因为不确定需要往后移动多少个数据
* @param loc 插入的位置
* @param n 插入的数据
*/
public void insert(int loc,int n){
if (length > index++){
for (int i = length - 1;i > loc;i--){
//把数据往后移一个
data[i] = data[i - 1];
}
data[loc] = n;
}
//剩余空间不够,进行扩容操作。length * 2
}
/**
* 删除
* @param loc 所要删除的位置
*/
public void delete(int loc){
for (int i = loc;i < length;i++){
if (i != length - 1){
data[i] = data[i + 1];
}else {
data[i] = 0;
}
}
index--;
}
/**
* 更新
* @param loc 所要更新的位置
* @param n 更新的元素
*/
public void update(int loc,int n){
data[loc] = n;
}
/**
* 获取数据
* @param loc 所要获取数据的位置
* @return
*/
public int get(int loc){
return data[loc];
}
}