数据结构学习笔记之数组

  1. 定义

所谓数组,是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。
用于区分数组的各个元素的数字编号称为下标。 这些有序排列的同类数据元素的集合称为数组。

Type[] arrName = new Type[len];
Type: 数组类型
arrName: 数组名,可以通过该变量访问数组的元素,记录的是该对象对应内存的起始位置。
index:下标,可以通过arrName[index]访问数组对应位置的元素(从0开始)。
len:定义数组的长度。

  总的来说数组就是一块连续的内存空间用来存储相同类型的对象,此外数组的初始化一旦完成,数组所占的空间就完成固定下来了,因此数组的长度是不可变的。

  1. 基本使用

  (1)数组的定义
  数组的定义的语法格式包括以下两种,但是更加推荐使用第一种方式。

    Type[] arrName;
    Type arrName[];

  (2)数组的初始化
  Java中必须先初始化数组,然后才可以使用,所谓初始化,就是为数组的元素分配内存空间,并且为每个数组元素赋初始值。
  数组的初始化方式包括两种,静态初始化和动态初始化。
  a. 静态初始化:由程序员指定每个数组元素的初始值,有系统决定数组长度。

Type[] arrName = new Type[]{e1, e2, e3}; //注意:[]符号内部不能指定数组长度的值
Type[] arrName = {e1, e2, e3};

  动态初始化:初始化时由程序员指定数组长度,由系统为数组元素分配初始化值。

Type[] arrName = new Type[10];

  在执行动态初始化之后,程序员只需要指定数组的长度,系统将会为这些数组元素分配初始化值,默认规则如下:

基本类型对应的整数类型 ---- 0
基本类型对应的小数类型 ---- 0.0
基本类型对应的字符类型 ---- '\u0000'
基本类型对应的布尔类型 ---- false
复杂类型 ---- null

(3)使用数组
  如果想要访问数组中对应下标位置的元素,只需要提供对应的索引即可,注意索引是从0开始的。

arrName[2]; //访问数组中索引为 2 位置对应的元素
arrName[2] = e; //将 e 放到数组中 下标为 2 对应的位置

  数组其实就是一个对象,在创建一个数组时,其对象头除了保存锁标志、哈希码、所属类型之外,还会保存该数组的长度,所以数组的长度是不可变的。数组名实际上指向的是该对象所在的内存空间的起始位置的地址,所以取下标为 index 对应的下标位置的元素,则会使用startAddress + index * elementSize获取对应位置的地址,所以只需要 O(1)的复杂度就可以获取到。

  1. 扩展
      在之前的定义中提到过,数组的长度是不可变的,所以我们可以提供自定义的数组类,使其可以根据数据的大小自动调整数组的长度。
public class Array <T> {
    private T[] data;
    private int size;

    public Array(int capacity){
        this.data = (T[])new Object[capacity];
    }
    public Array(){
        this(5);
    }
    //数组扩容 | 缩容,新容量为 capacity
    private void resize(int capacity){
        data = Arrays.copyOf(data, capacity);
    }
    //移除指定索引的元素
    public T remove(int index){
        if(index < 0 || index >= size) throw new IllegalArgumentException("无效的 index");
        T ret = data[index];
        size --;
        for (int i = index; i < size  ; i++) {
            data[i] = data[i+1];
        }
        return ret;
    }
    //向指定索引添加元素
    public void add(int index, T t){
        if(index < 0 || index > size) throw new IllegalArgumentException("无效的 index");
        if(size == data.length) resize(data.length * 2);
        System.arraycopy(data, index, data, index + 1, size - index);
        data[index] = t;
        size ++;
    }
    ......
}

  添加元素时最好的情况下时间复杂度为 O(1),最坏情况下时间复杂度为 O(n)因为涉及到数组的扩容,平均复杂度为 O(1),因为每 n 次才会出现一次扩容,所以平均复杂度为 O(2)也就是 O(1)。
  但是可能会出现如下这种情况,导致添加和移除元素的复杂度都变为了 O(n)。

复杂度震荡

  出现以上情况的原因是缩容的太过着急,我们应该采用延迟策略,也就是当数组的元素变为容量的 1/2 时,我们不进行缩容操作,而是等到数组的元素变为容量的 1/4 时,才将数组的容量变为原来的 1/2,。

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

推荐阅读更多精彩内容