数组

一.为何编程语言的数组下标从0开始

1.从数组内存存储类型来看,数组的下标可以看作“偏移量”--offset;如果a为首地址,那么a[0] 就是偏移量为0的位置。
2.历史原因:C 语言设计者用 0 开始计数数组下标,之后的 Java等其它语言开始使用,这样节省了学习成本。
3 . 内存地址计算方法:

  • 一维数组:a[k]_address = base_address + k * type_size
  • 二维数组:二维数组假设是mn, a[i][j]_address=base_address + (in+j)*type_size
  • 三维数组:假设mnq, a[i][j][k]_address=base_address + (inq + jq + k)type_size

二.如何实现随机访问

1.数组

  • 一种线性表,每个线性表上的数据最多只有前和后两个方向。
  • 连续的内存空间和相同的数据类型。
  • 这两种限制同时赋予了数组一种特质:随机访问;但为了保衡数据的连续性,那么插入,删除操作变得低效,需要对数据进行搬运行为。

2.数组如何实现下标的随机访问

  • 计算机会给每个内存单元分配一个地址,通过地址来访问内存。计算机需要随机访问数组中的某个元素时,它会首先通过下面的寻址方法寻找:
    a[k]_address = base_address + k * type_size

  • 数组和链表的区别纠错
    数组是适合查找操作,但是查找的时间复杂度并不为 O(1).数组支持随机访问,根据下标的 随机访问的时间复杂度为O(1).

三.一些别的思考

  • 插入操作:
    如果数组中数据时无序的,而且只当作一种存储集合,为了避免大规模的数据搬运,可以直接将第K位的数据搬运到数组的最后。
  • 删除操作:
    不必追求数组中的数据的连续性,将多次删除操作集中在一起,删除的效率会提高。因为每一次删除后,都要重新搬运数据(为了内存的连续性)。
    我们可以先记录下已经删除的数据。每次的删除操作并不是真正地搬运数据,而是做一个已删除的标记,等到存储空间没有更多的空间时,一次性删除被标记的数据。-----JVM的标记清理垃圾回收算法的核心思想。
  • 数组的下标越界问题。
    C语言中的数组下标越界是一种未决行为,没有规定下标越界时编译器应该如何处理。因为访问数组的本质就是方位一段连续的内存地址,只要数组通过计算偏移后得到的地址时可用的,就不会报错。
    JAVA中本身就会检测下标越界,抛出异常。

四.数组和容器

比如数组和ArrayList容器。

  • 容器的优势
    将很多数组操作的细节隐藏起来。实现了动态扩容。
  • 数组的优势
    容器无法存储基础类型int等,只能包装后Integer使用,浪费了性能。更关注性能,一般用于底层开发。

五.标记清除垃圾回收算法

基本算法:

  • 由标记阶段 和 清除阶段构成
  • 标记将所有的活动的对象打上标记。
  • 清除即将将那些没有标记的对象进行回收。

标记与清除

  • 遍历GC,ROOT引用,递归标记(设置对象头中的标志位)对象;
  • 标记时如果标记位已被标记已跳过
  • 遍历对象有深度优先遍历和广度优先遍历,其搜索步骤一致,但是深度优先的内存使用量更小,因此一般使用深度优先遍历。
  • 清除阶段将再次遍历堆,未标记的对象加入到空闲表中,标记的对象则出区标记。

分配与合并

  • 分配指mutator申请分块时获取内存块的过程。
  • 分配即通过搜索空闲链表,找到一个大小合适的块。分配测量有如下:First-fit,找到第一个大于要求大小的块即返回;Best-fit,找到比要求大小大的最小块;Worst-fit,找出最大的块将其分割成要求大小块和剩余的,一般不使用(容易产生碎片)。
  • 对于内存中连续的垃圾可以对其进行合并,减少碎片。

优缺点:

  • 优点:
    1.算法实现简单。
    2.与保守式GC算法兼容(对象不能被移动)。
  • 缺点
    1. 碎片化。
    2. 分配速度慢,每次分配需要遍历空闲链表。
    3. 与写时复制(copy-on-write)冲突,因为做GC时需要将对象头进行标记,这将导致大量的数据发生复制
    4. STW(Stop-The-World)长,两个阶段均要遍历整个堆。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容

  • 提到数组,我想你肯定不陌生,甚至还会自信地说,它很简单啊。 是的,在每一种编程语言中,基本都会有数组这种数据类型。...
    GhostintheCode阅读 1,213评论 2 1
  • 数组:是一种线性表数据结构,它用一组连续的内存空间,来存储一组相同类型的数据。 从以下几点去掌握数组: ① 线性表...
    刘淏卿阅读 349评论 0 0
  • 一、数组的定义: ​ 数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据...
    小妍妍说阅读 714评论 0 0
  • 关于红评脉络,真正一笔糊涂账,咱也算不清。 木夫对此倒不怎么在乎,咱一起读懂红楼便可。 清政府对红楼梦的看法自不必...
    木夫009阅读 444评论 0 3
  • 一直以来,莲最大的骄傲就是自己的“出淤泥而不染”。 那么多的阴暗、诋毁、排挤、争夺、无耻、谄媚、愤恨、怨怼……拥挤...
    于千贺阅读 570评论 0 4