java 自学日志【四】---数组

来源:互联网 发布:剑三正太捏脸数据图片 编辑:程序博客网 时间:2024/05/16 14:45
------android培训,java培训,期待与您交流------
-------数组-------
概念:同一种类型数据的结合!

特点:可以自动给数组中的元素从0开始编号,以方便对数组进行操作!

格式1: 元素类型[ ]   数组名  =  new 元素类型[元素个数或数组长度];// new 关键字,用来操作存储数据;
  
              或者  元素类型  数组名[ ]   =  new 元素类型[元素个数或数组长度]  也可以;

              如:int[]  arr = new int [2];或者  int arr[]= new int [2];

格式2元素类型[ ]   数组名  =  new 元素类型[] {1,2,3,4,6,7};// 此时[]里不可以写数组的长度
    
             或者   元素类型[]  数组名 = {1,1,3,4,5,6,...};

             如:int [] arr= new int []{1,3,4,56,45};或者  int [] arr = {1,2,3,4,5};

了解下java内存结构:java程序在运行时,需要在内存中分配空间,主要划分了五个区!
 
① 栈内存:又叫栈空间,用于存储局部变量,当数据使用完,所占内存空间会自动释放。
     (局部变量:定义在方法(函数) 中或参数上的变量,如 for循环里的变量,存于栈内存中。

② 堆内存:存储数组和对象,通过new建立的实例都存放在堆内存中,每一个实例在堆内存中都有内存地址值,实体
                     中的变量,都有默认初始化值(引用类型为 null,int是0,double是0.0,float是0.0f,boolean是false),
                    当实体不在被使用,会在不确定时间内,被垃圾回收器回收。

③方法去 ④本地方法去 ⑤寄存器这三个分区会在以后内容讲到

数组中操作常见的问题:
① 数组角标越界异常:java.lang.ArrayIndexOutOfBoundsException,int[] arr = new int [2];System.out.println(arr[2]);
② 空指针异常:java.lang.NullPointerException  int[] arr = null;System.out.print(arr[1]);

数组中常见的操作:
①获取最大值或最小值,以最大值为例,代码如下:
class ArrayTest{public static void main(String[] args){int[] arr={1,4,3,6,8,13,23,33,12,9};int max=getMax(arr);System.out.println(max);}public static int getMax(int[] arr){int max=arr[0];if(arr!=null)for(int x=1;x<arr.length;x++){if(arr[x]>max)max=arr[x];}return max;}}

② 数组排序,选择排序和冒泡排序,代码如下:
选择排序:最值出现在0角标位置上,下面是由小到大排序
class ArrayTest{public static void main(String[] args){int[] arr={1,4,3,6,8,13,23,33,12,9};sort(arr);printArray(arr);}public static void sort(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){System.out.print("[");for(int x=0;x<arr.length;x++){if(x!=arr.length-1)System.out.print(arr[x]+", ");elseSystem.out.println(arr[x]+"]");}}}

冒泡排序:相邻两个元素比较,符合条件换位,最值出现在最后位。
class ArrayTest{public static void main(String[] args){int[] arr={1,4,3,6,8,13,23,33,12,9};sort(arr);printArray(arr);}public static void sort(int[] arr){for(int x=0;x<arr.length-1;x++)for(int y=0;y<arr.length-x-1;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){System.out.print("[");for(int x=0;x<arr.length;x++){if(x!=arr.length-1)System.out.print(arr[x]+", ");elseSystem.out.println(arr[x]+"]");}}}

③ 查找数组中某一元素第一次出现的位置,若不存在,返回-1。
class ArrayTest{public static void main(String[] args){int[] arr={1,4,3,6,8,13,23,33,12,9};int a=search(arr,4);System.out.println(a);}public static int search(int[] arr,int key){for(int x=0;x<arr.length;x++){if(arr[x]==key)return x;}return -1;}

折半查找,前提是要求数组是有序的,如果无需则先排序,再查找。
class ArrayTest{public static void main(String[] args){int[] arr={1,4,3,6,8,13,23,33,12,9};sort(arr);int a=search(arr,6);System.out.println(a);}public static void sort(int[] arr){for(int x=0;x<arr.length-1;x++)for(int y=0;y<arr.length-x-1;y++){if(arr[y]>arr[y+1]){int temp=arr[y];arr[y]=arr[y+1];arr[y+1]=temp;}}}public static int search(int[] arr,int key){int max=arr.length-1,min=0,mid;while(max>=min){mid=(max+min)/2;if(key>arr[mid])min=mid+1;else if(key<arr[mid])max=mid-1;else return mid;}return -1;}}

④ 进制转换
public class BaseTrans {        public static void main(String[] args) {          toBin(60);          toHex(60);          toOct(60);      }      //十进制转化成二进制      public static void toBin(int num){          trans(num, 1, 1);      }      //十进制转化成八进制      public static void toOct(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){          //查表法,定义表          char[] chs={'0','1','2','3','4','5','6','7',                      '8','9','a','b','c','d','e','f'};          //定义一个数组,将每次取出的值,查表后存入该数组中。          char[]  res=new char[32];          //定义指针偏移量,记录从后往前存入数组时,最后一个存入元素的位置。int pos=res.length;          while(num!=0)//有效数字取完则结束循环{              int temp = num&base;//取最低的offset位的值。              res[--pos]=chs[temp];//将值存入结果数组中              num =num >>> offset;//无符号右移offset位。          }                    //打印结果          for(int x = pos;x<res.length;x++){              System.out.print(res[x]);          }          System.out.println();             }    } 

-------二维数组------
数组中的每一个元素又是一个数组。int[] []  arr,arr就表示一个二维数组的引用,前边有几个[ ] 维度就是几

格式①: int [] [] arr = new int[4] [5]; 这表示定义了一个二维数组,二维数组长度是4,它里边有4个一维数组,每个一维数组有5个元素,一维数组的每个元素的初始化值为0。
 int[][]  arr = new int[4] [ ];它也是定义了一个二维数组,它里边也有4个一维数组,但每个一维数组里边有几个元素未定,其初始化值为null,所以不能直接调用一维数组的元素,此时打印 arr[]值为null,可以分别对每个一维数组其进行初始化。如下:
arr[0]= new int[2]; arr[1]= new int[3]; arr[2]= new int[5]; arr[3]= new int[3]; 此时就给二维数组中的每一个一维数组定义了长度。
此时 我们打印 arr[0],是打印的地址,而打印 arr[0][1]是打印它元素,值为0。

格式②:int[] [] arr = {{1,2,3},{4,5,6,7},{8,9,10}};不仅定义了二维数组的长度,还定义了二维数组的内容。
注意:int [] x,y[ ];此时y是一个二维数组,x是一个一维数组。另外不能这样写:int [] [] arr = new int [ ] [ 4],必须先明确一维数组的个数,然后再明确一维数组每个元素的个数。