黑马程序员 数组
来源:互联网 发布:光线cms论坛 编辑:程序博客网 时间:2024/05/02 01:38
(1)同一种类型数据的集合。其实数组就是一个容器
int[] arr = new int[5];
(2)数组的好处
int[] arr = new int[5];
arr[3] = 10;
A:可以自动给数组中的元素从0开始编号,方便操作这些元素。
(3)数组的定义格式
A:当不明确数组中的元素时
**举例 int[] arr = new int[3];//动态初始化
'\u0000'
arr[0] = 3;
B:当明确数组中的元素时
**举例 int[] arr = new int[]{1,2,3,4,5};//静态初始化
int[] arr = {1,2,3,4,5};
(4)什么时候使用数组?
A:当要操作的同种数据类型的数据是多个的时候,你就得想着先把这些数据用数组进行存储。
(5)内存图
A:栈
**存储的是局部变量(在函数中定义的变量)。
**变量被使用完后,立即自动释放。
B:堆
**存储的是实体(数组和对象)。
**实体:new出来的东西,可以存放很多数据的东西。
***class定义一个类。
**堆内存数据的特点
***每个实体都有内存地址
***堆内存中的变量都有默认初始化值
****int --> 0
****double --> 0.0
****boolean --> false
****char --> '\u0000' 空字符,unicode编码。
***当实体不在被使用的时候,会在jvm空闲的时候,
通过java垃圾回收机制使其自动释放。
C:方法区 后面讲。
D:本地方法区 调用是Windows系统底层资源,我们不用考虑。
E:寄存器 和CPU相关。我们不用考虑。
(6)操作数组最常见的问题
A:当你访问到数组中的最后一个元素时,还想继续访问,这个时候,会发生角标越界异常。
**ArrayIndexOutOfBoundsException
举例:
int[] arr = new int[3]; System.out.println(arr[3]);
B:当数组不在指向某个实体时,你还继续访问,就会发生空指针异常。
**NullPointerException
举例:
<span style="font-size:18px;">int[] arr = new int[3]; arr = null; System.out.println(arr[1]);</span>
(7)常见的数组的操作
记住:对数组的操作,一定要从角标入手。
A:遍历操作
**数组的属性:length 数组的长度。
**格式:数组名.length
for (int x=0;x < arr.length ;x++ )System.out.println("arr["+x+"]="+ arr[x]);
B:获取最值
**获取最大值
int[] arr = new int[3];
<span style="font-size:18px;">public static void main(String[] args) {int[] arr = {3,2,1,4,5,6};//int x = getMax(arr);//System.out.println(x);}public static int getMax(int[] arr){int max = arr[0];//i从1开始,因为第一个数不用跟自己比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];//i从1开始,因为第一个数不用跟自己比for(int i=1; i<arr.length; i++) {if(arr[i]<min){min = arr[i];}}return m;</span>
C:排序
int[] arr = {66,55,44,33,22,11};
**选择排序
原理:如果拿0角标上的元素依次和后面的元素进行比较,
第一次内循环结束后,最小值出现在了0角标位置。
arr[0]与arr[1-5]比了五次
arr[1]与arr[2-5]比了四次
arr[2]与arr[3-5]比了三次
arr[3]与arr[4-5]比了二次
arr[4]与arr[5]比了一次
你就想想我们是如何打星星
*****
****
***
**
*
arr[x]与arr[y]比较
数组长度是6
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;}}}**冒泡排序
原理:两个相邻元素进行比较,第一次比较完以后,最大值出现在了最大角标处。
第一次:arr[0]与arr[1],arr[1]与arr[2],arr[2]与arr[3],arr[3]与arr[4],arr[4]与arr[5],比了五次
第二次:arr[0]与arr[1],arr[1]与arr[2],arr[2]与arr[3],arr[3]与arr[4]比了四次
第三次:arr[0]与arr[1],arr[1]与arr[2],arr[2]与arr[3]比了三次
第四次:arr[0]与arr[1],arr[1]与arr[2]比了二次
第五次:arr[0]与arr[1]比了一次
for (int x = 0;x < arr.length - 1; x++){//-1防止角标越界//-x为了提高效率for (int y = 0;y < arr.length - 1 - x;y++){//6if (arr[y] > arr[y+1]){int temp = arr[y];arr[y] = arr[y+1];arr[y+1] = temp;}}}
D:传递参数
**调用的时候,传递是基本类型的值的时候,形参改变对实参没有任何影响。
**调用的时候,传递是引用类型的地址的时候,形参改变对实参有直接影响。
(8)数组初始化过程
<1> 主函数进栈,然后在main()中有一个数组的引用arr
<2> 在堆内存中开辟空间,分配内存地址值
<3> 在堆内存中建立数组对象,并进行默认初始化
<4> 如果有显示初始化值的,对它进行显示初始化
<5> 将内存地址赋给栈内存中的arr变量
class ArrayTest4 {public static void main(String[] args) {int num = 5476;int[] array = new int[7];int count = 0;//取出每一位,并且反转,存储在一个数组中,并且表示了最大的索引count - 1while(num > 0){array[count] = num % 10;//num1 = 6num = num / 10;//num = 547count++;}//然后将每位数字都加上5,再用和除以10的余数代替该数字;for(int i=0 ; i < count ; i++){array[i] = (array[i] + 5) % 10;}//然后将第一位数字和最后一位数字交换。int temp = array[0];array[0] = array[count - 1];array[count - 1] = temp;//打印最终数组for(int i = 0 ; i < count ; i++){System.out.print(array[i]);}System.out.println();}}二维数组
(1)int[][] arr = new int[3][2];arr[1][0]
A:定义了名称为arr的二维数组
B:二维数组中有3个一维数组
C:每一个一维数组中有2个元素
D:一维数组的名称分别为arr[0], arr[1], arr[2]
arr[0][0] arr[0][1]
arr[1][0] arr[1][1]
arr[2][0] arr[2][1]
arr:二维数组名
arr[1]:二维数组中的第二个一维数组名
arr[1][1]:二维数组中的第二个数组的第二个元素
E:给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78;
(2)格式2:int[][] arr = new int[3][];
A: 二维数组中有3个一维数组
B: 每个一维数组都是默认初始化值null
C: 可以对这个三个一维数组分别进行初始化
arr[0] = new int[3];
arr[1] = new int[5];
arr[2] = new int[7];
(3)int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};arr[2].length
A:二维数组有3个一维数组。
B:第一个一维数组有3个元素
第二个一维数组有2个元素
第三个一维数组有4个元素
(4)二维数组的遍历
int[][] arr2 = new int[2][3];public static void printArray2(int[][] arr2){for(int i=0; i<arr2.length; i++){for(int j=0; j<arr2[i].length; j++){System.out.print(arr2[i][j]+" ");}System.out.println();}
二维数组的应用
求一年的销售总额。
public static void printArray2(int[][] arr2){int sum = 0;for(int i=0; i<arr2.length; i++){for(int j=0; j<arr2[i].length; j++){sum = sum + arr[i][j];}System.out.println("sum =" + sum);}}
数组的操作:
(1)查找
<span style="font-size:18px;">A:无序数组int[] arr = {33,22,11,44,55,66};public static int getIndex(int[] arr,int key) {for (int x = 0;x < arr.length;x++){if (key == arr[x]){return x;}}return -1;}</span>
B:有序数组 二分查找数组长度是6,最大角标值是5public static int getIndex(int[] arr,int key) {int min = 0;int max = arr.length-1;int mid = (min + max)/2;while (key != arr[mid]){if (key > arr[mid]){min = mid + 1;}else if (key < arr[mid]){max = mid - 1;}if (min > max){return -1;}mid = (min + max)/2;}return mid;}
(2)数组反转要求:给一个数组让其反转,而并不是反过来遍历public static void main(String[] args) {int[] arr = {3,2,1,5,4,6};//6,4,5,1,2,3;revArray(arr);System.out.println(print(arr));}
//定义反转的方法,经过分析我们发现需要对调的角标是两个变化的变量
//第一次让头角标和尾角标对调,然后让头角标自增,尾角标递减再对调
<span style="font-size:18px;">public static void revArray(int[] arr) {//int start = 0;//int end = arr.length-1;for (int start=0,end = arr.length-1;start<end ;start++, end--){//角标值每变化一次就对调一次int temp = arr[start];arr[start] = arr[end];arr[end] = temp;}}</span>
- 黑马程序员-java数组
- 黑马程序员-数组
- 黑马程序员_数组
- 黑马程序员-----数组
- 黑马程序员-java数组
- 黑马程序员_day04 数组。
- 黑马程序员_数组
- 7.黑马程序员-数组
- 黑马程序员_数组
- 黑马程序员-数组
- 黑马程序员_数组
- 黑马程序员-数组
- 黑马程序员_数组
- 黑马程序员--java数组
- 黑马程序员--数组
- 黑马程序员---数组
- 黑马程序员--关于数组
- 黑马程序员-数组
- wikioi3258 梭哈游戏 模拟
- Python 多版本管理工具
- 成佩涛-wifi隐藏模式钓鱼
- Phonegap2.9.0本地打包html成ios应用
- Fingerping web application use png
- 黑马程序员 数组
- 双目视觉嵌入式移植校正图像所遇到的问题
- java中的堆、栈和常量池
- 嵌入式开发学习路线图
- 嵌入式系统开发学习如何起步、如何深入?
- windows下用vs2010编译ffmpeg
- 杭电 Digital Roots
- 光棍节的快乐
- 11_数值的整数次方