黑马程序员——Java基础语法---数组
2015-08-08 15:09
579 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
一、概念
同一种类型数据的集合。简单的来说就是一容器,用来装东西的。
使用数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。
二、一维数组的格式
格式1:元素类型 [ ]数组名 = new 元素类型 [元素个数或数组长度] ;
如: int [] arr = new int [3]; 也可以写成: int arr[] = new int[3];
格式2:元素类型 []数组名 = new 元素类型 [ ]{元素1,元素2,…};
如: int [] arr = new int []{1,2,3,4,5};
还有一种简写的静态初始化格式:如: int [] arr={1,2,3,4,5};
特别注意:int[] x,y[]; //x一维,y二维。int[] x;int[] y[];
其中:new是用来在堆内存中产生一个容器实体。
1、System.out.println(arr);得到的结果是一个哈希值,也叫地址值。
2、数组在堆内存开辟空间后,就有默认的初始化值。如:int默认0;boolean默认false。
内存小知识:
Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,有对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放。 //存在时间短
堆内存:1、数组和对象,通过new建立的实例都存放在堆内存中。 //存在时间较久
2、每一个实体都有内存地址值。
3、实体中的变量都有默认初始化值。
4、实体不在被使用,会在不确定的时间内被垃圾回收器回收。
三、数组操作常见问题
1、数组脚标越界异常(ArrayIndexOutOfBoundsException)。例:
int[] arr = new int[2];
System.out.println(arr[3]);
访问到了数组中的不存在的脚标时发生。
2、空指针异常(NullPointerException)。例:
int[]arr = null;
System.out.println(arr[0]);
arr引用没有指向实体,却在操作实体中的元素时。
四、数组中的数组
也称多维数组,这里我们主要讲二维数组。
格式1: int[][] arr= new int[3][2];
解释:以上格式表示定义了名称为arr的二维数组。有3个一维数组,每一个一维数组中有2个元素。一维数组的名称分别为arr[0],arr[1],arr[2]。给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78。
格式2: int[][] arr= new int[3][];
注:此种格式中每个一维数组都是默认初始化值null。
格式3:int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};//每一个一维数组中具体元素都初始化了。
注:一种特殊定义写法:int[]x,y[]; x是一维数组,y是二维数组。
五、数组常见操作
1、 数组排序:
常见的排序方式:冒泡排序和选择排序。在Java已经定义好了一种排序方式,在开发使用中,直接调用即可。排序的方式有很多,其中最快的排序方式为希尔排序。
下面是我自己敲的选择和冒泡两种排序方式的程序:
2、 折半查找
3、数组的反转
4、实战演练 LuckNumber
一、概念
同一种类型数据的集合。简单的来说就是一容器,用来装东西的。
使用数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。
二、一维数组的格式
格式1:元素类型 [ ]数组名 = new 元素类型 [元素个数或数组长度] ;
如: int [] arr = new int [3]; 也可以写成: int arr[] = new int[3];
格式2:元素类型 []数组名 = new 元素类型 [ ]{元素1,元素2,…};
如: int [] arr = new int []{1,2,3,4,5};
还有一种简写的静态初始化格式:如: int [] arr={1,2,3,4,5};
特别注意:int[] x,y[]; //x一维,y二维。int[] x;int[] y[];
其中:new是用来在堆内存中产生一个容器实体。
1、System.out.println(arr);得到的结果是一个哈希值,也叫地址值。
2、数组在堆内存开辟空间后,就有默认的初始化值。如:int默认0;boolean默认false。
内存小知识:
Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,有对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放。 //存在时间短
堆内存:1、数组和对象,通过new建立的实例都存放在堆内存中。 //存在时间较久
2、每一个实体都有内存地址值。
3、实体中的变量都有默认初始化值。
4、实体不在被使用,会在不确定的时间内被垃圾回收器回收。
三、数组操作常见问题
1、数组脚标越界异常(ArrayIndexOutOfBoundsException)。例:
int[] arr = new int[2];
System.out.println(arr[3]);
访问到了数组中的不存在的脚标时发生。
2、空指针异常(NullPointerException)。例:
int[]arr = null;
System.out.println(arr[0]);
arr引用没有指向实体,却在操作实体中的元素时。
四、数组中的数组
也称多维数组,这里我们主要讲二维数组。
格式1: int[][] arr= new int[3][2];
解释:以上格式表示定义了名称为arr的二维数组。有3个一维数组,每一个一维数组中有2个元素。一维数组的名称分别为arr[0],arr[1],arr[2]。给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78。
格式2: int[][] arr= new int[3][];
注:此种格式中每个一维数组都是默认初始化值null。
格式3:int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};//每一个一维数组中具体元素都初始化了。
注:一种特殊定义写法:int[]x,y[]; x是一维数组,y是二维数组。
class Array2Demo {//目标:熟悉二维数组的存在,即一维数组中的组员为 // 一维数组 public static void main(String[] args) { /* int arr[]=new int [3];//新建一个一维数组,数组中有三个元素 int arr[][]=new int[3][4]//新建一个二维数组,3列4行 int arr[][]=new int[3][];//二维数组,有三个组员,组员中各有一维数组 arr[0][]=new int[3]; arr[1][]=new int[1]; arr[2][]=new int[2]; System.out.println(arr,length);//打印是二维数组的长度 3; System.out.println(arr[0].length);//打印二维数组中第一个一维数组长度 */ int arr[][] = {{3,5,1,7},{2,3,5,8},{6,1,8,2}}; //求数组中元素的和 //分析:二维数组需要使用双重for循环 //第一次遍历时x<arr.length //第二次遍历时y<arr[x].length int sum=0,x,y; for(x=0;x<arr.length;x++) { for(y=0;y<arr[x].length;y++) { sum=sum+arr[x][y]; } } System.out.println("数组和为:"+sum); } }
五、数组常见操作
1、 数组排序:
常见的排序方式:冒泡排序和选择排序。在Java已经定义好了一种排序方式,在开发使用中,直接调用即可。排序的方式有很多,其中最快的排序方式为希尔排序。
下面是我自己敲的选择和冒泡两种排序方式的程序:
import java.util.*; /* 对给定数组进行排序。 {5,1,6,4,2,8,9}*/ class ArrayTest2 { public static void swap(int arr[],int a,int b) {/* 分析:无论哪一种排序都需要交换,为了提高代码的复用率 独立将交换函数封装 */ int temp=arr[a]; arr[a]=arr[b]; arr[b]=temp; } public static void selectSort(int arr[])//分析:选择排序 { /*分析:选择排序:原理是将遍历一遍数组将最小值放到最前面 之后遍历便从角标1开始,如此重复, 直到遍历到arr.length-2为止 */ for(int x=0;x<arr.length-1;x++)//外循环遍历数组 { for(int y=x+1;y<arr.length;y++)//内循环比较大小 { if(arr[x]>arr[y]) swap(arr,x,y); } } } public static void VubbleSort(int arr[])//分析:冒泡排序 { for(int x=0;x<arr.length-1;x++)//原理是从零角标开始,相邻角标元素值大的往后面放, { //因此遍历一次后,该数组最大的元素在最后面 for(int y=0;y<arr.length-x-1;y++)//-x:让每一次比较的元素减少。-1:避免角标越界。 { if(arr[y]>arr[y+1]) swap(arr,y,y+1); } } } public static void printArray(int arr[]) { sop("{"); for(int x=0;x<arr.length;x++)//打印数组的格式 {x,x,x,x,x......} { if(x!=arr.length-1) sop(arr[x]+","); else sop(arr[x]+"}"); } sop("\n"); } public static void main(String[] args) { int arr[]={5,1,6,4,2,8,9}; sop("数组排序前:"); printArray(arr); //VubbleSort(arr); selectSort(arr); sop("数组排序后:"); printArray(arr); } public static void sop(Object obj) { System.out.print(obj); } }
2、 折半查找
class ArrayTest4 {/* 数组的查找操作。 练习:有一个有序的数组,想要将一个元素插入到该数组中, 还要保证该数组是有序的。如何获取该元素在数组中的位置。 分析:通过折半查找寻找出元素应该所属的角标 之后创建新的数组存储,新的数组 */ public static int halfSearch(int arr[],int key)//传递进来的是有序的数组 和要查找的元素 { //返回的是该元素应该在的位置 int low=0,high=arr.length,num; for(num=(low+high)/2;low<high;num=(low+high)/2)//将数组的两端low+high 除二 取出该位置num的元素与要查找的元素比较 { if(key==arr[num]) return num+1; //如果查找到元素值相同 ,则返回的位置为num+1; else { if(key>arr[num])//若要查找的元素大,则将num加1的所在位置 传递给 low low=num+1; else high=num-1;//若要查找的元素小 则将num减1的所在位置 传递给 high } } return low; //如果没有查找到元素与之相同,则返回 low ,这个low便是如果元素要插入这个数组,该元素应该存在的位置 } public static void sop(Object obj)//打印 任何对象 { System.out.println(obj); } public static int getIndex(int arr[],int key)//按照数组的顺序 查找 有没有与要查找元素相同的元素(该数组可以无序) { int x; for(x=0;x<arr.length;x++) { if(key==arr[x]) return x; //如果有则返回位置 } return -1; //没有则返回-1 } public static void main(String[] args) { int arr[]={2,4,5,7,8,19,32,45}; int arr1[]={3,2,1,5,4,2,9}; int x=halfSearch(arr,9); int y=getIndex(arr1,5); System.out.print('{'); for(int a=0;a<arr.length-1;a++) System.out.print(arr[a]+","); System.out.print(arr[arr.length-1]);//打印arr数组 System.out.println('}'); sop(x); sop(y); } }
3、数组的反转
/* 对给定的数组进行反转。 {3,1,5,6,2} ---> {2,6,5,1,3} 分析:要反转数组,只要将数组的首尾依次互换 而一个数组有奇偶,然而要反转的次数是确定的即 int x=arr.length/2. 因此只需要调用循环就可以了 */ class ArrayTest3 { public static void reverseArray(int arr[]) { for(int start=0,end=arr.length-1; start<end ; start++,end--)//取出起始位和末尾位,只要起始位能够小于末尾位 { //即还有未交换位置的元素,之后将起始位增1,末尾位减1 int temp=arr[start]; arr[start]=arr[end]; //交换两个位置所在的元素 arr[end]=temp; } } public static void printArray(int arr[]) //打印数组的格式 {x,x,x,x......} { sop("{"); for(int x=0;x<arr.length;x++) { if(x!=arr.length-1) sop(arr[x]+","); else sop(arr[x]+"}"); } sop("\n"); } public static void sop(Object obj) //打印任何对象 { System.out.print(obj); } public static void main(String[] args) { int arr[]={3,1,5,6,2};//创建数组 sop("交换前的数组为"); printArray(arr); reverseArray(arr); sop("交换后的数组为"); printArray(arr); } }
4、实战演练 LuckNumber
class LuckNumber { /*有n个小朋友手拉手围成圈,编号为1~n,小朋友轮流从1开始报数报到m, 报到m的自动退出该圈,游戏到最后剩下的是几号小朋友? 分析:将小朋友的个数存到数组中, 当报到m时,将该数组元素变成0; 当碰到0时,指针自动读取下一个元素, 当报到最后一个时,指针跳到0角标,从新开始 */ public static void sop(Object obj)//打印任何对象 { System.out.print(obj); } public static int getLuck(int arr[],int m) { int pos=-1,num=0; for(int x=0;x<arr.length-1;x++) //取出元素个数-1的个数,目的取出唯一剩到最后的元素 { for(int y=0;y<m;y++)//每次数过m个非零的元素时,使该元素变为零 { pos++; if (pos==arr.length) pos=0; while(arr[pos]==0) {pos++; if (pos==arr.length) { pos=0; } } } arr[pos]=0; } for(int t=0;t<arr.length;t++)//寻找 { if (arr[t]!=0) { num=arr[t]; } } return num; } public static void main(String[] args) { int n=3,arr[]=new int ;//建立数组,通过for循环将1~12传入数组 for(int i=1;i<=arr.length;i++) { arr[i-1]=i; } sop(getLuck(arr,2));//将数组和被淘汰的号码传入 } }
相关文章推荐
- 黑马程序员——20,IO流,FileWriter,FileReader
- 程序员面试宝典(第四版)——读书笔记-1、第五章:程序设计基本概念
- 剑指offer面试题46:求1+2+...+n
- 黑马程序员--Java面向对象理解
- 【黑马程序员】Java笔记--集合框架
- 做一个有情操的程序员:论那没卵用的磁贴
- 剑指offer面试题4-- 替换空格
- 【转】2012年6月25 – 某欧美上市企业PHP工程师最新面试题
- 【面试题】从网上看到的一道面试题之自我见解
- 你面试微软前必须要读的十本书:
- 面试题:在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字
- 程序员保值的五个关键点
- 【剑指Offer面试题】 九度OJ1372:最大子向量和(连续子数组的最大和)
- “反应快”的程序员更优秀吗?
- 黑马程序员——-——java基础之异常
- 2014百度面试题
- 【LeetCode-面试算法经典-Java实现】【104-Maximum Depth of Binary Tree(二叉树的最大深度)】
- 【LeetCode-面试算法经典-Java实现】【102-Binary Tree Level Order Traversal(二叉树层序遍历)】
- 【LeetCode-面试算法经典-Java实现】【103-Binary Tree Zigzag Level Order Traversal(二叉树分层Z字形遍历)】
- 黑马程序员——数组转换(二进制-八进制-十六进制)-第6天