1.数组的定义
同一种类型数据的集合。相当于一个容器。可以自动给数组中的元素从0开始编号,方便操作这些元素。
格式:int[] arr = new int[4];
int[] arr = new int[]{3,4,6,8};
int[] arr = {3,4,6,8};
2.内存结构
java程序在运行时,需要在内存中分配空间。为了提高运算效率,把空间划分成不同区域,每个区域都有特定的处理数据方式和
内存管理方式。
栈内存:用来存储局部变量,变量使用结束后,所占的空间会自动释放。
堆内存:通过new建立的实例都存放在堆内存中,而每一个实例都有一个内存地址以及默认初始化值。如果实例不再被使用的话,
在不确定的时间会被垃圾回收器回收。
一般数据类型的数组的默认值为null,boolean型数组的默认值是false。
3.数组操作时的两个异常:
ArrayIndexOutOfBoundsException: 数组角标越界异常
NullPointerException:空指针异常
4.数组的遍历
5. 数组中获取最值
6.数组的排序
(1)选择排序
(2)冒泡排序
7.数组的折半查找(数组必须是有序数组)
如果要把一个数插入到一个有序数组,要保证数据还是有序的,需要插入什么位置。
首先要在数组中查找这个数是否存在,如果不存在,该数要插入的位置就是返回的min。
8.进制转换
(1)十进制转换为十六进制的函数:
(2)查表法十进制转换其他进制
9.二维数组
格式一:
int[][] arr = new int[3][2];
定义了一个二维数组,二维数组有3个一维数组,每个一维数组中有2个元素。
一维数组的名称分别为arr[0],arr[1],arr[2],给第一个一维数组的1角标位赋值23的写法是:arr[0][1]=23;
格式二:
int[][] arr = new int[3][];
二维数组中有3个一维数组,每个一维数组默认初始化值为null,可以给这3个一维数组进行初始化:
arr[0] = new int[3];
arr[1] = new int[2];
arr[2] = new int[1];
格式三:
int[][] arr = {{3,8,1},{8,2,9},{1,5}};
二维数组中有三个一维数组,每个一维数组都已初始化。
arr[0]={3,8,1};
arr[1]={8,2,9};
arr[2]={1,5};
第一个一维数组的长度:arr[0].length
System.out.println(arr)的值是: [[I@0x6c2e
System.out.println(arr[0])的值:[I@0x4ba8
获取二维数组int[][] arr = new int[a][b]的所有元素的和
数据的定义方式:
一维数组:int[] x ,int x[];
二维数组:int[][] y,int y[][],int[] y[];
int[] x,y[];//x是一维,y是二维
同一种类型数据的集合。相当于一个容器。可以自动给数组中的元素从0开始编号,方便操作这些元素。
格式:int[] arr = new int[4];
int[] arr = new int[]{3,4,6,8};
int[] arr = {3,4,6,8};
2.内存结构
java程序在运行时,需要在内存中分配空间。为了提高运算效率,把空间划分成不同区域,每个区域都有特定的处理数据方式和
内存管理方式。
栈内存:用来存储局部变量,变量使用结束后,所占的空间会自动释放。
堆内存:通过new建立的实例都存放在堆内存中,而每一个实例都有一个内存地址以及默认初始化值。如果实例不再被使用的话,
在不确定的时间会被垃圾回收器回收。
一般数据类型的数组的默认值为null,boolean型数组的默认值是false。
3.数组操作时的两个异常:
ArrayIndexOutOfBoundsException: 数组角标越界异常
NullPointerException:空指针异常
4.数组的遍历
int[] arr = new int[]{3,2,5,9,4,21};
for (int x=0; x<arr.length; x++)
{
System.out.println("arr["+x+"]="+arr[x]);
}
5. 数组中获取最值
//初始化为元素
int[] arr = new int[]{3,2,5,9,4,21};
int max = arr[0];
int min = arr[0];
for(int x=1;x<arr.length;x++)
{
if(max<arr[x])
max = arr[x];//获取最大值
if(min>arr[x])
min = arr[x];//获取最小值
}
System.out.println("max="+max+"----min="+min);
//初始化为角标
int[] arr = new int[]{3,2,5,9,4,21};
int max = 0;
int min = 0;
for(int x=1;x<arr.length;x++)
{
if(arr[max]<arr[x])
max = x;
if(arr[min]>arr[x])
min = x;
}
System.out.println("max="+arr[max]+"----min="+arr[min]);
6.数组的排序
(1)选择排序
public static void selectSort(int[] arr)
{
for(int x=0;x<arr.length-1;x++)
{
for(int y=x+1;y<arr.length;y++)//外循环每循环一次,就把最小值放到最左边
{
if(arr[x]>arr[y])
{
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
}
}
(2)冒泡排序
public static void bubbleSort(int[] arr)
{
for(int x=0;x<arr.length-1;x++)
{
for(int y=0;y<arr.length-x-1;y++)//外循环每进行一次,内循环的比较次数就减少一次
{
if(arr[y]>arr[y+1])//每次循环,将相邻两个元素进行比较,把大的元素不断右移。
{
int temp = arr[y];
arr[y] = arr[y+1];
arr[y+1] = temp;
}
}
}
}
//或者
public static void bubbleSort2(int[] arr)
{
for(int x=arr.length-1;x>0;x--)
{
for(int y=0;y<x;y++)//外循环每进行一次,内循环的比较次数就减少一次
{
if(arr[y]>arr[y+1])//每次循环,将相邻两个元素进行比较,把大的元素不断右移。
{
int temp = arr[y];
arr[y] = arr[y+1];
arr[y+1] = temp;
}
}
}
}
7.数组的折半查找(数组必须是有序数组)
//第一种方式
public static int binSearch(int[] arr ,int key)
{
int min = 0;
int max = arr.length-1;
int mid ;
while(min<=max)//只要min小于max,继续循环
{
mid = (min+max)/2;
if(arr[mid]!=key)
{
if(key>arr[mid])
min = mid + 1;
if(key<arr[mid])
max = mid - 1;
}
else
return mid;
}
return -1;
}
//第二种方式
public static int binSearch2(int[] arr ,int key)
{
int min = 0;
int max = arr.length-1;
int mid = (min+max)/2;
while(arr[mid]!=key)//只要中间值不等于key,继续循环
{
if(key>arr[mid])
min = mid + 1;
if(key<arr[mid])
max = mid - 1;
mid = (min+max)/2;
if(min>max)
return -1;
}
return mid;
}
如果要把一个数插入到一个有序数组,要保证数据还是有序的,需要插入什么位置。
首先要在数组中查找这个数是否存在,如果不存在,该数要插入的位置就是返回的min。
8.进制转换
(1)十进制转换为十六进制的函数:
public static void toHex(int x)
{
StringBuilder sb = new StringBuilder();
int num;
while(x!=0)
{
num = x&15;
if(num>10)
{
num-=10;
sb.append((char)(num+'a'));
}
else
sb.append(num);
x= x>>>4;
}
System.out.print(sb.reverse());
}
(2)查表法十进制转换其他进制
public static String hexadecimalTransform(int num,int base,int offset)
{
if(num==0)
{
return "0";
}
char[] chs = {'0','1','2','3','4',
'5','6','7','8',
'9','A','B','C',
'D','E','F'};
char[] arr = new char[32];
int pos = arr.length;
while(num!=0)
{
int temp = num&base;
arr[--pos] = chs[temp];
num = num>>>offset;
}
StringBuilder sb = new StringBuilder();
for(int x=pos;x<arr.length;x++)
{
sb.append(arr[x]);
}
return sb.toString();
}
格式一:
int[][] arr = new int[3][2];
定义了一个二维数组,二维数组有3个一维数组,每个一维数组中有2个元素。
一维数组的名称分别为arr[0],arr[1],arr[2],给第一个一维数组的1角标位赋值23的写法是:arr[0][1]=23;
格式二:
int[][] arr = new int[3][];
二维数组中有3个一维数组,每个一维数组默认初始化值为null,可以给这3个一维数组进行初始化:
arr[0] = new int[3];
arr[1] = new int[2];
arr[2] = new int[1];
格式三:
int[][] arr = {{3,8,1},{8,2,9},{1,5}};
二维数组中有三个一维数组,每个一维数组都已初始化。
arr[0]={3,8,1};
arr[1]={8,2,9};
arr[2]={1,5};
第一个一维数组的长度:arr[0].length
System.out.println(arr)的值是: [[I@0x6c2e
System.out.println(arr[0])的值:[I@0x4ba8
获取二维数组int[][] arr = new int[a][b]的所有元素的和
int sum = 0;
for(int x=0;x<arr.length;x++)
{
for(int y=0;y<arr[x].length;y++)
{
sum+=arr[x][y];
}
}
数据的定义方式:
一维数组:int[] x ,int x[];
二维数组:int[][] y,int y[][],int[] y[];
int[] x,y[];//x是一维,y是二维