next

HashMap解析(主要JDK1.8,附带1.7出现的问题以及区别)

久未见 提交于 2020-08-16 16:47:06
按问题的形式来吧,这些大多是我自己总结的,如有错误请及时指正谢谢 1.你了解HashMap么,可以说说么?    首先,HashMap是一种数据结构,可以快速的帮我们存取数据。它的底层数据结构在1.7和1.8有了一些变化,1.7版本及以前他是 数组+链表 的形式,1.8及以后 数组+链表+红黑树, 如果链表长度 大于等于8 就会转化为红黑树,如果长度降至6红黑树会转化为链表 。 红黑树的出现解决了因为链表过长导致查询速度变慢的问题,因为链表的查询时间复杂度是O(n),而红黑树的查询时间复杂度是O(logn)。 2.它的数组+链表是怎么实现的?    这个代码是1.8的(1.7是Entry,就是名字不一样),其实我们每一个放进去的(key,value)到最后都会封装成这样的Node对象。Hashmap的数组就是以一系列这样的Node对象构成的数组,链表就是把next指向下一个Node对象。 3.为什么要有链表,红黑树?只有数组不可以么? 首先我们要知道什么是Hash算法。 这里放出一段官方的话: Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的 输入 (又叫做预映射pre-image)通过散列算法变换成固定长度的 输出 ,该输出就是散列值。这种转换是一种 压缩映射 ,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出

Altair Compose 2019中文版

那年仲夏 提交于 2020-08-16 15:24:42
教程 1、下载安装包,解压缩并运行安装,耐心等待加载完成 2、选择语言,点击OK即可 3、点击next下一步 4、选择软件安装位置,可自行更换安装路径 5、默认即可,点击下一步 6、一切准备就绪,点击Install开始安装 7、正在安装中,请耐心等待一会 8、安装成功,点击退出安装向导 9、先不要运行软件,将文件复制到软件的Compose2019.3文件夹下 默认位置:C:\Program Files\Altair\2019\Compose2019.3 10、运行软件即可使用了。资源地址: Altair Compose 2019中文版 来源: oschina 链接: https://my.oschina.net/u/4408611/blog/4290064

迭代器/枚举器/生成器的前世今生

馋奶兔 提交于 2020-08-16 14:26:28
一切为了抽象 一段代码越抽象它的 复用价值 就越高,举一个极端例子: function emptyAction(x) { return x } 上面这个函数就像数学里面的 f(x) = x 一样,与山河同在,与日月同辉! 比如可以使用它进行数组的复制: let a = [1, 2, 3] let aDuplicate = a.map(emptyAction) 比如可以玩我返回我自己,虽然我也不知道这有什么用: let one = emptyAction(emptyAction)(emptyAction)(1) 所以,为了不把那些 shiiiiit 代码再写一遍一遍又一遍,就抽象吧! 遍历高桌子,遍历低板凳 假设任何一组数据都永远使用 Array 存储,那么下面这段代码也是一段复用价值极高的代码: for (let i = 0; i < a.length; i++) { const element = a[i]; // do something } 尽管它并不直观,我才不想管 i 是什么 length 是什么,以及 daaaaamn a[i] 又是什么!我只想遍历数组中的每一个元素,给我数组中的元素,OK??? 而且事实上我们除了 Array,还有 Set、Map、LinkedList 以及 maaaaany kinds of Object,很不幸它们并不支持这样的写法

英语16种时态汇总

|▌冷眼眸甩不掉的悲伤 提交于 2020-08-16 14:18:47
英语16种时态汇总 时态种类 1、展示关联动作发生的先后顺序的六种时态 2、be doing :拉长动作,延绵持续,表持续性动作 3、被动形式 4、长被动形式 5、eg 6、碎碎念 时态种类 一般式 进行时 完成时 完成进行时 现在 do is/am/are doing have/has done have/has been doing 过去 did was/were doing had done had been done 将来 have/has been doing will/shall be dong will/shall have done will/shall have been doing 过去将来 would/should do would be dong would have done would have been doing 1、展示关联动作发生的先后顺序的六种时态 had done did(过去的基本形式) have done do(现在的基本形式) will do(将来的基本形式) will have done 2、be doing :拉长动作,延绵持续,表持续性动作 had done >> had been doing did >> was/were doing have done >> have/has been doing do >> is/am

Diary (2020暑期集训日记&总结)

家住魔仙堡 提交于 2020-08-16 14:15:57
2020.08 2020.8.15 Splay 第一次在blog里粘代码 每天一棵 \(Splay\) 好一个调解心情 #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #define debug puts("hs") using namespace std; inline int read(){ int x = 0, w = 1; char ch; for(; ch > '9' || ch < '0'; ch = getchar()) if(ch == '-') w = -1; for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0'; return x * w; } const int ss = 100010; const int inf = 0x7fffffff; struct node{ int son[2]; int size, num, val, fa; }tr[ss << 1]; int root, cnt; inline void update(int x){ tr[x].size = tr[tr[x].son[0]].size + tr[tr[x].son[1]].size + tr

Java的Socket通信简单实例

落花浮王杯 提交于 2020-08-16 14:10:39
服务端 package testlxd; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; public class Server_Test extends Thread { ServerSocket server = null ; Socket socket = null ; public Server_Test( int port) { try { server = new ServerSocket(port); } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { super .run(); try { System.out.println

code+7正式赛划水记+HardA~C题解

你离开我真会死。 提交于 2020-08-16 12:08:25
被同年级的吊锤了 划水 sometimes naive 2:00看题, 感觉不是很可做 20分的时候有人切了T2,看了一下 发现是sb题 ,20min切掉 T1写了暴力找规律无果,交了10分上去 去看T3,发现白给40分直接写 150分 以为稳了 ,还有1h的时候搞T1 想到从后往前构造(?),因为决策点并不多并且主要时间在二分上所以是正解(暴论) 打出了65,稍微调一下变成93 这时还剩30min,大概是30多名 然后 看着排名飞速往后掉 慌得一笔,去搞T3p质数的部分分搞不出来(并没有发现与模4有关) 最后10min开始卡T1,45名 最后5min掉出50名 最后3min想到缩二分上下界,52名 最后1min一Fa♂入魂,咸鱼翻身√ A https://next.xuetangx.com/live/live20200523it002/live20200523it002/4071197/5468641 k<=10^12 题解是从前往后做的,设i以及i之后的操作次数为x,则最后一次一定是i,并且从后往前每i+1次中有一次i 那么i被操作的次数为ceil(x/(i+1)),a则要加上第一次i前面的那一段,即a[i]=i-(x-1)%(i+1) 然后把x剪掉ceil(x/(i+1)),往后做即可 二分n,然后奇妙卡上下界 也可以从后往前做,那就会遇到要决策0或i的地方,

在Python中模拟do-while循环?

萝らか妹 提交于 2020-08-16 12:07:29
问题: I need to emulate a do-while loop in a Python program. 我需要在Python程序中模拟do-while循环。 Unfortunately, the following straightforward code does not work: 不幸的是,以下简单的代码不起作用: list_of_ints = [ 1, 2, 3 ] iterator = list_of_ints.__iter__() element = None while True: if element: print element try: element = iterator.next() except StopIteration: break print "done" Instead of "1,2,3,done", it prints the following output: 而不是“1,2,3,完成”,它打印以下输出: [stdout:]1 [stdout:]2 [stdout:]3 None['Traceback (most recent call last): ', ' File "test_python.py", line 8, in <module> s = i.next() ', 'StopIteration '] What can

【两万字】面试官:听说你很懂集合源码,接我二十道问题!

允我心安 提交于 2020-08-16 12:02:11
问题一:看到这个图,你会想到什么? (PS:截图自《编程思想》) 答 : 这个图由 Map 指向 Collection 的 Produces 并不是说 Map 是 Collection 的一个子类(子接口),这里的意思是指 Map 的 KeySet 获取到的一个视图是 Collection 的子接口。 我们可以看到集合有两个基本接口: Map 和 Collection 。但是我个人认为 Map 并不能说是一个集合,称之为映射或许更为合适,因为它的 KeySet 视图是一个 Set 类型的键集,所以我们姑且把它也当做集合。 Collection 继承了 Iterator 接口,而 Iterator 的作用是给我们提供一个只能向后遍历集合元素的迭代器,也就是说所有实现 Collection 的类都可以使用 Iterator 遍历器去遍历。 每种接口都有一个 Abstract 开头的抽象子类,这个子类中包括了一些默认的实现,我们在自定义类的时候都需要去继承这个抽象类,然后根据我们不同的需求,对于其中的方法进行重写。 从容器角度上来说,只有四种容器: Map , Queue , Set , List 。 问题二:列出常见的集合,并进行简单的介绍 答: ArrayList: 一种可以动态增长和缩减的的索引序列 LinkedList:一种可以在任何位置进行高效地插入和删除操作的 有序序列

Diary (2020暑期集训日记&总结)

家住魔仙堡 提交于 2020-08-16 10:53:49
2020.08 2020.8.15 Splay 第一次在blog里粘代码 每天一棵 \(Splay\) 好一个调解心情 #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #define debug puts("hs") using namespace std; inline int read(){ int x = 0, w = 1; char ch; for(; ch > '9' || ch < '0'; ch = getchar()) if(ch == '-') w = -1; for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0'; return x * w; } const int ss = 100010; const int inf = 0x7fffffff; struct node{ int son[2]; int size, num, val, fa; }tr[ss << 1]; int root, cnt; inline void update(int x){ tr[x].size = tr[tr[x].son[0]].size + tr[tr[x].son[1]].size + tr