Java语言基础9--引用数据类型之数组

什么是数组

数组是一种数据结构,用来存储同一类型的集合.
数组中的每一个数据称之为数组元素,数组中的元素以索引来表示其存放的位置,索引从0开始.

数组的定义

第一种方式:类型[] 数组名; 如 int[] nums; **
第二种方式:
类型 数组名[]; 如 int nums[];**
大多数Java程序员喜欢使用第一种风格,因为它把数据类型int[],和变量名num分开了.

数组的初始化

Java中数组必先初始化后才能使用.
初始化就是给数组元素分配内存,并为每个元素赋初始值。

初始化数组的两种方式:
- 静态初始化:
语法格式:类型[] 数组名 = new 数组类型[]{元素1,元素2,元素3,...元素n};
简化语法:类型[] 数组名 = {元素1,元素2,元素3...元素n};
- 动态初始化:
如果我们事先不知道数组里存储哪些数据,只知道需要存储数据的个数,此时可以使用动态初始化方式。
动态初始化:初始化时由我们指定数组的长度,系统自动为数组元素分配初始值。
格式:类型[] 数组名 = new 数组类型[数组长度];

不同数据类型的初始值.png
//数组初始化
public class InitDemo {
    public static void main(String[] args) {
        //静态初始化
        int[] num = new int[] { 1, 2, 3, 4, 5 };
        int[] num1 = { 1, 2, 3, 4, 5 };//简单写法
        //只知道要存放数据的个数,不知道具体内容--动态初始化
        int[] num2 = new int[5];//不同数据的动态初始化会有不同的初始值
    }
}

注意:无论,以哪种方式初始化数组,一旦初始化完成,数组的长度就固定了,不能改变,除非重新初始化。也就是说数组是定长的。如果需要经常扩展数组的大小,应该使用另一种数据结构--数组列表(ArrayList).

数组初始化内存分析

数组初始化内存分析.png
一维数组内存分析

简单数组排序算法

- 冒泡排序(Bubble Sort):
思路:对未排序的各元素从头到尾依次比较相邻的两个元素大小关系,若大于则交换位置,经过第一轮比较排序后可得出最大值,然后使用同样的方法把剩下的元素逐个比较即可。
如果一共有N个元素,那么一共要进行N-1轮比较,第M轮要进行N-M次比较。

import java.util.Arrays;
//冒泡排序 -- 升序为例
public class BubbleSortDemo {
    public static void main(String[] args) {
        int[] num = { 13, 6, 2, 1, 4, 7, 8, 9 };
        bubbleSort(num);
        System.out.println(Arrays.toString(num));
        Arrays.binarySearch(num, 5);
    }

    private static void bubbleSort(int[] a) {
        //1.确定比较次数,N个元素,就要比较N - 1次
        for (int time = 1; time <= a.length - 1; time++) {
            //2.每次都是从最低位(索引为0处)开始,进行相邻的数值比较,第一轮出最大值
            //类似于水里冒泡泡,每次都是水底开始,大的气泡先浮上来
            for (int index = 0; index < a.length - time; index++) {
                if (a[index] > a[index + 1]) {
                    int temp = a[index];
                    a[index] = a[index + 1];
                    a[index + 1] = temp;
                }
            }
        }

    }
}

- 选择排序(Selection Sort):
基本思路:选择某个索引位置的元素,然后和后面元素依次比较,若大于则交换位置,经过第一轮比较排序后可得出最小值,然后使用同样的方法把剩下的元素逐个比较即可。
第一轮会选出最小值,第二轮会选出第二小的值,直到最后。
选择排序每一轮只进行一次交换,相对于冒泡排序效率高一些。

import java.util.Arrays;

//选择排序--以升序为例
public class SelectionSortDemo {
    public static void main(String[] args) {
        int[] num = { 12, 13, 2, 1, 4, 7, 8, 9 };
        selectionSort(num);
        System.out.println(Arrays.toString(num));
    }

    public static void selectionSort(int[] num) {
        //1.N个数要进行N-1轮
        for (int time = 1; time < num.length; time++) {
            //选择排序,类似于排队,找出最矮的,放在第一位,第二矮的放在第二位....
            for (int index = time; index < num.length; index++) {
                if (num[time - 1] > num[index]) {
                    int temp = num[index];
                    num[index] = num[time - 1];
                    num[time - 1] = temp;
                }
            }
        }
    }
}

-二分查找(折半查找)
采用二分法查找时,数据需是排好序的
二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x.
当数据量很大适宜采用该方法。

例如:猜数游戏:
猜一个从1到100之间的数,为了能用最少的次数猜中,必须从50开始猜。如果你猜的偏小了,那么就能推出那个数在50到100之间,所以马上猜75。但如果你猜偏大了,你也能明白哪个说在1到50之间,所以马上猜25。如此重复,范围越来越小,直到猜到为止。

//二分法查找--前提:数组是有序的,一般都是升序
public class BinarySearchDemo {
    public static void main(String[] args) {
        int[] num = { 1, 3, 5, 7, 9 };
        int ret = binarySearch(num, 5);
        System.out.println(ret);
    }

    private static int binarySearch(int[] num, int key) {
        int low = 0;
        int high = num.length - 1;
        while (low <= high) {
            int mid = (low + high) >>> 1;//右移1位,就是除以2,但是效率更高
            int midVal = num[mid];
            if (midVal < key)
                low = mid + 1;
            else if (midVal > key)
                high = mid - 1;
            else
                return mid;
        }
        return -1;
    }
}

多维数组

如果每个变量都是一维数组,那这个装多个一维数组的数组是什么呢?也就是说现在数组里还有数组,此时我们习惯称为二维数组,同理什么是三维数组呢?
一维数组:数组中的每一个元素都是一个值.
二维数组:数组在的每一个元素都是一维数组.
三维数组:数组中的每一个元素都是二维数组.
注意:在Java中没有真正的多维数组的概念,我们习惯称之为数组中的数组.
注意区分和C/C++中的多维数组
详细可以看这篇文章:http://blog.csdn.net/u012110719/article/details/46288893

二维数组内存分析

二维数组内存分析.png

方法的可变参数

遇到什么问题

求两个数之和,需要一个方法,该方法有两个参数,求5个数之和,需要重载一个方法,该方法有5个参数,求100个数之和、1000个数之和、10000个数之和,方法的参数列表会很长很长

我们使用数组解决了同类型的多参数问题.但是,调用者需要先把数据封装到一个数组中,再传递给求和方法.,很不爽!
怎么解决
解决方案:使用方法的可变参数机制.
方法的可变参数其实底层就是数组.
** 注意:**
1:可变参数只能运用于方法的参数中.
2:其本质就是数组,是Java5的一个语法糖.
3:可变参数必须作为方法的最后一个参数.

//方法的可变参数
public class AlterArgsDemo {
    public static void main(String[] args) {
        int ret = getSum(1, 2, 3);
        System.out.println(ret);//6
        ret = getSum(1, 2);
        System.out.println(ret);//3
        ret = getSum(1, 2, 3, 4, 5);
        System.out.println(ret);//15
    }

    public static int getSum(int... arr) {
        int sum = 0;
        for (int i : arr) {
            sum += i;
        }
        return sum;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,820评论 6 13
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,524评论 18 399
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,758评论 1 10
  • 心情太糟,干什么都心思杂乱,只有写字来平心静气。
    啊肖奈阅读 338评论 0 0
  • 幻觉 梦 现实 在我的字典里混为一夜 你 她 我 是我假象的感情纠葛 那晚 昨晚 今晚 对我来说都是打击 她们她们...
    Sep的唐阅读 124评论 0 0