01.数组(静态初始化-常见问题)
ArrayIndexOutOfBoundsException:操作数组时,访问到了数组中不存在的角标,即数组越界。
NullPointerException:空指针异常。例如:当引用没有任何指向,值为null时,该引用还在用于操作实体。
02.数组(常见操作-遍历)
但凡有数组,一般都要用for循环遍历
03.数组(常见操作-获取最值)
思路:
(1).获取最值需要进行比较,每次比较都会有一个较大的值,因为该值不确定,通过一个变量进行临储。
(2).让数组中的每一个元素都和这个变量的值进行比较,如果大于了变量中的值,就用该变量记录较大值。
(3).当所有的元素都比较完成,那么该变量中存储的就是数组中最大的值了。
04.数组(排序-选择排序)
for(int i=0;i<array.length-1;i++)
{
for(int j=i+1;j<array.length;j++)
{
if(array[i]>array[j])
{
int temp=0;
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
}
05.数组(排序-冒泡排序)
冒泡排序:相邻两个元素进行比较,如果符合条件就换位。
for(int i=0;i<array.length-1;i++)
{
for(int j=0;j<array.length-i-1;j++)
{
if(array[j]>array[j+1])
{
int temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
真实开发时,排序用的是java.util.*包中的Arrays.sort(arrray);方法。
06.数组(排序-位置置换功能抽取)
选择排序和冒泡排序中的换位置功能可以提取出来,单独封装一个函数。
public static void swap(int[] array,int a,int b)
{
int temp=array[a];
array[a]=array[b];
array[b]=temp;
}
07.数组(折半查找)
查找定义功能,获取key第一次出现在数组中的位置,如果返回是-1,那么代表该key在数组中不存在。
折半查找可以提高效率,但数组必须是有序的。
折半的第一种方式:
int min,max,mid;
min=0;
max=array.length-1;
mid=(min+max)/2;
while(key!=array[mid])
{
if(key>array[mid])
{
min=mid+1;
}
else if(key<array[mid])
{
max=mid-1;
}
if(min>max)
{
return -1;
}
mid=(min+max)/2;
}
return mid;
折半的第二种方式:
int min,max,mid;
min=0;
max=array.length-1;
while(min<=max)
{
mid=(min+max)>>1;
if(key>array[mid])
{
min=mid+1;
}
else if(key<array[mid])
{
max=mid-1;
}
else
{
return mid;
}
}
return -1;
如果要把一个有序数组插入一个值,且插入后仍有序,可以把上一行的return -1;改成return min;
08.数组(进制转换-十进制-二进制)
public static void TenToTwo(int num)
{
StringBuffer sb=new StringBuffer();
while(num>0)
{
sb.append(num%2);
num=num/2;
}
System.out.println(sb.reverse());
}
09.数组(进制转换-十进制-十六进制)
public static void TenToSixteen(int num)
{
StringBuffer sb=new StringBuffer();
for(int i=0;i<8;i++)
{
int temp=num&15;
if(temp>9)
{
sb.append((char)(temp-10+'A'));
}
else
{
sb.append(temp);
}
num=num>>>4;
}
System.out.println(sb.reverse());
}
10.数字(查表法-十进制-十六进制)
除了StringBuffer的reverse可以翻转顺序,还可以用数组来完成存储。
/*
查表法-十进制to十六进制
按顺序存储
*/
public static void TenToSixteen2(int num)
{
char[] table={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char[] array=new char[8];
int pos=0;
while(num!=0)
{
int temp=num&15;
array[pos++]=table[temp];
num=num>>>4;
}
for(int i=pos-1;i>=0;i--)
{
System.out.print(array[i]);
}
}
/*
查表法-十进制to十六进制
按反序存储
*/
public static void TenToSixteen3(int num)
{
char[] table={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char[] array=new char[8];
int pos=array.length;
while(num!=0)
{
int temp=num&15;
array[--pos]=table[temp];
num=num>>>4;
}
for(int i=pos;i<array.length;i++)
{
System.out.print(array[i]);
}
}
11.数字(查表法-十进制-2进制)
/*
查表法:十进制-二进制
反序存储
*/
public static void TenToTwo2(int num)
{
char[] table={'0','1'};
char[] array=new char[32];
int pos=array.length;
while(num!=0)
{
int temp=num&1;
array[--pos]=table[temp];
num=num>>>1;
}
for(int i=pos;i<array.length;i++)
{
System.out.print(array[i]);
}
}
12.数组(进制转换优化)
public static void trans(int num,int base,int offset)
{
if(num==0)
{
System.out.println(0);
return;
}
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;
}
for(int x=pos;x<arr.length;x++)
{
System.out.println(arr[x]);
}
}
13.数组(二维数组)
格式1:int[][] array=new int[3][2];
格式1定义了名称为array的二维数组,二维数组中有三个一维数组,每一个数组中有三个元素。
格式2:
int[][] array=new int[3][];
array[0]=new int[3];array[0]=new int[1];array[0]=new int[2];
格式2就好比C#中的锯齿数组。
二维数组的长度是行数。
二维数组中第一行(第一个数组)的长度array[0].length;
其他格式:
int[][] array={{3,5,1,7},{2,3,5},{6,1,8,2}};
或:
int[] x[];也是二维数组的定义,不建议这种定义方法。
遍历二维数组:(求和)
for(int i=0;i<array.length;i++)
{
for(int j=0;j<array[i].length;j++)
{
sum=sum+array[i][j];
}
}
ArrayIndexOutOfBoundsException:操作数组时,访问到了数组中不存在的角标,即数组越界。
NullPointerException:空指针异常。例如:当引用没有任何指向,值为null时,该引用还在用于操作实体。
02.数组(常见操作-遍历)
但凡有数组,一般都要用for循环遍历
03.数组(常见操作-获取最值)
思路:
(1).获取最值需要进行比较,每次比较都会有一个较大的值,因为该值不确定,通过一个变量进行临储。
(2).让数组中的每一个元素都和这个变量的值进行比较,如果大于了变量中的值,就用该变量记录较大值。
(3).当所有的元素都比较完成,那么该变量中存储的就是数组中最大的值了。
04.数组(排序-选择排序)
for(int i=0;i<array.length-1;i++)
{
for(int j=i+1;j<array.length;j++)
{
if(array[i]>array[j])
{
int temp=0;
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
}
05.数组(排序-冒泡排序)
冒泡排序:相邻两个元素进行比较,如果符合条件就换位。
for(int i=0;i<array.length-1;i++)
{
for(int j=0;j<array.length-i-1;j++)
{
if(array[j]>array[j+1])
{
int temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
真实开发时,排序用的是java.util.*包中的Arrays.sort(arrray);方法。
06.数组(排序-位置置换功能抽取)
选择排序和冒泡排序中的换位置功能可以提取出来,单独封装一个函数。
public static void swap(int[] array,int a,int b)
{
int temp=array[a];
array[a]=array[b];
array[b]=temp;
}
07.数组(折半查找)
查找定义功能,获取key第一次出现在数组中的位置,如果返回是-1,那么代表该key在数组中不存在。
折半查找可以提高效率,但数组必须是有序的。
折半的第一种方式:
int min,max,mid;
min=0;
max=array.length-1;
mid=(min+max)/2;
while(key!=array[mid])
{
if(key>array[mid])
{
min=mid+1;
}
else if(key<array[mid])
{
max=mid-1;
}
if(min>max)
{
return -1;
}
mid=(min+max)/2;
}
return mid;
折半的第二种方式:
int min,max,mid;
min=0;
max=array.length-1;
while(min<=max)
{
mid=(min+max)>>1;
if(key>array[mid])
{
min=mid+1;
}
else if(key<array[mid])
{
max=mid-1;
}
else
{
return mid;
}
}
return -1;
如果要把一个有序数组插入一个值,且插入后仍有序,可以把上一行的return -1;改成return min;
08.数组(进制转换-十进制-二进制)
public static void TenToTwo(int num)
{
StringBuffer sb=new StringBuffer();
while(num>0)
{
sb.append(num%2);
num=num/2;
}
System.out.println(sb.reverse());
}
09.数组(进制转换-十进制-十六进制)
public static void TenToSixteen(int num)
{
StringBuffer sb=new StringBuffer();
for(int i=0;i<8;i++)
{
int temp=num&15;
if(temp>9)
{
sb.append((char)(temp-10+'A'));
}
else
{
sb.append(temp);
}
num=num>>>4;
}
System.out.println(sb.reverse());
}
10.数字(查表法-十进制-十六进制)
除了StringBuffer的reverse可以翻转顺序,还可以用数组来完成存储。
/*
查表法-十进制to十六进制
按顺序存储
*/
public static void TenToSixteen2(int num)
{
char[] table={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char[] array=new char[8];
int pos=0;
while(num!=0)
{
int temp=num&15;
array[pos++]=table[temp];
num=num>>>4;
}
for(int i=pos-1;i>=0;i--)
{
System.out.print(array[i]);
}
}
/*
查表法-十进制to十六进制
按反序存储
*/
public static void TenToSixteen3(int num)
{
char[] table={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char[] array=new char[8];
int pos=array.length;
while(num!=0)
{
int temp=num&15;
array[--pos]=table[temp];
num=num>>>4;
}
for(int i=pos;i<array.length;i++)
{
System.out.print(array[i]);
}
}
11.数字(查表法-十进制-2进制)
/*
查表法:十进制-二进制
反序存储
*/
public static void TenToTwo2(int num)
{
char[] table={'0','1'};
char[] array=new char[32];
int pos=array.length;
while(num!=0)
{
int temp=num&1;
array[--pos]=table[temp];
num=num>>>1;
}
for(int i=pos;i<array.length;i++)
{
System.out.print(array[i]);
}
}
12.数组(进制转换优化)
public static void trans(int num,int base,int offset)
{
if(num==0)
{
System.out.println(0);
return;
}
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;
}
for(int x=pos;x<arr.length;x++)
{
System.out.println(arr[x]);
}
}
13.数组(二维数组)
格式1:int[][] array=new int[3][2];
格式1定义了名称为array的二维数组,二维数组中有三个一维数组,每一个数组中有三个元素。
格式2:
int[][] array=new int[3][];
array[0]=new int[3];array[0]=new int[1];array[0]=new int[2];
格式2就好比C#中的锯齿数组。
二维数组的长度是行数。
二维数组中第一行(第一个数组)的长度array[0].length;
其他格式:
int[][] array={{3,5,1,7},{2,3,5},{6,1,8,2}};
或:
int[] x[];也是二维数组的定义,不建议这种定义方法。
遍历二维数组:(求和)
for(int i=0;i<array.length;i++)
{
for(int j=0;j<array[i].length;j++)
{
sum=sum+array[i][j];
}
}