精华内容
下载资源
问答
  • 1.7 版本是数组+链表,数组为了根据 hash 值定位索引,链表解决 hash 冲突1.8 版本增加红黑树解决长链表查询问题为什么用数组+链表? 数组是为了快,链表是由于使用链地址法解决hash冲突hash 冲突你还知道哪些解决...

    3ae09101bc4ececce015cde3264dc015.png

    (1) HashMap 的实现原理

    • 你看过HashMap源码嘛?知道原理嘛?
    1.7 版本是数组+链表,数组为了根据 hash 值定位索引,链表解决 hash 冲突
    1.8 版本增加红黑树解决长链表查询问题
    • 为什么用数组+链表?
    数组是为了快,链表是由于使用链地址法解决hash冲突
    • hash 冲突你还知道哪些解决办法?
    开放地址法,再哈希法等
    • 我用 LinkedList 代替数组结构可以么?
    可以,也能实现。但是过于愚蠢,因为链表的查询为O(N),性能和根据索引查询的数组没有可比性。
    • 既然是可以的,为什么HashMap不用LinkedList,而选用数组?
    见上

    (2) HashMap 扩容

    • HashMap 在什么条件下扩容?
    table 容量达到负载上限,默认 75% 的总容量。
    • 为什么扩容是 2 的 n 次幂?
    扩容翻倍是一个合理的状态,把长度定为2的幂,可以获得计算索引时的高性能
    • 为什么为什么要先高 16 位异或低 16 位再取模运算?
    增加数据扰动,否则会出现数据连续存储的情况

    (3) HashMap 的 get/put

    • 知道 HashMap 中 put 元素的过程是什么样么?
    根据 key 算出索引 i,根据 i 查找数组。如果对应的那个位置上有数据,则判断是否相同。相同则覆盖。不相同则插入链表,尾插法。如果链表长度达到阈值,则转化为红黑树。
    • 知道 HashMap 中 get 元素的过程是什么样么?
    大致于上相同,只不过换为查找。
    • 你还知道哪些 hash 算法?
    MD4, MD5
    • 说说 String 中 hashcode 的实现?
    以31为底,将每个字符转化成数字。选择31,有质数的考量,有32-1的好优化的考量

    (4) HashMap 红黑树

    • 知道 jdk1.8 中 HashMap 改了啥么?
    一是头插法变为尾插法,二是链表过长转为红黑树。
    • 为什么在解决 hash冲突的时候,不直接用红黑树?而选择先用链表,再转红黑树?
    因为毕竟链表长度过长是一个不常见的现象,Java 自己做的统计得出只有百万分之六的情况下会产生过长。而红黑树是有成本的, 其自带的右旋左旋变色等操作在数量只有几个的情况下除了增加时间没有什么太大的意义。
    • 我不用红黑树,用二叉查找树可以么?
    可以,但是不建议。红黑树来源于2-3树,2-3树来源于AVL,AVL来源于BST。
    依次解决的问题是2-3树要处理多类节点,AVL树操作费时费力,BST在最坏情况下表现很差。而且红黑树已经成为了经典的解决这类问题的方法,再退回到原始状态当然也行,只不过毫无意义。
    • 那为什么阀值是8呢?
    见上
    • 当链表转为红黑树后,什么时候退化为链表?
    红黑树容量降到了反树化的阈值,默认是6。

    (5) HashMap 并发

    • HashMap在并发编程环境下有什么问题啊?
    一般性的错读错写,以及特殊情况下的程序死循环
    • 在jdk1.8中还有这些问题么?
    一般性的错读错写还存在,特殊情况下的程序死循环被解除
    • 你一般怎么解决这些问题的?
    ConrurrnetHashMap

    (6) HashMap 的 key

    String , Integer。一般来说,要选择Java帮你实现了hashcode的类,如果类还是不可变的就更好了。

    抽象类和接口区别?

    接口就是一种特殊的abstract class,但是比abstract class更加抽象,
    考虑一个概念抽象方法。抽象方法用来描述系统提供哪些功能,而不必关心具体的实现。
    抽象类可以为部分方法提供实现,避免了在子类中重复实现这些方法,提高了代码的可重用性,这是抽象类的优势;而接口中只能包含抽象方法,不能包含任何实现。
    一个类可以实现多个接口,这个就是接口的优势。
    选择抽象类的时候通常是如下情况:需要定义子类的行为,又要为子类提供通用的功能

    LinkedHashMap怎么实现的

    HashMap + 双向链表

    ArrayList 和 LinkedList 是如何实现的?

    ArrayList:内部使用数组的形式实现了储存,实现了RandomAccess接口,因此对元素的随机访问速度非常快,因为是数组,所以ArrayList在初始化的时候,有初始大小10,插入新元素的时候会判断是否需要扩容,扩容的步长是0.5倍原容量,扩容方式是利用数组的复制,因此有一定的开销,另外,ArrayList在进行元素插入的时候,需要移动插入位置之后的所有元素,位置越靠前,需要位移的元素越多,开销越大,相反,插入位置越靠后的话,开销就越小了,如果在最后面进行插入,那就不需要进行位移。LinkedList:内部使用双向链表的结构实现储存,LinkedList有一个内部类作为存放元素的单元,里面有三个属性,用来存放元素本身以及前后2个单元的引用,另外LinkedList内部还有一个header属性,用来标识起始位置,LinkedList的第一个单元和最后一个单元都会指向header,因此形成了一个双向的链表结构LinkedList的元素并不需要连续存放,但是每个存放元素的单元比元素本身需要更大的空间,LinkedList对空间的要求比较大,但是扩容的时候不需要进行数组复制,因此没有这一环节的开销但是,LinkedList的随机访问速度惨不忍睹,因为无论你要访问哪一个元素,都需要从header起步正向或反向的进行元素遍历。由此可见,ArrayList适合需要大量进行随机访问或者对靠近集合中尾部的元素进行增删的场景;而LinkedList则适合对靠近集合首部的元素进行增删的场景。

    ArrayList 如何添加元素的?删除元素后会自动缩小空间吗?如果给你设计api 。除了目前的增删改查等等。你还有什么其他的想法。设计出其他的api.

    将值置入,不会。可以自行调用 trimToSize。改造成 HashMap

    Set 如何实现? 插入和删除和查找的时间复杂度是什么?

    Set都是用对应的Map实现的。比如HashSet是由HashMap实现的,TreeSet是由TreeMap实现的。
    只要将map的value都设置成null,那么它们的key就组成了一个Set

    红黑树的左旋和右旋?

    如果右子结点是红色的而左子结点是黑色的,进行左旋转
    如果左子结点是红色的且它的左子结点也是红色的,进行右旋转
    如果左右子结点均为红色,进行颜色转换
    仔细看,这些操作的本质就是把红链接上移
    展开全文
  • 图片反色、增加边缘空白可指定在 Dark 模式时反色,还能增加边缘空白,让图片的呈现更和谐、阅读体验更佳 统一多级列表自动编号将多级有序、无序列表的编号进行了统一,以更聚焦内容的结构化 任务列表支持自动...
  • linux分段与分页

    2019-05-26 11:52:14
    Linux分段与分页 如何使进程的地址空间隔离,如何提高内存的使用效率,如何解决程序运行时的重定位问题?...既然我们在程序和物理地址空间之间增加了虚拟地址,那么就要解决怎么从虚拟地址映射到物理地址...

    Linux分段与分页

    如何使进程的地址空间隔离,如何提高内存的使用效率,如何解决程序运行时的重定位问题?

    现在的内存管理方法就是在程序和物理内存之间引入了虚拟内存这个概念。虚拟内存位于程序和物理内存之间,程序只能看见虚拟内存,再也不能直接访问物理内存。每个程序都有自己独立的进程地址空间,这样就做到了进程隔离。

    既然我们在程序和物理地址空间之间增加了虚拟地址,那么就要解决怎么从虚拟地址映射到物理地址,因为程序最终肯定是运行在物理内存中的,主要有分段和分页两种技术。

    所有Linux进程仅仅使用四种段来对指令和数据寻址。运行在用户态的进程使用所谓的用户代码段和用户数据段。类似地,运行在内核态的所有Linux进程都使用一对相同的段对指令和数据寻址:它们分别叫做内核代码段和内核数据段。

    Linux分页

    内存效率问题仍然无能为力,为了解决寻址效率:
    Linux中的Buddy算法和slab内存分配机制
    Linux中一般页的大小是4KB,我们把进程的地址空间按页分割,把常用的数据和代码页装载到内存中,不常用的代码和数据保存在磁盘中。

    页全局目录,页上级目录,页中级目录,页表等几级的分页机制来实现的,但是基本的工作原理是不会变的。
    分页机制的实现需要硬件的实现,这个硬件名字叫做MMU(Memory Management Unit),他就是专门负责从虚拟地址到物理地址转换的,也就是从虚拟页找到物理页。

    展开全文
  • 但是我还没服务器,这个log文件怎么传给我还没想好,先改这些吧有空再说 Version 1.9.4 1.修改定位历史的删除逻辑 2.修改未开启GPS时地图SDK初始化失败的bug 3.优化关键字搜索 4.添加手动输入经纬度定位(这里使用的...
  • 在这一章中,老师首先讲了基本数据类型(字符、字符串、int、float)在计算机上的储存原理,包括物理地址的编号、存储区域是如何划格子定位的、各种基本数据占用的存储格子的数量、怎么区分占用32位的字符串不是4

    引入

    在这一章中,老师首先讲了基本数据类型(字符、字符串、int、float)在计算机上的储存原理,包括物理地址的编号、存储区域是如何划格子定位的、各种基本数据占用的存储格子的数量、怎么区分占用32位的字符串不是4个字符:
    在这里插入图片描述
    还讲了列表中的元素在计算机的物理存储地址是按顺序存放的:
    在这里插入图片描述
    注:操作系统寻址的最小单位是按照字节来标识的。

    2. 顺序表

    在程序中,经常需要将一组(通常是同为某个类型的)数据元素作为整体管理和使用,需要创建这种元素组 ,用变量记录它们,传进传出函数等。一组数据中包含的元素个数可能发生变化(可以增加或删除元素)。

    对于这种需求,最简单的解决方案便是将这样一组元素看成一个序列,用元素在序列里的位置和顺序,表示实际应用中的某种有意义的信息,或者表示数据之间的某种关系。这样的一组序列元素的组织形式,我们可以将其抽象为线性表

    一个线性表是某类元素的一个集合,还记录着元素之间的一种顺序关系。线性表是最基本的数据结构之一,在实际程序中应用非常广泛,它还经常被用作更复杂的数据结构的实现基础

    根据线性表的实际存储方式,分为两种实现模型:

    • 顺序表,将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示。
    • 链表,将元素存放在通过链接构造起来的一系列存储块中。

    2.1 顺序表的形式

    在这里插入图片描述
    Me注:这样的设计方便定位。
    图a表示的是顺序表的基本形式,数据元素本身连续存储,每个元素所占的存储单元大小固定相同,元素的下标是其逻辑地址,而元素存储的物理地址(实际内存地址)可以通过存储区的起始地址Loc (e0)加上逻辑地址(第i个元素)与存储单元大小(c)的乘积计算而得,即:

    Loc(ei) = Loc(e0) + c * i
    

    故,访问指定元素时无需从头遍历,通过计算便可获得对应地址,其时间复杂度为O(1)。

    如果元素的大小不统一,则须采用图b的元素外置的形式,将实际数据元素另行存储,而顺序表中各单元位置保存对应元素的地址信息(即链接)。由于每个链接所需的存储量相同,通过上述公式,可以计算出元素链接的存储位置,而后顺着链接找到实际存储的数据元素。注意,图b中的c不再是数据元素的大小,而是存储一个链接地址所需的存储量,这个量通常很小。

    图b这样的顺序表也被称为对实际数据的索引,这是最简单的索引结构。

    【示例】对实际数据的索引
    在这里插入图片描述

    2.2 顺序表的结构与实现

    顺序表的结构

    在这里插入图片描述
    一个顺序表的完整信息包括两部分,一部分是表中的元素集合(“数据”),另一部分是为实现正确操作而需记录的信息,即有关表的整体情况的信息(也称“表头信息”),这部分信息主要包括元素存储区的容量和当前表中已有的元素个数两项。

    顺序表的两种基本实现方式

    在这里插入图片描述
    图a为一体式结构,存储表信息的单元与元素存储区以连续的方式安排在一块存储区里,两部分数据的整体形成一个完整的顺序表对象。
    一体式结构整体性强,易于管理。但是由于数据元素存储区域是表对象的一部分,顺序表创建后,元素存储区就固定了。

    图b为分离式结构,表对象里只保存与整个表有关的信息(即容量和元素个数),实际数据元素存放在另一个独立的元素存储区里,通过链接与基本表对象关联。

    【实例】分离式结构的例子
    在这里插入图片描述

    元素存储区替换

    一体式结构由于顺序表信息区与数据区连续存储在一起,所以若想更换数据区,则只能整体搬迁,即整个顺序表对象(指存储顺序表的结构信息的区域)改变了。

    分离式结构若想更换数据区,只需将表信息区中的数据区链接地址更新即可,而该顺序表对象(指存储顺序表的结构信息的区域)不变。

    元素存储区扩充

    采用分离式结构的顺序表,若将数据区更换为存储空间更大的区域,则可以在不改变表对象的前提下对其数据存储区进行了扩充,所有使用这个表的地方都不必修改。只要程序的运行环境(计算机系统)还有空闲存储,这种表结构就不会因为满了而导致操作无法进行。人们把采用这种技术实现的顺序表称为动态顺序表,因为其容量可以在使用中动态变化

    扩充的两种策略
    • 每次扩充增加固定数目的存储位置,如每次扩充增加10个元素位置,这种策略可称为线性增长。
      特点:节省空间,但是扩充操作频繁,操作次数多。
    • 每次扩充容量加倍,如每次扩充增加一倍存储空间。
      特点:减少了扩充操作的执行次数,但可能会浪费空间资源。以空间换时间,推荐的方式。

    2.3 顺序表的操作

    增加元素

    如图所示,为顺序表增加新元素111的三种方式
    在这里插入图片描述
    a. 尾端加入元素,时间复杂度为O(1)
    b. 非保序的加入元素(不常见),时间复杂度为O(1)
    c. 保序的元素加入,时间复杂度为O(n)

    删除元素

    如图所示,图a)是删除表尾元素,图b)和图c)是删除偏移量为1处的111:
    在这里插入图片描述
    a. 删除表尾元素,时间复杂度为O(1)
    b. 非保序的元素删除(不常见),时间复杂度为O(1)
    c. 保序的元素删除,时间复杂度为O(n)

    2.4 Python中的顺序表

    Python中的list和tuple两种类型采用了顺序表的实现技术,具有前面讨论的顺序表的所有性质。tuple是不可变类型,即不变的顺序表,因此不支持改变其内部状态的任何操作,而其他方面,则与list的性质类似。

    list的基本实现技术

    Python标准类型list就是一种元素个数可变的线性表,可以加入和删除元素,并在各种操作中维持已有元素的顺序(即保序),而且还具有以下行为特征:

    • 基于下标(位置)的高效元素访问和更新,时间复杂度应该是O(1);
      为满足该特征,应该采用顺序表技术,表中元素保存在一块连续的存储区中。
    • 允许任意加入元素,而且在不断加入元素的过程中,表对象的标识(函数id得到的值)不变;
      为满足该特征,就必须能更换元素存储区,并且为保证更换存储区时list对象的标识id不变,只能采用分离式实现技术。
    • list中可以容纳各种不同类型的元素;
      为满足这个特折,list底层采用元素外置的技术,即list的数据区存的是元素对象的地址。

    在Python的官方实现中,list就是一种采用分离式技术实现的动态顺序表。这就是为什么用list.append(x) (或 list.insert(len(list), x),即尾部插入)比在指定位置插入元素效率高的原因。

    在Python的官方实现中,list实现采用了如下的策略:在建立空表(或者很小的表)时,系统分配一块能容纳8个元素的存储区;在执行插入操作(insert或append)时,如果元素存储区满就换一块4倍大的存储区。但如果此时的表已经很大(目前的阀值为50000),则改变策略,采用加一倍的方法。引入这种改变策略的方式,是为了避免出现过多空闲的存储位置。

    展开全文
  • !... 请GitHub搜“EhViewer”,提问秒删不知道是不是不能发地址 ... - 现在只想改一个地方,就是看漫画两页之间的黑条去掉,形成无缝连接。...我该怎么定位到那个给两页漫画间增加间隔的代码中去?求具体的思路
  • 西门子S7-200CN 系列PLC解密软件2010版

    热门讨论 2010-11-15 12:20:07
    如果您的电脑没有串口可以增加一个usb---232的转换器或usb---485的转换器或直接使用pc卡槽的串口卡,这样最好。这些东西都没有的只有放弃您的滥本本,使用台式电脑了!解密时选择正确的串口号,如果出现连接...
  • 专业版还能记录下您环游地球的视频,标出您游玩的路线,软件还增加了日出效果,增强了导航控制功能。  谷歌地球怎么用?  1、定点查看  将地球定位到北半球的亚洲,用鼠标将地球拉近,各样地名字样清晰可见,...
  • 让界面想怎么换就怎么换 便捷自定义模型 自己扩展网站后续功能,省去诸多烦恼  高效的动态静态 页面部署,提高网站收录量 灵活的商业运营模式 完善的会员体系,完整的支付接口 流畅专业界面设计 良好的...
  • 我不知道是怎么回事,我想请教下你们,同时如果你们有完整的java视频播放器代码,能否提供一份?望指导! 我的代码为: package com.bird.jmf; import java.awt.*; import java.awt.event.*; import java.io.*; ...
  • 那么现在基本可以确定PPI协议所能破解的西门子S7-200PLC的范围:02.00版以下的,包括部分02.00版本(确切的说是最高只有3级加密功能的plc),通过本软件就可以轻松破解,02.00版以上的,包括02.00版(精确定位是-...
  • 我的项目地址:https://github.com/luckyluckydadada/faceswap(原理清晰,注释完整) 博客解析:https://blog.csdn.net/weixin_41965898/article/details/84930788 代码参考:...
  • 那么我们就在work管理页面增加要执行的work地址以及机器组。 此时有30分钟的缓冲时间,master 才会检测到该 work 加入。为了测试,此时我们可以通过重启 master 来立刻使该 work加入执行组(后面会增加一键刷新work...
  • 上面的问题解决起来很容易,只需在第一行代码中增加一个判断条件即可,如下:  for(i=0; i<pSysHead->dbf_coun && i ; i++) // MAX_DB_NUM=127 这样就保证了循环变量i的值在正常范围内,从而避免了对指针pDBFat...
  • 因为还不怎么用,所以以后再说吧。。。 Scipy Doc 杂文汇集 Python读取文件以及读取大文件 gensim之Word2vec使用 心得:多动手,别只看 机器学习及深度学习篇 机器学习网站及教程 机器学习入门教程与...
  • shell编程和unix命令

    2015-02-16 15:41:39
    本书共分五部分,详细介绍了shell编程技巧,各种UNIX命令及语法,还涉及了UNIX下的文字处理以及少量的系统管理问题。本书内容全面、文字简洁流畅,适合Shell编程人员学习、参考。 目 录 译者序 ...
  • 18.3.20 增加和检测整数值 171 18.3.21 简单的安全登录脚本 172 18.3.22 elif用法 173 18.3.23 使用elif进行多条件检测 173 18.3.24 多文件位置检测 174 18.4 case语句 175 18.4.1 简单的case语句 175 18.4.2 对匹配...
  • 调用之后,我们需要做的是诸如将它们标记为未被使用的等事情,并且,在调用 malloc 时,我们要能够定位未被使用的内存块。因此,malloc 返回的每块内存的起始处首先要有这个结构: 清单 3. 内存控制块结构定义 ...
  • 操作系统(内存管理)

    热门讨论 2009-09-20 12:55:25
    在对内存块进行了 free 调用之后,我们需要做的是诸如将它们标记为未被使用的等事情,并且,在调用 malloc 时,我们要能够定位未被使用的内存块。因此, malloc 返回的每块内存的起始处首先要有这个结构: 清单 3...
  • asp.net知识库

    2015-06-18 08:45:45
    页面一postback,它就显示页面的最顶端,怎样让它定位在某一位置? 如何保证页面刷新后的滚动条位置 清除网页历史记录,屏蔽后退按钮! 如何传值在2个页面之间 :要求不刷新父页面,并且不能用Querystring传值 Asp...
  • java 面试题 总结

    2009-09-16 08:45:34
    forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。 redirect...
  • IP地址冲突引发的ORA-12541错误 82 ORA-8103错误的处理 83 半瓶的DBA工作手记(作者:邹德平) 87 SQL执行计划改变导致查询变慢 88 大数据量操作导致Data Guard延迟 91 Oracle重做日志切换频繁导致的性能问题 ...
  • 如果在黑名单中就触发警告并怎么怎么样。 但其实这种做法只能是:防君子不防小人。 <h3>1.3 遇到的问题 项目做到这里遇到一个问题是不论怎样,都没有办法防止开发者做一些我们想禁用的功能。因为是一个...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    C#--微软.NET的第一语言 本书着重介绍语言本身,比较少涉及应用,不错的入门书,从头讲起,不怕不明白。 <<page 1>> page begin==================== 目 目目 目 录 ... 比尔.... 2000 年 6 月 ...
  • C#微软培训资料

    2014-01-22 14:10:17
    <<page 1>> page begin==================== 目 目目 目 录 录录 录 第一部分 C#语言概述.4 第一章 第一章第一章 第一章 .NET 编 编 ... 比尔....这一天 微软公司正式推出了其下一代...
  • 这些widget负责布局、绘制、定位、大小等。我们可以使用各种姿势来组合他们而不是继承他们。类层次结构很浅且很宽,可以最大限度的增加可能组合的数量 <p><img alt="img" src=...
  • Visual Studio程序员箴言--详细书签版

    热门讨论 2012-10-16 20:37:39
    技巧2.10 从文本编辑器工具栏上增加或减少行缩进 31 技巧2.11 智能缩进与块缩进之间有什么区别 32 2.1.4 大纲显示 32 技巧2.12 折叠和展开代码 32 切换大纲显示展开 32 切换所有大纲显示 33 停止大纲显示...
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    最近几年高频电路与数位电路共享相同电路板,构成所谓的混载电路系统似乎有增加的趋势,类似如此的设计经常会造成数位电路动作时,高频电路却发生动作不稳定等现象,其中原因之一是数位电路产生的噪讯,影响高频电路...
  • 枸杞的由来和技术栈

    2021-01-02 15:11:32
    <div><h2>由来 在去年 8 月份的时候,我就想做一个项目并把它开源出去,作为一名粉丝向一位长者的高寿诞辰表示祝贺。 去年前端的圈子风起云涌,各种新技术层出不穷,而我当时的工作主要负责...

空空如也

空空如也

1 2
收藏数 35
精华内容 14
关键字:

怎么增加定位地址