数组的概念:相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。
数组的4种定义格式:
1、int[] arr = new int[];
2、int[] arr = new int[];
3、int[] arr = { };
4、int[] arr = new int[]{ };
这里 推荐使用第三种,跟第一种。因为这两种最常用
数组初认识:
package com.laobi.day04;
public class Test6 {
/**
* 数组:
* 1、数组的定义
* 2、数组的内存分配及特点
* 3、数组操作常见问题
* 4、数组常见操作
* 5、数组中的数组
*
* 内存的划分:
* 1、寄存器
* 2、本地方法区
* 3、方法区
* 4、栈内存:
* 存储的都是局部变量,而且变量所属的作用域一旦结束,该变量就自动释放了
* 5、堆内存:
* 存储是数组和对象(其实数组就是对象)凡是new建立的都在堆中
* 特点:
* 1、每一个实体都用首地址值
* 2、对内存中的每一个变量都有默认初始化值,根据类型的不同而不同
* 3、垃圾回收机制
*
* 常见问题:
* 1、数组下标越界
* 2、当引用型变量没有任何实体指向时,还在用其操作实体。就会发生该异常
*/
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr[2]);
}
}
数组的常用操作:
package com.laobi.day08;
public class ArrayTool {
/*
* 获取最大值的两种方法
*/
public static int getMax(int[] arr)
{
//使用数组中第一个元素记录住最大值
int max = arr[0];
//遍历数组
for(int i=0;i<arr.length;i++)
{
//判断数组中的元素是否存在大于Max的值
if(arr[i]>max)
//如果有,就用Max记录这个元素的值
max=arr[i];
}
return max;
}
public static int getMax_2(int[] arr)
{
//定义最大值下标为0第一个元素
int maxIndex = 0;
//遍历数组
for(int i=0;i<arr.length;i++)
{
//判断数组的元素值是否大于这个最大值
if(arr[i]>arr[maxIndex])
//如果有,记录住该最大值下标
i=maxIndex;
}
return arr[maxIndex];
}
//选择排序
public static void SelectSort(int[] arr)
{
//对数组下标进行遍历
for(int i=0;i<arr.length-1;i++)
{
//对数组比较次数进行循环
for(int j=i+1;j<arr.length;j++)
{
//判断当前数组元素的值是否大于其他元素的值
if(arr[i]>arr[j])
{
//如果有,则进行交换,把交换方法封装成函数
swap(arr,i,j);
}
}
}
}
/*
冒泡排序
* 两种方法
*/
//方法一:
public static void Bubble(int[] arr)
{
for(int i=0;i<arr.length-1;i++)
{
//arr,length-1-i防止数组下标越界以及随着循环对次数增加循环对圈数减少
for(int j=0;j<arr.length-1-i;j++)
{
if(arr[j]>arr[j+1])
swap(arr,j,j+1);
}
}
}
//方法二:
public static void Bubble_2(int[] arr)
{
for(int i=arr.length-1;i>0;i--)
{
for(int j=0;j<i;j++)
{
if(arr[j]>arr[j+1])
swap(arr,j,j+1);
}
}
}
/*
* 数组的查找
*/
//查找方法
public static int Search(int[] arr,int key)
{
for(int i=0;i<arr.length;i++)
{
if(arr[i]==key)
return i;
}
return -1;
}
//二分查找
public static int HalfSearch(int[] arr,int key)
{
//定义三个变量,记录第一个,中间和最后一个元素下标
int min,mid,max;
min = 0;
max = arr.length;
mid = (min+max)/2;
//当最小下标不等于要查找的下标时,执行循环
while(arr[mid]!=key)
{
//要找的元素大于中间的元素,返回最小下标是mid+1
if(key>arr[mid])
min=mid+1;
//要找的元素小于中间的元素,返回最大下标是mid+1
else if(key<arr[mid])
max = mid-1;
if(max<min)
return -1;
mid = (min+max)/2;
}
return mid;
}
//二分查找方法二:
public static int HalfSearch_2(int[] arr,int key)
{
int min,mid,max;
min=0;
max=arr.length-1;
while(min<max)
{
mid = (min+max)>>1;
if(key>arr[mid])
min = mid + 1;
else if(key<arr[mid])
max = mid -1;
else
return mid;
}
return min;
}
//把交换的方法封装成函数
private static void swap(int[] arr, int i, int j)
{
int temp = arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
//处理数组打印的方法
public static void print(int[] arr)
{
System.out.print("[");
for(int i=0;i<arr.length;i++)
{
if(i!=arr.length-1)
System.out.print(arr[i]+",");
else
System.out.println(arr[i]+"]");
}
}
}