每日一题~

Java SE

集合

HashMap

HashMap 中如何确定key在tab中的位置

1、 通过hash()
计算方式为: (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16)
计算hash 值
2、 n=table.length
3、 计算位置 i = (n - 1) & hash

tips: 一些常见类的hashCode 计算方式

  1. Integer、Byte、Char :其本身
  2. String :s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1] ,String的hash值只会计算一次,之后就换缓存在String类的hash属性中
  3. Long: (int)(value ^ (value >>> 32)
HashMap的put流程
没有
相同
不同
如果tab为空或者 tab长度为0
通过resize的方式扩容
计算本节点应该插入在table中的哪个位置
这个位置是否已经有Node
直接插入到这个位置
hash值相同 && (key==相同 || equals)
得到旧节点e
循环链表,找到key相同的节点,如果没有则末尾插入新节点(树形化>8);得到e
将e的值改成插入的值,计数器加一并将旧值返回
计数器加一,如果超过threshold则resize。返回null

Scala

泛型

Scala中获取类型信息的几种用法

原文参照

方式作用
getClass得到的是Class[A]的某个子类val ab:Class[A] = a.getClass这种写法是错误的,因为Class[A]不支持协变
classOf[A]得到是正确的Class[A]Java里的 Class[T]是不支持协变的,所以无法把一个Class[_ < : A] 赋值给一个 Class[A]
typeOf使用typeOf可以得到更为具体的泛型信息,这也意味着,可能使用classOf得到判断为正确的泛型,使用typeOf是错误的例如:classOf[List[Int]] == classOf[List[String]]为true ;typeOf[List[Int]] == typeOf[List[String]]为False;typeOf还会关注类型中的泛型信息,更加细致。

由于java虚拟机在运行时,会擦除泛型信息(所有泛型类均被当作Object),Scala提供额外的方式来获得运行时泛型信息。

def foo[T:Manifest] (x: List[T]) //类型信息作为参数,在上下文中传递
写法作用
Manifest获取详细的泛型信息,2.10以上版本使用TypeTag代替
ClassManifest获取较弱的泛型信息,2.10以上版本使用ClassTag代替

协变、逆变与不可变

类型写法说明正确举例错误举例
协变C[+T]如果A是B的子类,则C[A]是C[B]的子类val a:C[Super] = new C[Sub]val a:C[Sub] = new C[Superb]
逆变C[-T]如果A是B的子类,则C[B]是C[A]的子类val a:C[Sub] = new C[Superb]val a:C[Super] = new C[Sub]
不可变C[T]如果A是B的子类,则C[A]和C[B]没有从属关系以上两种写法均不正确

注:举例中Super是Sub的父类。

泛型界定

名称写法说明举例举例备注
类型变量界定(Type Variable Bound)[T<C[T]]对泛型T添加约束,添加上届约束,使得泛型T拥有类型C的方法[T<:Comparable[T]]只需继承Comparable接口即可
视图界定(View Bound)[T<%C[T]](语法糖)与类型界定相比,视图界定还允许,不遵循C[T]约束的类型C,通过隐士转换转为遵循C[T][T<%Comparable[T]]例如Int并未继承Comparable接口,但是可以通过隐式转换转为RichInt从而满足范式要求。因此传入Int类型合法
上届(Upper Bound)、下届(Lower Bound)[T>:C]
[T<:C]
与java中上下届含义一致
上下文界定(Context Bound)[T:C](语法糖)与视图界定相似,不同的是这种方式传入的是一个隐式值。[T: Comparator]这里传入的隐士值既可以再参数列表中写出也可以不写,通过implicitly[Comparator[T]]仍然可以获得这个入参

注: 视图界定与上下文界定均属于语法糖,分别可以传入隐式函数、隐式值,来操作范式的实际值以获得增强效果。

数仓理论

OneData

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值