集合运算

集合——HashMap的工作原理

我只是一个虾纸丫 提交于 2020-03-03 16:19:27
http://www.importnew.com/16301.html 好的链接 HashMap的工作原理? 1. HashMap的底层结构是 数组加链表 ; a.HashMap包含一个Entry(key,value,next,hash)的内部类,key/value放入HashMap 的时候都会被包装成Entry的 对象 b.HashMap成员就有Entry数组,该数组的大小默认是16,永远都是2的次方数,如果自己给出的不是 2的次方数会转换成大 于并接近自己给的2 的次方数。 put(key,value)就是转换成Entry对象并放入数组中。 2.put方法的实现; c.1 根据key的HashCode进行Hash运算,得到hash值 c.2 根据hash值去确定数组的位置, hash&(table.length-1)等价于hash%(table.length) length是2的次方数该 公式成立, 正获取数组的位置 <bucket>。 c.3 如果这个位置没有元素存在,直接包装成Entry实例,给元素数组附值; 如果计算出的位置有元素已经存在,就会判断key是否相同,如果相同就会覆盖,并且遍历整个链表 如果都不覆盖插入到链表的头部 。 for (Entry<K,V> e = table [ i ]; e != null ; e = e . next ) 注意1

Java集合

江枫思渺然 提交于 2020-03-03 15:40:34
容器主要包括collection和map两种,map不是collection(set,list,queue)里的 Set treeset hashset linkedhashset List arraylist linkedlist vector copyonwritearraylist Quque linkedlist priorityquque Map hashmap linkedhashmap concurrenthashmap list可以允许重复对象和插入多个null值,而set不允许;list容器是有序的,而set容器是无序的 Arraylist基于数组实现,开始不分配内存,第一个加进去的时候才分配,默认10个。添加和删除元素都需要赋值大量对象。 Collections.synchronizedList(new ArrayList())后如果要用iterator还是需要给iterator加同步锁,因为这个方法没对Iterator加锁,对add啥的倒是加了。 CopyOnWriteArrayList适合读多写少的。因为它支持读写同时进行,但是写的时候要在新的数组里写然后原始数组指向新的数组,时间空间都不占优。而且可能出现实时性差的问题,写的过程中读不到最新的。 适配器模式(不能用基本类型数组做参数,可以用包装类型)和迭代器模式 HashMap一个Entry的数组

Java千问:Java位运算经典应用(四)

爷,独闯天下 提交于 2020-03-03 08:28:39
接上篇 七、判断某数是不是2 的N 次幂 我们知道,10的0次幂是1,1次幂是10,2次幂是100...仔细观察一下这些数,你就会发现一个规律,那就是:这些数字当中,开头是1,后面N位上的数字全部是0。这是我们用十进制表示数字所得到的一个规律。同理,如果用 二进制 表示数字的话,那么对于2的N次幂也有相同的规律。 用二进制表示 2的0次幂为1,2的1次幂为10,2的2次幂为100...规律很明显,也1开头,后面N位都是0。 我们利用这个规律,就可以判断一个数字是不是2的N次幂。具体实现办法也很简单,假设一个数字为a,我们用”a减去1的值”与”a自身”做一个按位与运算,如果运算结果为0,那么说明a就是2的N次幂。为什么呢?就是因为2的N次幂减1之后,开头的那个1会因为“退位”变成0,而后面的0都会变成1,这样,与原来的a做按位与的运算,恰好是1和0相对,运算结果自然为0。 我们可以用一个具体的数字来证明,比如说2的3次方,也就是数字8,如果用二进制来表示的话就是”1000”,而8-1=7,7用二进制来表示就是”0111”,这两个二进制串的每一个位恰好是0和1相对,如果它们做按位与的运算,其结果恰好为0。我们根据这个运算结果是否为0就能判断出某个数是不是2的N次幂。完整的判断代码如下: public static void main(String[] args) { int a1 =

数据库的关系运算和完整性约束

随声附和 提交于 2020-03-03 00:41:16
对关系数据库进行查询统计时,需要查询到用户感兴趣的数据,这就需要对关系及关系间进行一定的运算。本篇主要讲述关系运算和关系的完整性约束,理解关系操作的含义,了解传统的集合运算,掌握关系代数中基本关系运算。通过本篇的学习,读者应该能掌握以下内容: ● 集合的合并、交集、求差、乘积操作 ● 关系运算的选择、投影、连接操作 ● 关系的完整性约束 ● 关系的范式 关系运算 关系模型是目前用的最多的数据模型,具有严格的数学理论基础,其主要数学理论基础就是集合运算。关系模型提供了一系列操作的定义,这些操作称为关系代数操作。它可分为两类,一类是集合操作;另一类是关系专用的操作。 1、集合操作 集合操作是把关系看作元组的集合来进行传统的集合运算,其运算结果仍是关系,前提是参与运算的两个元组具有相同的结构,即含有相同的属性,且对应属性的值域相同。下面对传统的集合运算合并、交集、求差、乘积运算进行逐一说明。 集合运算——合并 假设有A、B两个集合 A = {1,3,5,9}, B = {2,3,5,7} 由所有属于集合A或属于集合B的元素组成的集合,叫做集合A与集合B的合并,也称为集合A与集合B的并集,记作: A U B = {1,2,3,5,7,9} 由此可以推出,设R和S是两个关系,则R U S是合并R和S,合并后的结果仍是关系,结果表中的元组或属于R,或属于S,如图2-10所示: 图 2-10

FreeMarker 语法教程

一世执手 提交于 2020-03-02 19:35:18
FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... -->格式部分,不会输出 3,插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出 4,FTL指令:FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出 下面是一个FreeMarker模板的例子,包含了以上所说的4个部分 <html><br> <head><br> <title>Welcome!</title><br> </head><br> <body><br> <#-- 注释部分 --><br> <#-- 下面使用插值 --> <h1>Welcome ${user} !</h1><br> <p>We have these animals:<br> <u1><br> <#-- 使用FTL指令 --> <#list animals as being><br> <li>${being.name} for ${being.price} Euros<br> <#list><br> <u1><br> </body><br> </html> 1, FTL指令规则 在FreeMarker中,使用FTL标签来使用指令,FreeMarker有3种FTL标签,这和HTML标签是完全类似的.

redis 集合操作

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-02 11:40:14
SADD key member 将member元素加入到集合key当中。 如果member元素已经是该集合的成员,那SADD命令不执行任何操作。 假如key不存在,则创建一个只包含member元素作成员的集合。 当key不是集合类型时,返回一个错误。 时间复杂度: O(1) 返回值: 如果添加元素成功,返回1。 如果元素已经是集合的成员,返回0。 Redis代码 <span style= "font-size: small;" >redis> SADD bbs "v2ex.com" (integer) 1 redis> SADD bbs "codecompo.com" (integer) 1 redis> SMEMBERS bbs # 显示bbs集合中所有成员 1 ) "codecompo.com" 2 ) "v2ex.com" redis> SADD bbs "v2ex.com" # 尝试添加重复元素,返回 0 (integer) 0 </span> SINTER key [key ...] 返回一个集合的全部成员,该集合是所有给定集合的交集。 不存在的key被视为空集。 当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。 时间复杂度: O(N * M),N为给定集合当中基数最小的集合,M为给定集合的个数。 返回值: 交集成员的列表。 Redis代码 <span

Java千问:Java位运算经典应用(四)

断了今生、忘了曾经 提交于 2020-03-02 10:46:33
接上篇 七、判断某数是不是2的N次幂 我们知道,10的0次幂是1,1次幂是10,2次幂是100...仔细观察一下这些数,你就会发现一个规律,那就是:这些数字当中,开头是1,后面N位上的数字全部是0。这是我们用十进制表示数字所得到的一个规律。同理,如果用二进制表示数字的话,那么对于2的N次幂也有相同的规律。用二进制表示2的0次幂为1,2的1次幂为10,2的2次幂为100...规律很明显,也1开头,后面N位都是0。 我们利用这个规律,就可以判断一个数字是不是2的N次幂。具体实现办法也很简单,假设一个数字为a,我们用”a减去1的值”与”a自身”做一个按位与运算,如果运算结果为0,那么说明a就是2的N次幂。为什么呢?就是因为2的N次幂减1之后,开头的那个1会因为“退位”变成0,而后面的0都会变成1,这样,与原来的a做按位与的运算,恰好是1和0相对,运算结果自然为0。 我们可以用一个具体的数字来证明,比如说2的3次方,也就是数字8,如果用二进制来表示的话就是”1000”,而8-1=7,7用二进制来表示就是”0111”,这两个二进制串的每一个位恰好是0和1相对,如果它们做按位与的运算,其结果恰好为0。我们根据这个运算结果是否为0就能判断出某个数是不是2的N次幂。完整的判断代码如下: public static void main(String[] args) { int a1 = 5; int

java 8 stream()

落爺英雄遲暮 提交于 2020-02-29 11:12:23
1. 流的基本概念 1.1 什么是流? 流是Java8引入的全新概念,它用来处理集合中的数据,暂且可以把它理解为一种高级集合。 众所周知,集合操作非常麻烦,若要对集合进行筛选、投影,需要写大量的代码,而流是以声明的形式操作集合,它就像SQL语句,我们只需告诉流需要对集合进行什么操作,它就会自动进行操作,并将执行结果交给你,无需我们自己手写代码。 因此,流的集合操作对我们来说是透明的,我们只需向流下达命令,它就会自动把我们想要的结果给我们。由于操作过程完全由Java处理,因此它可以根据当前硬件环境选择最优的方法处理,我们也无需编写复杂又容易出错的多线程代码了。 1.2 流的特点 1.只能遍历一次 我们可以把流想象成一条流水线,流水线的源头是我们的数据源(一个集合),数据源中的元素依次被输送到流水线上,我们可以在流水线上对元素进行各种操作。一旦元素走到了流水线的另一头,那么这些元素就被“消费掉了”,我们无法再对这个流进行操作。当然,我们可以从数据源那里再获得一个新的流重新遍历一遍。 2.采用内部迭代方式 若要对集合进行处理,则需我们手写处理代码,这就叫做外部迭代。而要对流进行处理,我们只需告诉流我们需要什么结果,处理过程由流自行完成,这就称为内部迭代。 1.3 流的操作种类 流的操作分为两种,分别为中间操作 和 终端操作。 1.中间操作 当数据源中的数据上了流水线后

Python3 基本数据类型:字符串、列表、元组、集合、字典等

依然范特西╮ 提交于 2020-02-28 20:32:02
Python3 基本数据类型 Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。 等号(=)用来给变量赋值。 等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。例如: 实例(Python 3.0+) #!/usr/bin/python3 counter = 100 # 整型变量 miles = 1000.0 # 浮点型变量 name = " runoob " # 字符串 print ( counter ) print ( miles ) print ( name ) 运行实例 » 执行以上程序会输出如下结果: 100 1000.0 runoob 多个变量赋值 Python允许你同时为多个变量赋值。例如: a = b = c = 1 以上实例,创建一个整型对象,值为 1,从后向前赋值,三个变量被赋予相同的数值。 您也可以为多个对象指定多个变量。例如: a, b, c = 1, 2, "runoob" 以上实例,两个整型对象 1 和 2 的分配给变量 a 和 b,字符串对象 "runoob" 分配给变量 c。 标准数据类型 Python3 中有六个标准的数据类型: Number(数字) String(字符串) List(列表

基础数据类型的整理

删除回忆录丶 提交于 2020-02-28 13:58:20
基础数据类型 一、数字int 数字主要是用于计算用的,使用方法并不是很多,就记住一种就可以: #bit_length() 当十进制用二进制表示时,最少使用的位数 v = 11 data = v.bit_length() print(data) 二、字符str 1.索引即下标,就是字符串组成的元素从第一个开始,初始索引为0以此类推。 2.切片就是通过索引(索引:索引:步长)截取字符串的一段,形成新的字符串(原则就是顾头不顾腚)。 a = 'ABCDEFGHIJK' print(a[0:3]) print(a[2:5]) print(a[0:]) #默认到最后 print(a[0:-1]) #-1就是最后一个 print(a[0:5:2]) #加步长 print(a[5:0:-2]) #反向加步长 3.字符串的常用方法 #captalize,swapcase,title print(name.capitalize()) #首字母大写 print(name.swapcase()) #大小写翻转 msg='egon say hi' print(msg.title()) #每个单词的首字母大写 # 内同居中,总长度,空白处填充 ret2 = a1.center(20,"*") print(ret2) #数字符串中的元素出现的个数。 # ret3 = a1.count("a",0,4) #