面试记录
这是人生中又一选择的时刻,每次都是很艰难的,但是又毫无办法!开一篇博客记录一下,时刻提醒自己
2019年3月15日
今天面试了一家写jsp的小公司,面试官问了一些超级基础的问题。
1、怎样判断两个对象相等?
答:
应该先比较对象的哈希值,若相等再重写equals方法进行比较,若相等则对象相等,否则为对象不相等。
2、==和equals方法有什么区别?
答:
首先数据类型分为两类:
a)基础数据类型:byte,boolean,int,long,short,float,double,char;==符号在这种数据类型中是数值比较。
b)引用数据类型:接口,类,数组;==在该种数据类型中是地址比较。
c)object类拥有equals方法。只有String,Date,Double和Integer等对equals方法进行了重写;
d)object类中的equals方法的实现
public boolean equals(Object obj){
return(this == obj)
}
2019年3月18日
美好的周一,今天面试了两家公司,一个是乐精灵教育,一个是小鱼易连。问题如下:
1、聚集索引和非聚集索引的区别?
答:聚集索引,该索引中的键值的逻辑顺序决定了表中相应行的物理顺序;相当于字典的拼音检索列表,字的顺序是按照索引a-z的顺序物理排列的。一个表只能包含一个聚集索引,但索引可以包含多个列(组合索引)。
非聚集索引通过二叉树结构描述,叶子节点仍然是索引节点,有一个指针指向对应的数据块。
2、描述一下hashmap的结构,是否是线程安全的,key和value是否可以为null?
a)hashmap的结构
hash值一般是根据地址值计算出来的,一般不会冲突,但也会出现冲突的情况。
hashmap是一种数组链表结构,数组存储的为hash值,链表为map;
hashmap是基于哈希表的map接口实现;
其中key值允许为null但是只能有一个,,value可以有多个null,并且key不允许重复,如果重复则新值覆盖旧值。
hashmap是线程不安全的。why?因为hashmap的put操作,resize操作都不是同步的,ConcurrentHashMap该结构是线程安全的。
hashmap存入的顺序和遍历的顺序有可能是不一致的。why?
hashmap是散列映射,也就是它不会记录数据存储时的顺序,也就无法保证你取出时的顺序,为了解决这个问题,很简单采用LinkedHashMap或者是TreeMap即可,当然会造成一些额外开销,但并不影响什么。
hashmap保存数据的时候通过计算key的hash值来决定存储的位置。
3、volatile final Threadlocal 简述含义和作用?
volatile主要是用来在多线程中同步变量。
在一般情况下,为了提升性能,每个线程在运行时都会将主内存中的变量保存一份在自己的内存中作为变量副本,但是这样就很容易出现多个线程中保存的副本变量不一致,或与主内存的中的变量值不一致的情况。
而当一个变量被volatile修饰后,该变量就不能被缓存到线程的内存中 ,它会告诉编译器不要进行任何移出读取和写入操作的优化,换句话说就是不允许有不同于“主”内存区域的变量拷贝,所以当该变量有变化时,所有调用该变量的线程都会获得相同的值,这就确保了该变量在应用中的可视性(当一个任务做出了修改在应用中必须是可视的),同时性能也相应的降低了(还是比synchronized高)。
但需要注意volatile只能确保操作的是同一块内存,并不能保证操作的原子性。所以volatile一般用于声明简单类型变量,使得这些变量具有原子性,即一些简单的赋值与返回操作将被确保不中断。但是当该变量的值由自身的上一个决定时,volatile的作用就将失效,这是由volatile关键字的性质所决定的。
所以在volatile时一定要谨慎,千万不要以为用volatile修饰后该变量的所有操作都是原子操作,不再需要synchronized关键字了。
首先ThreadLocal和本地线程没有一毛钱关系,更不是一个特殊的Thread,它只是一个线程的局部变量(其实就是一个Map),ThreadLocal会为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。这样做其实就是以空间换时间的方式(与synchronized相反),以耗费内存为代价,单大大减少了线程同步(如synchronized)所带来性能消耗以及减少了线程并发控制的复杂度。
但需要注意的是,虽然ThreadLocal和Synchonized都用于解决多线程并发访问,ThreadLocal与synchronized还是有本质的区别。synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。而Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享。即Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。所以ThreadLocal并不能代替synchronized,Synchronized的功能范围更广(同步机制)。
synchronized关键字是Java利用锁的机制自动实现的,一般有同步方法和同步代码块两种使用方式。Java中所有的对象都自动含有单一的锁(也称为监视器),当在对象上调用其任意的synchronized方法时,此对象被加锁(一个任务可以多次获得对象的锁,计数会递增),同时在线程从该方法返回之前,该对象内其他所有要调用类中被标记为synchronized的方法的线程都会被阻塞。当然针对每个类也有一个锁(作为类的Class对象的一部分),所以你懂的.。
最后需要注意的是synchronized是同步机制中最安全的一种方式,其他的任何方式都是有风险的,当然付出的代价也是最大的。
final修饰符修饰类表示不能被继承;修饰方法表示不能被重写;修饰基础变量必须初始化,且只能发生一次,值不能变化;修饰引用类型表示,该引用类型的地址不能修改,但内容可以修改。
2019年6月18日
时间真的是白驹过隙。我已经工作一个多月了,目前在foxcoon;面试的时候说是做大数据BI平台的,结果进来写了1个多月的前端,而且居然不用框架,呵呵。记录下,早做准备跑路。