(06)Java学习笔记——数组
来源:互联网 发布:荣威erx5 知乎 编辑:程序博客网 时间:2024/05/21 08:36
数组:
同一种类型数据的集合,就是一个数据的容器。
多个变量的数据类型要一致。
数组可以存储基本数据类型,也可以存储引用数据类型。
数组初始化:(就是为数组开辟空间,并为每个数组元素赋值)
java中的数组必须先初始化才能使用。
所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值
数组的初始化方式:
动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。
静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。
数组的格式1(动态初始化):(需要一个容器,但是不明确容器中的具体数据)
元素类型[ ] 数组名 = new 元素类型[元素个数或数组长度]; // 用关键字new来建立数组
示例:int [ ] array = new int [ 5 ]; // 数组一建立,必须明确数组长度!
数组的格式2(静态初始化):(需要一个容器,存储已知的具体数据)
元素类型 [ ] 数组名 = new 元素类型 [ ] {元素1,元素2,元素3,……}
示例:
int [ ] array = new int [ ] {2,4,5,7}; //常规初始化方式
int [ ] array = {2,4,5,7}; //静态初始化方式
**//动给数组中的数据进行角标编号(从0开始),方便操作这些元素。
范例:
class ArrayDemo {public static void main(String[] args) {int [] array=new int[]{5,8,13,64,9}; //定义了一个数组,并在数组中给了元素。System.out.println(array[1]); //打印数组中1角标对应的元素。}}
————————————————————————————————————————
栈内存:存储的都是局部变量。变量所属的作用一旦结束,该变量就自动释放。
堆内存:储存的是数组和对象(其实数组就是对象)凡是new就建立在堆中。
每个new出来的东西都有首地址值。
堆内存中的每个变量都有默认初始化值,根据类型的不同而不同。
局部变量:在方法定义中 或者 方法声明上的变量都称为局部变量。
————————————————————————————————————————————
练习01:
定义一个数组,输出该数组的名称和数组元素值
给数组元素赋值,再次输出该数组的名称和数组元素值。
/*定义一个数组,输出该数组的名称和数组元素值给数组元素赋值,再次输出该数组的名称和数组元素值。*/class ArrayTest_01{public static void main(String[] args) {int [] array = new int[3];System.out.println(array);System.out.println(array[0]);System.out.println(array[1]);System.out.println(array[2]);System.out.println("----------------------");array[0] = 30;array[1] = 60;array[2] = 90;System.out.println(array[0]);System.out.println(array[1]);System.out.println(array[2]);}}
练习02:
定义一个数组,给数组元素赋值,输出数组名称和元素
定义第二个数组,给数组元素赋值,输出数组名称和元素
定义第三个数组,把第一个数组的地址值赋值给它(注意类型一致),通过第三个数组的名称去吧元素重新赋值,再一次输出第一个数组名称和元素。
栈内存的两个引用指向同一个堆空间
class ArrayTest_02 {public static void main(String[] args) {int [] array1 = new int [3];array1[0] = 33;array1[1] = 55;array1[2] = 88;System.out.println(array1);System.out.println(array1[0]);System.out.println(array1[1]);System.out.println(array1[2]);System.out.println("--------------------------");int [] array2 = new int [4];array2[0] = 13;array2[1] = 21;array2[2] = 89;array2[3] = 19;System.out.println(array2);System.out.println(array2[0]);System.out.println(array2[1]);System.out.println(array2[2]);System.out.println(array2[3]);System.out.println("---------------------------");int [] array3 = array1;//将array1数组的地址给了array3,array3依据地址指向堆内存中的array1内存空间array3[0] = 6;//array3[1] = 8;array3[2] = 5;System.out.println(array1);System.out.println(array1[0]);//因为array1的地址给了array3,array3的重新赋值改变了array1中的元素。System.out.println(array1[1]);System.out.println(array1[2]);}}
————————————————————————————————————————————————
数组常见的操作:
对数组的操作动作就是“存”和“取”。实际上就是对角标的操作。
1/数组的遍历
**数组长度的固定语句: 数组名.length 例如:array.length
class ArrayTest01 { public static void main(String[] args) { int[] array=new int[]{23,4,12,55,29};//定义一个数组,及初始化数组的元素 for (int x=0;x<array.length ;x++ )// 用数组的长度语句控制循环次数。array.length { System.out.println("array["+x+"]="+array[x]+";");//用循环语句遍历数组中的0开始的全部角标,并把相对应的值打印出来 } System.out.println("length:"+array.length); //统计数组并打印出数组的长度值。 } }
遍历数组的方法:
两个明确:
1 / 返回值类型 :void
2/ 参数列表:int [ ] array
数组的一个属性,数组长度 :数组名 . length
class ArrayTest_03 {public static void main(String[] args) {int [] array = new int[] { 3,6,88,33,12,5,66,47,29};//声明一个数组,并静态初始化赋值printArray(array);//调用打印数组的方法}public static void printArray(int[] array)//创建一个遍历打印数组的方法{for (int x=0;x<array.length ;x++ ){System.out.println(array[x]);}}}
2/数组取最值
思路:
1/1需要进行比较,并定义变量来记录每次比较厚较大的值。
2/对数组中的值遍历取出和变量中的值进行比较,取出较大值。
class ArrayTest02 {public static void main(String[] args) {int [] array=new int[]{34,55,22,7,98,12,67}; //定义一个数组并初始化了元素int getmax=max(array); //调用名为max的方法,将最大值赋给getmaxSystem.out.print(getmax); //打印数组中的最大值}public static int max(int[] array) //定义了一个方法,用来遍历比较数组中的元素,取出最大值{int max=0;for (int x=0;x<array.length ;x++ ){if (array[x]>max){max=array[x];}}return max;}}
3/ 数组元素逆序
/*数组的逆序分析:把数组角标0的元素和array.length-1的数据交换把数组交表1的元素和array.length-2的数据交换。。。。。只要做到array.length/2的位置*/class ArrayTest_05{public static void main(String[] args) {int [] array = new int[] {2,3,4,5,6,7,8,9,10,11,12};printArray(array);//调用打印方法,打印逆序前的数组System.out.println();reverce(array); //调用逆序方法printArray(array);//调用打印方法,打印逆序后的数组//System.out.println("["+array+"]");}public static void reverce(int[] array)//定义一个位置交换的方法{for (int x=0;x<=array.length/2 ;x++ ){int temp = array[x];array[x] = array[array.length-1-x];array[array.length-1-x] = temp;}}public static void printArray(int[] array)//定义一个遍历打印数组的方法{for (int x=0;x<array.length ;x++ ){System.out.print(array[x]+",");}return ;}}
4 / 数组查表法
根据键盘录入索引,查找对应星期
/*数组查表法根据键盘输入索引,查找对应星期*/import java.util.Scanner;class ArrayTest_06{public static void main(String[] args) {String [] weekArray = new String[] {"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};Scanner sc = new Scanner(System.in);System.out.println("输入数据");int x = sc.nextInt();System.out.println("查找的是: "+weekArray[x]);//依据输入数值,查找数组中对应角标的元素并输出}}
5 / 查找数组元素对应角标
/*查找数组元素对应的角标*/class ArrayTest_07{public static void main(String[] args) {int [] array = new int[] {4,65,23,77,1,5,88,13};int index = getIndex(array,77);System.out.println(index);}public static int getIndex(int[] array,int value)//定义一个方法遍历数组并与查询值进行比较。{for (int x =0;x<array.length ;x++ ){if (array[x]==value){return x;}}return -1;}}
4/ 数组的排序
A / 数组的冒泡排序
范例:
package cn.itcsat_01;/* * 数组的的冒泡排序 */public class ArrayDemo {public static void main(String[] args) {// 定义一个数组int[] arr = { 24, 69, 80, 57, 13 };System.out.println("排序前:");printArray(arr);System.out.println("冒泡排序后:");bublleSort(arr);/*// 第一次比较for (int x = 0; x < arr.length-1-0; x++) {if (arr[x] > arr[x + 1]) {int temp = arr[x];arr[x] = arr[x + 1];arr[x + 1] = temp;}}System.out.println("第一次比较:");//结果:[24, 69, 57, 13, 80]printArray(arr);// 第二次比较//arr.length-1 是为了防止越界//arr.length -1 -1 是为了减少比较的次数for (int x = 0; x < arr.length-1-1; x++) {if (arr[x] > arr[x + 1]) {int temp = arr[x];arr[x] = arr[x + 1];arr[x + 1] = temp;}}System.out.println("第二次比较:");//结果:[24, 57, 13, 69, 80]printArray(arr);// 第三次比较for (int x = 0; x < arr.length-1-2; x++) {if (arr[x] > arr[x + 1]) {int temp = arr[x];arr[x] = arr[x + 1];arr[x + 1] = temp;}}System.out.println("第三次比较:");//结果:[24, 13, 57, 69, 80]printArray(arr);// 第四次比较for (int x = 0; x < arr.length-1-3; x++) {if (arr[x] > arr[x + 1]) {int temp = arr[x];arr[x] = arr[x + 1];arr[x + 1] = temp;}}System.out.println("第四次比较:");//结果:[13, 24, 57, 69, 80]printArray(arr);System.out.println("-----------------------------------");*//*//上面的代码可以用循环改进for(int y=0;y<arr.length-1;y++){for (int x = 0; x < arr.length-1-y; x++) {if (arr[x] > arr[x + 1]) {int temp = arr[x];arr[x] = arr[x + 1];arr[x + 1] = temp;}}}System.out.println("冒泡排序结果:");printArray(arr);*/}// 遍历功能public static void printArray(int[] arr) {System.out.print("[");for (int x = 0; x < arr.length; x++) {if (x == arr.length - 1) {System.out.print(arr[x]);} else {System.out.print(arr[x] + ", ");}}System.out.println("]");}//定义一个数组冒泡排序的方法:public static void bublleSort(int[] arr){for(int y=0;y<arr.length-1;y++){for (int x = 0; x < arr.length-1-y; x++) {if (arr[x] > arr[x + 1]) {int temp = arr[x];arr[x] = arr[x + 1];arr[x + 1] = temp;}}}printArray(arr);}}
B / 数组的选择排序
思想:
分别用数组内的元素进行遍历。
用第三个临时变量来换位,将小的元素移动到前面。
范例:
package cn.itcsat_02;/* * 数组的选择排序 */public class ArrayDemo {public static void main(String[] args) {// 定义一个数组int[] arr = { 24, 69, 80, 57, 13 };System.out.println("排序前:");printArray(arr);System.out.println("选择排序后:");selectSort(arr);/*// 第一次排序int x = 0;for (int y = 1; y < arr.length; y++) {if (arr[y] < arr[x]) {int temp = arr[x];arr[x] = arr[y];arr[y] = temp;}}System.out.println("第一次排序后:");printArray(arr);// 第二次排序//经过第一次排序后,0角标元素不再参与比较x = 0+1;for (int y = 1+1; y < arr.length; y++) {if (arr[y] < arr[x]) {int temp = arr[x];arr[x] = arr[y];arr[y] = temp;}}System.out.println("第二次排序后:");printArray(arr);// 第三次排序//经过第二次排序后,1角标元素不再参与比较x = 0+2;for (int y = 1+2; y < arr.length; y++) {if (arr[y] < arr[x]) {int temp = arr[x];arr[x] = arr[y];arr[y] = temp;}}System.out.println("第三次排序后:");printArray(arr);// 第四次排序//经过第三次排序后,2角标元素不再参与比较x = 0+3;for (int y = 1+3; y < arr.length; y++) {if (arr[y] < arr[x]) {int temp = arr[x];arr[x] = arr[y];arr[y] = temp;}}System.out.println("第四次排序后:");printArray(arr);System.out.println("----------------------------");//上面的过程可以简化成下列代码:for (int z=0;z<arr.length-1;z++){x = 0+z;for (int y = 1+z; y < arr.length; y++) {if (arr[y] < arr[x]) {int temp = arr[x];arr[x] = arr[y];arr[y] = temp;}}}System.out.println("选择排序后:");printArray(arr);*/}// 遍历数组的功能public static void printArray(int[] arr) {System.out.print("[");for (int x = 0; x < arr.length; x++) {if (x == arr.length - 1) {System.out.print(arr[x]);} else {System.out.print(arr[x] + ", ");}}System.out.println("]");}//定义一个选择排序的方法public static void selectSort(int[] arr){for (int z=0;z<arr.length-1;z++){int x = 0+z;for (int y = 1+z; y < arr.length; y++) {if (arr[y] < arr[x]) {int temp = arr[x];arr[x] = arr[y];arr[y] = temp;}}}printArray(arr);}}练习01:把字符串中的字符进行排序
举例:“dacgebf"
结果:”abcdefg"
package cn.itcast_03;/* * 把字符串中的字符进行排序 * 思路: * A/ 把字符串转换成字符数组 * B/ 通过对字符数组的排序后,得出符合顺序的字符数组 * C/ 将符合顺序的字符数组转成字符串 */public class ArrayTest_01 {public static void main(String[] args) {//定义一个字符串String s = "dacgebf";//把字符串转换成字符数组char[] chs =s.toCharArray();printArray(chs);bulleSort(chs);printArray(chs);//打印输出排序后的字符数组//将排序后的字符数组转成字符串String s1 = String.valueOf(chs);System.out.println(s1);}//定义一个遍历数组并打印数组的功能public static void printArray(char[] chs){System.out.print("[");for(int x=0;x<chs.length;x++){if(x==chs.length-1){System.out.print(chs[x]);}else{System.out.print(chs[x]+", ");}}System.out.println("]");}//定义一个数组排序的功能public static void bulleSort(char[] chs){for(int x=0;x<chs.length-1;x++){for(int y=0;y<chs.length-1-x;y++){if(chs[y]>chs[y+1]){char temp=chs[y];chs[y]=chs[y+1];chs[y+1]=temp;}}}}}
5/数组查找 (查找数组中某个元素对应的角标)
思路:用遍历方式查找。
范例:
class ArrayTest05 {public static void main(String[] args) {int[] array=new int[] {45,33,7,89,32,14,55};int index=getIndex(array,14); //给出需要寻找的元素System.out.print("index="+index); //打印出所寻找元素的对应角标}public static int getIndex(int[] array,int element) //定义一个方法,用于寻找某元素的角标{for (int x=0;x<array.length ;x++ ){if (array[x]==element){return x;}}return -1;}}
6/数组的二分查找(折半查找)
前提:数组元素是有序的
范例:
package cn.itcast_04;/* * 数组的折半查找 * 思路: * A/定义最大索引,最小索引 * B/ 计算中间索引 * C/ 拿中间索引的值和要查找的值进行比较 * 相等:就返回当前的中间索引 * 不相等:小:左边找 * 大:右边找 * D/ 重新计算出中间索引 * 大:左边找 max = mid-1; * 小:右边找 min = mid+1; * E/ 回到B * */public class ArrayDemo {public static void main(String[] args) {// 定义一个数组int[] arr = { 11, 22, 33, 44, 55, 66, 77 };// 调用方法int index = getIndex(arr, 33);System.out.println(index);}// 写方法实现:/* * 两个明确: 1.返回值类型 2。参数列表 int[] arr, int value */public static int getIndex(int[] arr,int value){//定义最大索引,最小索引int max = arr.length-1;int min = 0;//计算中间索引int mid = (max+min)/2;//拿中间索引的值和要查找的值进行比较while (arr[mid]!=value){if(arr[mid]>value){max = mid-1;}else if(arr[mid]<value){min = mid+1;}//加入判断if(min>max){return -1;}mid =(max+min)/2;}return mid;}}
7/进制转换
8/查表法
————————————————————————————————————
二维数组(数组中的数组)
格式1:(动态初始化)
数据类型 [ ] [ ] 数组名 = new 数据类型 [m ] [n ]
m表示这个二维数组有多少个一维数组
n表示每个一维数组的元素个数
int[ ] [ ] array=new int [3] [2];
1/定义了一个名为array的二维数组
2/二维数组中有3个一位数组
3/每个一维数组中有2个元素
int [][] array=new int[3][2]; //定义一个二维数组。该数组中有3个一维数组,每个一维数组中有2个元素。System.out.println(array);//直接打印二维数组System.out.println(array[0]);//直接打印二维数组中的角标0的一维数组。System.out.println(array[0][0]);//直接打印二维数组中的角标0的一维数组中的角标为0的元素。
二维数组的内存图解
int[][] array=new int[3][2];System.out.println(array.length);//打印二维数组的长度,其实就是一维数组的个数System.out.println(array[1].length);//打印二维数组中角标为1的一维数组的长度。
格式2:(动态初始化)
数据类型 [ ] [ ] 数组名 = new 数据类型 [ m ] [ ]
m表示这个二维数组有多少个一维数组
没有给出一维数组的元素个数,可以动态给出。
int [ ] [ ] array = new int [ 3 ] [ ]
array[0]=new int [2 ];
array[1]=new int [1];
array[2]=new int [3];
格式3:
数据类型[ ] [ ] 数组名 = { {元素1,元素2,....},{元素1,元素2,元素3,...},{元素1,元素2,....}}
int[ ] [ ] array={{3,1,7},{4,6.2.9},{4,3,7}};
练习01:二维数组的遍历
用forfor循环嵌套方法遍历二维数组,
外循环控制的是二维数组的长度(一维数组的个数)
内循环控制的是一维数组的长度
/*二维数组的遍历分析:用forfor循环的思想*/class ArrayTest02_01 {public static void main(String[] args) {int [] [] array ={{2,6,11,54},{55,3,71,33,87},{23,17}};ergodic(array);//调用遍历方法}public static void ergodic(int [][] array)//定义一个用forfor循环遍历二维数组的方法{for (int x=0;x<array.length ;x++ ){for (int y=0;y<array[x].length ;y++ ){System.out.print(array[x][y]+", ");}System.out.println();}}}
练习02:公司年销售额求和
/*公司年销售额求和第一季度:22,66,44第二季度:77,33,88第三季度:25,45,65第四季度:11,66,99分析:定义二维数组int [季度数] [每季度销售额]定义一个统计方法forfor循环嵌套遍历数组将遍历出来的元素统计输出 */class ArrayTest02_02{public static void main(String[] args) {int [][] array = {{22,66,44},{77,33,88},{25,45,65},{11,66,99}};int result = arraySum(array);System.out.println("年销售额是"+result);}public static int arraySum(int [][] array){int sum = 0;for (int x=0;x<array.length ;x++ ){for (int y=0;y<array[x].length ;y++ ){sum = sum+array[x][y];}}return sum;}}
练习03:打印杨辉三角形
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
分析:
任何一行的第一列和最后一列都是1
从第三行开始,每一个数据都是它上一行的前一列和它上一行的本列之和。最后一列除外。
练习04:数据转换成数组进行操作
如何把数据转换成数组?:
a/定义一个数据:
int number = 123456;
b/定义一个数组,将数组长度定义8(不超过8位的数据)
c/获取每一个数据,然后赋值进数组
参考《流程控制——水仙花数》模运算的方法取出每一位数字。
- (06)Java学习笔记——数组
- Java学习笔记——数组
- JAVA学习笔记——数组
- JAVA学习笔记17——数组
- java学习笔记六——数组
- Java学习笔记——数组
- Java学习笔记——多维数组
- 学习笔记—java数组与练习
- java学习笔记(三)—数组
- Java学习笔记—数组的用法
- java数组学习笔记
- Java学习笔记--数组
- java学习笔记------数组
- java学习笔记 ---数组
- java学习笔记数组
- 【学习笔记】Java数组
- Java学习笔记-数组
- Java学习笔记-数组
- SpringMVC 引用BootStrap和jQuery
- python学习之Filter
- 表格头拖动、表格内容是否能选中
- Professional English
- flume集中处理日志
- (06)Java学习笔记——数组
- 常用英语
- 华为OJ--矩阵相乘
- gc算法与种类
- JavaWeb总结三十、EL函数库
- 架构概念
- CoreData 从入门到精通(六)模型版本和数据迁移
- ocx找不到指定模块
- mybatis+oracle+批量insert批量update