一、数组
同一种类型数据的集合,也就是一个容器。
声明:
1.元素类型[]数组名 = new元素类型[元素个数]
例:int[] arr = new int[5];
2.元素类型数组名[] = new元素类型[元素个数]
例:int arr[] = new int[5];
3.元素类型[]数组名 = new元素类型[]{元素1,元素2,元素3,......};
例:int[] arr =new int[]{1,2,3,4};
int[] arr={1,2,3,4}
注:
JAVA中推荐用:类型[]数组名;
一个数组是一个对象
声明一个数组没有创建一个对象
声明时不用指定长度
创建基本数据类型数组:int[] i = new int[2];
创建引用数据类型数组:Student[] s = new Student[100];
数组创建后其中的元素有初始值
类型 黙认值
byte 0
short 0
int 0
long 0l
float 0.0f
double 0.0d
char \u0000
boolean false
reference types null
注:
创建时一定要指定长度
int[] i2=new int[]; //error
Java程序在运行时,需要在内存中分配空间。为了提高运算效率,有对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放。
堆内存:
1. 数组和对象,通过new建立的实例都是存放在堆内存中。
2. 每一个实体都有默认初始化值。
3. 实体中的变量都有默认初始化值。
4. 实体不在被使用,会在不确定的时间内被垃圾回收器回收。
栈内存:自动释放。堆内存:垃圾回收机制。
Java的垃圾回收:
由一个后台线程gc进行垃圾回收
虚拟机判定内存不够的时候会中断代码的运行,这时候gc才进行垃圾回收
缺点:不能够精确的去回收内存
java.lang.System.gc(); 建议回收内存,但系统不一定回应,他会先去看内存是否够用,够用则不予理睬,不够用才会去进行垃圾回收
内存中什么算是垃圾:不在被引用的对象(局部变量,没有指针指向的)
二、数组的遍历
示例:
遍历数组
- /*
- 遍历数组
- */
- class Test
- {
- public static void main(String[] args)
- {
- int[] arr={1,2,3,4,5,6,7};
- printArray(arr);//调用自定义函数
- }
- public static void printArray(int[] arr)//自定义遍历一维数组函数
- {
- for(int x=0;x<arr.length;x++)
- {
- if(x!=arr.length-1)
- System.out.print(arr[x]+",");
- else
- System.out.print(arr[x]);
- }
- }
- }
三、获取数组中最大值和最小值
- /*
- 获取一维数组中的最大值和最小值
- */
- class ArrayTest
- {
- public static int getMax(int[] arr)//获取最大值函数
- {
- int max=0;
- for(int x=1;x<arr.length;x++)
- {
- if(arr[x]>arr[max])
- max=x;//存储最大值数组元素的脚标
- }
- return arr[max];
- }
- public static int getMin(int[] arr)//获取最小值函数
- {
- int min=0;
- for(int x=1;x<arr.length;x++)
- {
- if(arr[x]<arr[min])
- min=x; //存储最值数组元素的脚标
- }
- return arr[min];
- }
- public static void main(String[] args)
- {
- int[] arr={1,3,2,5,5};
- System.out.println("max="+getMax(arr)+"\n"+"min="+getMin(arr));
- }
- }
四、数组元素排序(选择排序)
- /*
- 需求:选择排序
- 思路:
- 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的
- 数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
- */
- class ArrayTest2
- {
- 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;
- }
- }
- }
- }
- public static void printArray(int[] arr)//自定义遍历一维数组函数
- {
- for(int x=0;x<arr.length;x++)
- {
- if(x!=arr.length-1)
- System.out.print(arr[x]+",");
- else
- System.out.print(arr[x]);
- }
- }
- public static void main(String[] args)
- {
- int[] arr={1,3,4,6,2,7,5};
- System.out.print("排序前:");//排序前
- printArray(arr);//调用打印函数
- System.out.print("\n排序后:");//排序后
- selectSort(arr);//调用排序函数
- printArray(arr);//排序后
- }
- }
五、数组元素排序(冒泡排序)
- /*
- 需求:冒泡排序
- 思路:
- 冒泡排序是经过n-1趟子排序完成的,第i趟子排序从第1个数至第n-i个数,若第i个
- 数比后一个数大(则升序,小则降序)则交换两数
- */
- class ArrayTest2
- {
- public static void bubbleSort(int[] arr)//冒泡排序
- {
- for(int x=0;x<arr.length-1;x++)//控制冒泡次数
- {
- for(int y=0;y<arr.length-1-x;y++)//控制比较次数
- {
- if(arr[y]>arr[y+1])
- {
- int temp=arr[y];
- arr[y]=arr[y+1];
- arr[y+1]=temp;
- }
- }
- }
- }
- public static void printArray(int[] arr)//自定义遍历一维数组函数
- {
- for(int x=0;x<arr.length;x++)
- {
- if(x!=arr.length-1)
- System.out.print(arr[x]+",");
- else
- System.out.print(arr[x]);
- }
- }
- public static void main(String[] args)
- {
- int[] arr={1,3,4,6,2,7,5};
- System.out.print("排序前:");//排序前
- printArray(arr);//调用打印函数
- System.out.print("\n排序后:");//排序后
- bubbleSort(arr);//调用冒泡排序函数
- printArray(arr);//排序后
- }
- }
六、数组元素排序(位置置换功能抽取)
发现无论什么排序。都需要对满足条件的元素进行位置置换,所以可以把这部分代码提取出来,单独封装成一个函数。
- /*
- 需求:冒泡排序
- 思路:
- 冒泡排序是经过n-1趟子排序完成的,第i趟子排序从第1个数至第n-i个数,若第i个
- 数比后一个数大(则升序,小则降序)则交换两数
- */
- class ArrayTest2
- {
- public static void bubbleSort(int[] arr)//冒泡排序
- {
- for(int x=0;x<arr.length-1;x++)//控制冒泡次数
- {
- for(int y=0;y<arr.length-1-x;y++)//控制比较次数
- {
- if(arr[y]>arr[y+1])
- {
- swap(arr,y,y+1);
- }
- }
- }
- }
- public static void swap(int[] arr,int a,int b)//交换
- {
- int temp=arr[a];
- arr[a]=arr[b];
- arr[b]=temp;
- }
- public static void printArray(int[] arr)//自定义遍历一维数组函数
- {
- for(int x=0;x<arr.length;x++)
- {
- if(x!=arr.length-1)
- System.out.print(arr[x]+",");
- else
- System.out.print(arr[x]);
- }
- }
- public static void main(String[] args)
- {
- int[] arr={1,3,4,6,2,7,5};
- System.out.print("排序前:");//排序前
- printArray(arr);//调用打印函数
- System.out.print("\n排序后:");//排序后
- bubbleSort(arr);//调用冒泡排序函数
- printArray(arr);//排序后
- }
- }
技巧:引入import java.util.*;通过Arrays.sort();也可以进行数组排序。
七、折半查找
- /*
- 数组元素的查找操作
- */
- class ArrayTest3
- {
- public static void main(String[] args)
- {
- int[] arr={2,3,4,6,8,64,78};
- //int index=getIndex(arr,2);//遍历查找
- //int index=halfSearch(arr,8);//折半查找方法1
- int index=halfSearch_2(arr,8);//折半查找方法2
- System.out.println("index="+index);
- }
- //折半查找,前提是数组元素是有序的。
- public static int halfSearch(int[] arr,int key)//方法1
- {
- int min,max,mid;
- min=0;
- max=arr.length-1;
- mid=(max+min)/2;
- while(arr[mid]!=key)
- {
- if(key>arr[mid])
- {
- min=mid+1;
- }
- else if(key<arr[mid])
- {
- max=mid-1;
- }
- if(min>max)
- return -1;
- mid=(max+min)/2;
- }
- return mid;
- }
- public static int halfSearch_2(int[] arr,int key)//方法2
- {
- int min=0,max=arr.length-1,mid;
- while(min<=max)
- {
- mid=(max+min)/2;
- if(key>arr[mid])
- {
- min=mid+1;
- }
- else if(key<arr[mid])
- {
- max=mid-1;
- }
- else
- return mid;
- }
- return -1;
- }
- //定义功能,获取key第一次出现在数组中的位置。如果返回是-1,那么代表该key在数组中不存在。
- public static int getIndex(int[] arr,int key)
- {
- for(int x=0;x<arr.length;x++)
- {
- if(arr[x]==key)
- return x;
- }
- return -1;
- }
- }
- //练习:有一个有序的数组,想要将一个元素插入到该数组中,还要保证该数组是有序的。
- public static int getIndex_2(int[] arr,int key)
- {
- int min=0,max=arr.length-1,mid;
- while(min<=max)
- {
- mid=(max+min)/2;
- if(key>arr[mid])
- {
- min=mid+1;
- }
- else if(key<arr[mid])
- {
- max=mid-1;
- }
- else
- return mid;
- }
- return min;//返回要插入的具体位置
- }
八、十进制->二进制和十进制->十六进制
- /*
- 十进制->二进制和十进制->十六进制
- */
- class ArrayTest4
- {
- public static void main(String[] args)
- {
- toBin(60);//十进制->二进制
- toHex(60);//十进制->十六进制
- }
- public static void toBin(int num)//十进制->二进制函数
- {
- StringBuffer sb=new StringBuffer();
- while(num>0)
- {
- sb.append(num%2);
- num=num/2;
- }
- System.out.println(sb.reverse());
- }
- public static void toHex(int num)//十进制->十六进制函数
- {
- StringBuffer sb=new StringBuffer();
- for(int x=0;x<8;x++)
- {
- 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());
- }
- }
九、查表法进行十进制->十六进制和十进制->二进制
- /*
- 查表法进行十进制->十六进制和十进制->二进制
- */
- class ArrayTest5
- {
- public static void main(String[] args)
- {
- toHex(60);
- toBin(60);
- }
- /*
- 0 1 2 3 4 5 6 7 8 9 A B C D E F (十六进制中的元素)
- 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
- 查表法:将所有的元素临时存储起来,建立对应关系。
- 每一次&15后的值作为索引去查建立好的表,就可以找到对应的元素。
- 可以通过数组的形式去定义。
- */
- public static void toHex(int num)//查表法16进制
- {
- char[] chs={'0','1','2','3','4',
- '5','6','7','8','9',
- 'A','B','C','D','E','F'
- };//定义二进制表
- char[] arr=new char[8];//定义一个临时存储容器,元素默认值'\u0000'。
- int pos=arr.length;
- while(num!=0)
- {
- int temp=num&15;
- arr[--pos]=chs[temp];
- num=num>>>4;
- }
- for(int x=pos;x<arr.length;x++)
- {
- System.out.print(arr[x]);
- }
- System.out.println();//换行
- }
- public static void toBin(int num)//查表法2进制
- {
- char[] chs={'0','1'};//定义二进制表
- char[] arr=new char[32];//定义一个临时存储容器
- int pos=arr.length;
- while(num!=0)
- {
- int temp=num&1;
- arr[--pos]=chs[temp];
- num=num>>>1;
- }
- for(int x=pos;x<arr.length;x++)
- {
- System.out.print(arr[x]);
- }
- System.out.println();//换行
- }
- }
十、进制转换优化
- /*
- 进制转换优化
- */
- class ArrayTest6
- {
- public static void main(String[] args)
- {
- toBin(-3);
- toOctal(30);
- toHex(-20);
- }
- public static void toBin(int num)//十进制->二进制
- {
- trans(num,1,1);
- }
- public static void toOctal(int num)//十进制->八进制
- {
- trans(num,7,3);
- }
- public static void toHex(int num)//十进制->十六进制
- {
- trans(num,15,4);
- }
- 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];//默认值'\u0000'
- 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.print(arr[x]);
- }
- System.out.println();//换行
- }
- }
十一、 二维数组
(其实是一个一维数组,它的每一个元素又是一个一维数组)
int[][] i1 = new int[2][3];
int[][] i4 = {{1,1,1},{2,2,2},{3,3,3}};
int[][] i3 = new int[][3]; //不允许高维没分配空间而先给低维分配空间
int[][] i2 = new int[2][];
i2[0] = new int[2];
i2[1] = new int[3];
注意:
int[] x,int x[];//一维
int[][]y;int y[][]; int[] y[];//二维
int[] x,y[];//x一维,y二维
也就是:
int[] x;
int[] y[];
1.x[0]=y;//error
2.y[0]=x;//yes
3.y[0][0]=x;//error
4.x[0][0]=y;//error
5.y[0][0]=x[0];//yes
6.x=y;//error
练习:
- /*
- 二维数组遍历
- */
- class ArrayTest7
- {
- public static void main(String[] args)
- {
- int a[][]=new int[][]{{1},{1,2},{1,2,3},{1,2,3,4}};//定义二维数组
- for(int i=0;i<a.length;i++)
- { for(int j=0;j<a[i].length;j++)
- {
- System.out.print(a[i][j]);
- }
- System.out.println();//换行
- }
- }
- }