京东金融 - 面试

(1)XML mybatis:【标签、参数】
https://www.cnblogs.com/hellokitty1/p/5216025.html
http://www.cnblogs.com/hellokitty1/p/5218892.html
https://www.cnblogs.com/ysocean/p/7237499.html


(2)SpringIOC:


(3)SpringAOP:


(4)SpringMVC:


(5)Tomcat手起动:
tomcat的安装有两种方法,一种是解压就可以使用,一种需要向程序一样进行安装。
如果是安装的tomcat,那么首先单击开始菜单。
程序中有一个Apache Tomcat…… 的文件夹
文件夹中的Configure Tomcat程序。单击启动。
在主界面中你就可以看到一个Start的开始按钮了。单击等待一会就可以启动tomcat了。


如果你的压缩文件,那么也很简单。
打开解压目录,然后找到BIN目录,打开。
选择tomcat程序,双击启动即可。呈现的界面和上面一样。单击start即可启动。


(6)maven【怎么操作】


(7)Git简单命令


(8)hashmap[为什么一定是2的指数] hashtable
区别:
(1)HashMap是非线程安全的,HashTable是线程安全的,内部的方法基本都经过synchronized修饰。


(2)因为同步、哈希性能等原因,性能肯定是HashMap更佳,因此HashTable已被淘汰。


(3) HashMap允许有null值的存在,而在HashTable中put进的键值只要有一个null,直接抛出NullPointerException。


(4)HashMap默认初始化数组的大小为16,HashTable为11。前者扩容时乘2,使用位运算取得哈希,效率高于取模。而后者为乘2加1,都是素数和奇数,这样取模哈希结果更均匀。
(5)继承的父类不同
      Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。
 
 结构上的修改是指添加或删除一个或多个映射关系的任何操作;仅改变与实例已经包含的键关联的值不是结构上的修改。
 
(6)HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因为contains方法容易让人引起误解。


      Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同。


 (7)两个遍历方式的内部实现上不同
      Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
 
 
Hash散列函数
//HashMap的散列函数,这里传入参数为键值对的key
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);

//返回hash值的索引,h & (length-1)操作等价于 hash % length操作, 但&操作性能更优
static int indexFor(int h, int length) {
// length must be a non-zero power of 2
return h & (length-1);
}


//HashTable的散列函数直接在put方法里实现了
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
先用hash&0x7FFFFFFF后,再对length取模,&0x7FFFFFFF的目的是为了将负的hash值转化为正值,因为hash值有可能为负数,而&0x7FFFFFFF后,只有符号外改变,而后面的位都不变。




HashMap:
键值对所存放的数据结构其实是HashMap中定义的一个Entity内部类,数组来实现的,属性有key、value和指向下一个Entity的next。
[为什么一定是2的指数]

当容量一定是2^n时,h & (length - 1) == h % length,它俩是等价不等效的,位运算效率非常高
h:为插入元素的hash值,对hashCode又进行了一次计算
length:为map的容量大小
&:与操作 比如 1101 & 1011=1001

HashMap通过键的hashCode来快速的存取元素。
当不同的对象hashCode发生碰撞时,HashMap通过单链表来解决,将新元素加入链表表头,通过next指向原有的元素。
当哈希表中的条目数超出了加载因子与当前容量的乘积时,通过调用 rehash 方法将容量翻倍。
默认加载因子 (.75) 在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本
当HashMap存放的元素越来越多,到达临界值(阀值)threshold时,就要对Entry数组扩容,这是Java集合类框架最大的魅力,HashMap在扩容时,新数组的容量将是原来的2倍,由于容量发生变化,原有的每个元素需要重新计算bucketIndex,再存放到新数组中去,也就是所谓的rehash。HashMap默认初始容量16,加载因子0.75,也就是说最多能放16*0.75=12个元素,当put第13个时,HashMap将发生rehash,rehash的一系列处理比较影响性能,所以当我们需要向HashMap存放较多元素时,最好指定合适的初始容量和加载因子,否则HashMap默认只能存12个元素,将会发生多次rehash操作。
 
HashMap所有集合类视图所返回迭代器都是快速失败的(fail-fast)
那在多线程下使用HashMap我们需要怎么做,几种方案:
在外部包装HashMap,实现同步机制
使用Map m = Collections.synchronizedMap(new HashMap(...));,这里就是对HashMap做了一次包装
使用java.util.HashTable,效率最低
使用java.util.concurrent.ConcurrentHashMap,相对安全,效率较高


HashTable和ConCurrentHashMap的对比
ConcurrentHashMap是线程安全的HashMap的实现
HashTable里使用的是synchronized关键字,这其实是对对象加锁,锁住的都是对象整体,当Hashtable的大小增加到一定的时候,性能会急剧下降,因为迭代时需要被锁定很长的时间。
ConcurrentHashMap引入了分割(Segment),把一个大的Map拆分成N个小的HashTable,在put方法中,会根据hash(paramK.hashCode())来决定具体存放进哪个Segment,如果查看Segment的put操作,我们会发现内部使用的同步机制是基于lock操作的,这样就可以对Map的一部分(Segment)进行上锁,这样影响的只是将要放入同一个Segment的元素的put操作,保证同步的时候,锁住的不是整个Map(HashTable就是这么做的),相对于HashTable提高了多线程环境下的性能,因此HashTable已经被淘汰了。


HashMap和ConCurrentHashMap的对比


(1)ConcurrentHashMap对整个桶数组进行了分割分段(Segment),然后在每一个分段上都用lock锁进行保护,相对于HashTable的syn关键字锁的粒度更精细了一些,并发性能更好,而HashMap没有锁机制,不是线程安全的。
(2)HashMap的键值对允许有null,但是ConCurrentHashMap都不允许。

(9)多线程


(10)进程和线程区别


(11)spring配置文件里面,头文件xmlns
xml namespace:xml配置依赖的包,只不过它的包是个网址,它会自动获取。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值