1. 如何定义一个数组?
(1) int[] a ;
(2) int a[] ;
其中:
int 表示数组中存放的元素为int类型
[] 表示数组
a为数组名称
2. 如何初始化一个数组
动态和静态(常用是静态)
动态: 给出数组的长度,初始化值由系统自动分配
数据类型[] 数组名 = new 数据类型[数组长度];
静态:初始化时指定每个数组元素的初始值,由系统决定数组长度。
数据类型[] 数组名 = new 数据类型[] {数组值1,数组值2...}
简化版本为: 数据类型[] 数组名 = {数组值1,数组值2...}
例如:
int [] a = new int{3};
int[] a = new int[]{1,3,4};
简化后:int[] a = {1,3,4};
注意:不能在给定系统长度的同时给数组初始化
3. JAVA中的内存分配:
Java在程序运行时,需要在内存中分配空间,为了提高效率,对空间进行了区域划分,每一片区域都有特定的处理数据方式和内存管理方式。
栈 存储局部变量
堆 存储new出来的东西
方法区
本地方法区(和系统相关)
寄存器(给CPU相关)
后面两个是JAVA不能修改的,重点讲解前三块。
局部变量:在方法定义中或者方法声明上的变量称为局部变量
堆内存的特点:
A:每一个new出来的东西都有地址值
B:每个变量都有默认值
byte,short,int,long 0
float,double 0.0
char '\u0000'
boolean false
引用类型 null
C: 使用完毕就变成垃圾,但是没有立即回收,需要等垃圾回收器空闲的时候进行回收。
4.动态数组Demo
练习一:
定义一个数组,无初始化和有初始化的输出
练习二:定义两个数组,分别输出两个数组各自的数组名及元素值
然后给每个数组的元素重新赋值,再次分别数组两个数组的数组名和元素值
练习三:
定义第一个数组,定义完毕后,给数组元素赋值,赋值完毕后,再输出数组名称和元素值;
定义第二个数组,定义完毕后,给数组元素赋值,赋值完毕后,再输出数组名称和元素值;
定义第三个数组,把第一个数组的地址值赋值给它,通过第三个数组的名称去把数组元素赋值,再次输出第一个数组数组名称和元素。
5. 静态数组练习
练习一:静态数组初始化
6. 数组操作的常见两个小问题
ArrayIndexOutOfBounds 数组索引越界异常
原因:访问了不存在的索引
NullPointerException 空指针异常
原因:数组已经不在指向堆内存,仍然用数组名来访问元素会报错
7. 数组的综合练习
综合练习一:数组元素的遍历
功能:以此输出数组中的每一个元素
注意:数组提供了一个属性length,用于获取数组的长度
格式:数组名.长度
数组元素的下标从0开始,利用属性length获取数组的长度
格式:数组名.length 返回数组的长度
/*遍历数组的方法
两个明确:
返回值类型:void
参数列表: int[] arr
*/
/*遍历数组的方法(改进)
两个明确:
返回值类型:void
参数列表: int[] arr
*/
public static void printArray2(int[] arr)
{
for(int x = 0;x<arr.length;x++)
{
if(x == arr.length-1)
System.out.println(arr[x]);
else
System.out.println(arr[x]+",");
}
}
两个明确:
返回值类型:void
参数列表: int[] arr
*/
public static void printArray(int[] arr)
{
for(int x = 0;x<arr.length;x++)
{
System.out.println(arr[x]);
}
}
/*遍历数组的方法(改进)
两个明确:
返回值类型:void
参数列表: int[] arr
*/
public static void printArray2(int[] arr)
{
for(int x = 0;x<arr.length;x++)
{
if(x == arr.length-1)
System.out.println(arr[x]);
else
System.out.println(arr[x]+",");
}
}
/*综合练习二:获取数组最大值和最小值*/
public static void MaxMinArray(int[] arr1)
{
int[] arr = {10,20,30,40,50};
int maxVal,minVal;
maxVal = arr[0];
minVal = arr[0];
//获取数组最大值
for(int x = 1;x<arr.length;x++)
{
if(arr[x] > maxVal)
maxVal = arr[x];
if(arr[x] < minVal)
minVal = arr[x];
}
System.out.println(maxVal+"---"+minVal);
}
/*综合练习三: 数组元素逆序(把数组元素对调)
A分析:定义一个数组,静态初始化
B思路: 把1索引和arr.length-1数据交换
把2索引和arr.length-2数据交换
......
只要做到arr.length/2的时候即可。
两个明确:
返回值类型:void(不需要返回逆序后的数组,因为数组实际上是引用变量,传入的数组和逆序后的数组为同一个数组
参数列表:数组名int[] arr
*/
public static void reversePrint(int[] arr)
{
int temp = arr.length/2;
int tempVal;
for (int x = 0;x<=temp ;x++ )
{
tempVal = arr[x];
arr[x] = arr[arr.length-1-x];
arr[arr.length-1-x] = tempVal;
}
}
public static void reversePrint2(int[] arr)
{
int startIndex = 0;
int endIndex = arr.length -1;
int tmp;
while(startIndex<endIndex)
{
tmp = arr[startIndex];
arr[startIndex] = arr[endIndex];
arr[endIndex] = tmp;
startIndex++;
endIndex--;
}
}
/*综合练习四:查找数据1
根据键盘录入索引,查找对应星期*/
public static void searchDate()
{
String[] strArr = {"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数据0-6");
int index = sc.nextInt();
System.out.println("日期为:"+strArr[index]);
}
/*综合练习五:查找数据2
查找指定元素第一次在数组中出现的索引
思路:定义一个数组,静态初始化
写一个功能:遍历数组,依次获取数组中的每一个元素,和已知的数据进行比较
如果相等,返回当前的索引值
明确:
返回值类型: int
参数列表: int[] arr,int data
注意:
如果查找的数据在数组中不存在,找不到数据,一般用负数表示不存在,一般为-1
只要是判断if就有可能有false值存在,需要细心
*/
public static int getFirstLoc(int[] arr,int data)
{
for(int x = 0;x<arr.length;x++)
{
if (arr[x] == data)
return x;
}
return -1;
}
public static int getFirstLoc2(int[] arr,int data)
{
//定义一个索引
int index = -1;
for(int x = 0;x<arr.length;x++){
if(arr[x] == data){
index = x;
break;
}
}
//返回index
return index;
}
8. 数组学习总结:
(1)数组:存储同一种数据类型的多个元素的容器。
(2)特点:每一个元素都有编号,从0开始,最大编号是长度-1。
编号的专业叫法:索引
(3)定义格式
A:数据类型[] 数组名;
B:数据类型 数组名[];
推荐是用A方式,B方法就忘了吧。
但是要能看懂
(4)数组的初始化
A:动态初始化
只给长度,系统给出默认值
举例:int[] arr = new int[3];
B:静态初始化
给出值,系统决定长度
举例:int[] arr = new int[]{1,2,3};
简化版:int[] arr = {1,2,3};
(5)Java的内存分配
A:栈 存储局部变量
B:堆 存储所有new出来的
C:方法区(面向对象部分详细讲解)
D:本地方法区(系统相关)
E:寄存器(CPU使用)
注意:
a:局部变量 在方法定义中或者方法声明上定义的变量。
b:栈内存和堆内存的区别
栈:数据使用完毕,就消失。
堆:每一个new出来的东西都有地址
每一个变量都有默认值
byte,short,int,long 0
float,double 0.0
char '\u0000'
boolean false
引用类型 null
数据使用完毕后,在垃圾回收器空闲的时候回收。
(6)数组内存图
A:一个数组
B:二个数组
C:三个数组(两个栈变量指向同一个堆内存)
(7)数组的常见操作
A:遍历
方式1:
public static void printArray(int[] arr) {
for(int x=0; x<arr.length; x++) {
System.out.println(arr[x]);
}
}
方式2:
public static void printArray(int[] arr) {
System.out.print("[");
for(int x=0; x<arr.length; x++) {
if(x == arr.length-1) {
System.out.println(arr[x]+"]");
}else {
System.out.println(arr[x]+", ");
}
}
}
B:最值
最大值:
public static int getMax(int[] arr) {
int max = arr[0];
for(int x=1; x<arr.length; x++) {
if(arr[x] > max) {
max = arr[x];
}
}
return max;
}
最小值:
public static int getMin(int[] arr) {
int min = arr[0];
for(int x=1; x<arr.length; x++) {
if(arr[x] < min) {
min = arr[x];
}
}
return min;
}
C:逆序
方式1:
public static void reverse(int[] arr) {
for(int x=0; x<arr.length/2; x++) {
int temp = arr[x];
arr[x] = arr[arr.length-1-x];
arr[arr.length-1-x] = temp;
}
}
方式2:
public static void reverse(int[] arr) {
for(int start=0,end=arr.length-1; start<=end; start++,end--) {
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
}
D:查表
public static String getString(String[] strArray,int index) {
return strArray[index];
}
E:基本查找
方式1:
public static int getIndex(int[] arr,int value) {
for(int x=0; x<arr.length; x++) {
if(arr[x] == value) {
return x;
}
}
return -1;
}
方式2:
public static int getIndex(int[] arr,int value) {
int index = -1;
for(int x=0; x<arr.length; x++) {
if(arr[x] == value) {
index = x;
break;
}
}
return index;
}