黑马程序员技术交流社区

标题: 关于数组的一些心得 [打印本页]

作者: 高盖茨    时间: 2015-12-6 15:49
标题: 关于数组的一些心得
数组:(引用类型)
        概述;用来存储同一类型元素的容器。
                  可以存基本类型,也可以存引用类型。
                  每个元素都有编号,并且编号是从0开始的。(编号:也叫下标,角标,索引)

                  根据索引获取指定位置的元素:
                                拿第三个元素: arr[2]
                                拿第六个元素: arr[5]
                                总结:
                                        拿哪个位置的元素,就相当于: 数组名[元素个数 - 1]
                                        最后一个元素的索引:        arr[数组长度 - 1];
        初始化:
                概述:
                        就是为数组开辟连续的内存空间,并且给每个数组元素赋值
                分类:
                        动态初始化:我们给长度,系统给默认值
                                数据类型[]        数组名        = new 数据类型[数组的长度或者元素的个数];
                                        推荐:int[] arr = new int[5];        //定义一个长度为5的 int类型的数组,数组名叫arr
                                变形:
                                        int arr[] = new int[5];//定义一个长度为5的 int类型的arr数组

                                各类型的默认值:
                                        基本类型:
                                                整型:0
                                                浮点型:0.0
                                                布尔:false
                                                字符:'\u0000'        每个0代表的是4位,也就是说,这个里边的0都是十六进制的。

                                        引用类型:
                                                null
                        静态初始化:我们给值,系统给长度
                                格式:
                                        int[] arr = new int[]{1,2,3,4,5};
                                        简化版:
                                                int[] arr = {1,2,3,4,5};        //推荐做法

                                        不要写成: int[] arr = new int[5]{1,2,3,4,5};  这种写法是错误的。

        可能遇到的问题:
                数组索引越界异常:ArrayIndexOutOfBoundsException。
                        访问了不存在的索引就会出这个问题。
                空指针异常:NullPointerException。
                        数组已经不存在了,我们还去使用它里边的东西。

        数组的常见操作:
                记忆:方法的功能越单一越好。

                数组的遍历:
                        数组的长度: 数组名.length
                        根据索引获取指定元素:  数组名[索引];
                        public static void print(int[] arr) {
                                //遍历数组的代码
                                for(int i=0; i<arr.length; i++) {
                                        System.out.println(arr[i]);
                                }
                        }

                最值(最大值,最小值)
                        int[] arr = {1,2,3,4,5};
                        思路:
                                1、定义一个统计变量max,用来记录最大值,初始值为 数组中的第一个元素值。
                                2、通过遍历,获取到数组中的每一个元素,然后依次和max进行比较。
                                        如果大了,就把当前遍历到的值给 max
                                        如果小了,什么都不操作。
                                3、循环结束后,max记录的就是最大值。

                        用方法来做:
                                分析:
                                        返回值的数据类型:int
                                        参数列表:int[] arr
                                public static int getMax(int[] arr) {
                                        int max = arr[0];                //定义一个统计变量max,用来记录最大值
                                        for(int i=1; i<arr.length; i++) {        //通过遍历,获取到数组中的每一个元素
                                                //arr[i] 就是遍历到的每一个元素
                                                if(max < arr[i]) {        //依次和max进行比较
                                                        max = arr[i];                                               
                                                }                                       
                                        }
                                        return max;
                                }

                反转:
                        1,2,3,4,5    5,4,3,2,1
                        5,2,3,4,1        第一个和最后一个交换        arr[0]        arr[arr.length-1-0]
                        5,4,3,2,1        第二个和倒数第二个交换        arr[1]        arr[arr.length-1-1]
                                                第三个和单数第三个交换        arr[2]        arr[arr.length-1-2]
                                                ......................        arr[i]  arr[arr.length-1-i]

                        关键点:
                                交换的次数:数组的长度/2
                                谁和谁交换:arr[i] 和 arr[arr.length-1-i]

                        用方法来做:
                                返回值的数据类型:void
                                参数列表:int[] arr
                                public static void reverse(int[] arr) {
                                        for(int i=0; i<arr.length/2; i++) {
                                                int temp = arr[i];
                                                arr[i] =  arr[arr.length-1-i];
                                                arr[arr.length-1-i] = temp;
                                        }

                                }
                查表法:
                        解释:根据 索引(index) 去找 数组中的指定元素
                        public static char getElement(int week) {
                                char[] chs = {' ','一','二','仨','四','五','六','日'};
                                return chs[week];
                        }

                基本查找:
                        解释:找元素在数组中 对应的索引
                        思路:
                                1、遍历数组,获取到每一个元素。
                                2、依次和要查找的值(value)进行比较,
                                        如果相等,就返回该索引。
                                        如果不等,接着循环,进行下一次比较。
                                3、如果循环都结束了,还没有找到,那么就说明数组中没有这个元素,索引就返回-1.
                        定义方法:
                                返回值类型:int
                                参数列表:int[] arr, int value(值)
                                public static int getIndex(int[] arr,int value) {
                                        for(int i=0; i<arr.length; i++) {
                                                //arr[i]就是遍历到的每一个元素
                                                if(arr[i] == value) {
                                                        return i;
                                                }
                                        }
                                        //走到这儿了,说明循环都结束了,还没有找到这个元素,就返回-1
                                        return -1;
                                }

        内存:
                栈:掌握
                        存的是局部变量, 所有代码的执行也是在栈中完成
                        局部变量:定义在方法中,或者方法声明上的变量。
                        栈的特点: 先进(压栈)后出(弹栈)。


                堆:掌握
                        所有new出来的东西(对象)。
                        所有new出来的东西都有自己的地址值。
                                地址值的组成:类名缩写 + @ + 该对象的哈希值的无符号 十六进制形式组成。
                方法区:
                        代码区,方法区,静态区,常量池(String常量池,byte常量池)
                本地方法区:
                        存的是本地方法。
                寄存器:
                        和CPU相关的一些东西。

                三个数组:
                        int[] arr1 = new int[3];
                        int[] arr2 = new int[3];
                        int[] arr3 = arr2;

二维数组:       
        概述:每个元素都是 一维数组的 数组。
        格式:
                格式1:规则的矩形。
                        int[][] arr = new int[3][2];                               
                        变形为:
                                int[] arr[] = new int[3][2];
                                int arr[][] = new int[3][2];

                        解释:
                                3:代表二维数组中 有3个一维数组
                                2:代表每个一维数组有两个元素。
                                arr[2]:        代表的是 二维数组的第三个元素(第三个一维数组)
                                arr[1][2]: 代表的是二维数组的 第二个元素(第二个一维数组)的第三个元素
                格式2:不规则的矩形。
                        int[][] arr = new int[5][];
                        /*arr[0] = new int[2];
                        arr[1] = new int[2];
                        arr[2] = new int[2];*/
                格式3:
                        int[] arr = {1,2,3,4,5};
                        int[][] arr = { {1,2,3},{4,5},{6,7,8}};
                常见操作:
                        int[][] arr = { {1,2,3},{4,5},{6,7,8,9}};
                        数组名.length
                                1,2,3
                                4,5
                                6,7,8,9
                        遍历:
                                思路:
                                        1、通过for遍历二维数组,获取到每一个元素(一维数组)。
                                        2、一维数组的遍历我们讲过了。
                                for(int i=0; i<arr.length; i++) {//遍历二维数组,获取到每一个元素(一维数组)
                                        //arr[i]就是当前遍历到的元素,也就是一维数组
                                        for(int j=0; j<arr[i].length; j++) {
                                                System.out.print(arr[i][j] + " ");
                                        }
                                        System.out.println();
                                }
                        求和:
                                思路:
                                        1、定义一个统计变量sum,来记录和。
                                        2、遍历二维数组,获取到每一个元素(一维数组)
                                        3、继续遍历获取到的一维数组,然后获取到每一个元素,和sum累加即可。
                                        int sum = 0;
                                        for(int i=0; i<arr.length; i++) {//遍历二维数组,获取到每一个元素(一维数组)
                                                //arr[i]就是当前遍历到的元素,也就是一维数组
                                                for(int j=0; j<arr[i].length; j++) {
                                                        //arr[i][j]
                                                        sum += arr[i][j];
                                                }
                                }

Java中的参数传递问题:
        Java中只有值传递,引用传递传递的是地址值。
        如果方法的形参是:
                基本类型:形参的改变对实参没有影响。
                引用类型:形参的改变直接影响实际参数(String类有点特殊,常用API讲)。



               
                反转:
                        数组元素是 1,2,3,4,5,打印结果就是:5,4,3,2,1
                       
                基本查找:
                        给定一个值,然后找它在数组中的索引,存在就返回该索引,不存在就返回-1
                                比如说:
                                        找元素值为3的索引,返回值就是2
                                        找元素值为6的索引,返回值就是-1
                                               



作者: 舞动炫龙    时间: 2015-12-6 16:42
赞一个。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2